[in_app_purchase] Update Android to new analysis options (#4937)
diff --git a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
index ff0ce6e..a871cfa 100644
--- a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.2+2
+
+* Internal code cleanup for stricter analysis options.
+
## 0.2.2+1
* Removes the dependency on `meta`.
diff --git a/packages/in_app_purchase/in_app_purchase_android/analysis_options.yaml b/packages/in_app_purchase/in_app_purchase_android/analysis_options.yaml
deleted file mode 100644
index 5aeb4e7..0000000
--- a/packages/in_app_purchase/in_app_purchase_android/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../../analysis_options_legacy.yaml
diff --git a/packages/in_app_purchase/in_app_purchase_android/example/lib/consumable_store.dart b/packages/in_app_purchase/in_app_purchase_android/example/lib/consumable_store.dart
index 4d10a50..448efcf 100644
--- a/packages/in_app_purchase/in_app_purchase_android/example/lib/consumable_store.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/example/lib/consumable_store.dart
@@ -5,13 +5,14 @@
import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart';
+// ignore: avoid_classes_with_only_static_members
/// A store of consumable items.
///
/// This is a development prototype tha stores consumables in the shared
/// preferences. Do not use this in real world apps.
class ConsumableStore {
static const String _kPrefKey = 'consumables';
- static Future<void> _writes = Future.value();
+ static Future<void> _writes = Future<void>.value();
/// Adds a consumable with ID `id` to the store.
///
@@ -32,19 +33,19 @@
/// Returns the list of consumables from the store.
static Future<List<String>> load() async {
return (await SharedPreferences.getInstance()).getStringList(_kPrefKey) ??
- [];
+ <String>[];
}
static Future<void> _doSave(String id) async {
- List<String> cached = await load();
- SharedPreferences prefs = await SharedPreferences.getInstance();
+ final List<String> cached = await load();
+ final SharedPreferences prefs = await SharedPreferences.getInstance();
cached.add(id);
await prefs.setStringList(_kPrefKey, cached);
}
static Future<void> _doConsume(String id) async {
- List<String> cached = await load();
- SharedPreferences prefs = await SharedPreferences.getInstance();
+ final List<String> cached = await load();
+ final SharedPreferences prefs = await SharedPreferences.getInstance();
cached.remove(id);
await prefs.setStringList(_kPrefKey, cached);
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/example/lib/main.dart b/packages/in_app_purchase/in_app_purchase_android/example/lib/main.dart
index a53e9b3..939bc43 100644
--- a/packages/in_app_purchase/in_app_purchase_android/example/lib/main.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/example/lib/main.dart
@@ -44,10 +44,10 @@
final InAppPurchasePlatform _inAppPurchasePlatform =
InAppPurchasePlatform.instance;
late StreamSubscription<List<PurchaseDetails>> _subscription;
- List<String> _notFoundIds = [];
- List<ProductDetails> _products = [];
- List<PurchaseDetails> _purchases = [];
- List<String> _consumables = [];
+ List<String> _notFoundIds = <String>[];
+ List<ProductDetails> _products = <ProductDetails>[];
+ List<PurchaseDetails> _purchases = <PurchaseDetails>[];
+ List<String> _consumables = <String>[];
bool _isAvailable = false;
bool _purchasePending = false;
bool _loading = true;
@@ -57,11 +57,12 @@
void initState() {
final Stream<List<PurchaseDetails>> purchaseUpdated =
_inAppPurchasePlatform.purchaseStream;
- _subscription = purchaseUpdated.listen((purchaseDetailsList) {
+ _subscription =
+ purchaseUpdated.listen((List<PurchaseDetails> purchaseDetailsList) {
_listenToPurchaseUpdated(purchaseDetailsList);
}, onDone: () {
_subscription.cancel();
- }, onError: (error) {
+ }, onError: (Object error) {
// handle error here.
});
initStoreInfo();
@@ -73,26 +74,26 @@
if (!isAvailable) {
setState(() {
_isAvailable = isAvailable;
- _products = [];
- _purchases = [];
- _notFoundIds = [];
- _consumables = [];
+ _products = <ProductDetails>[];
+ _purchases = <PurchaseDetails>[];
+ _notFoundIds = <String>[];
+ _consumables = <String>[];
_purchasePending = false;
_loading = false;
});
return;
}
- ProductDetailsResponse productDetailResponse =
+ final ProductDetailsResponse productDetailResponse =
await _inAppPurchasePlatform.queryProductDetails(_kProductIds.toSet());
if (productDetailResponse.error != null) {
setState(() {
_queryProductError = productDetailResponse.error!.message;
_isAvailable = isAvailable;
_products = productDetailResponse.productDetails;
- _purchases = [];
+ _purchases = <PurchaseDetails>[];
_notFoundIds = productDetailResponse.notFoundIDs;
- _consumables = [];
+ _consumables = <String>[];
_purchasePending = false;
_loading = false;
});
@@ -104,9 +105,9 @@
_queryProductError = null;
_isAvailable = isAvailable;
_products = productDetailResponse.productDetails;
- _purchases = [];
+ _purchases = <PurchaseDetails>[];
_notFoundIds = productDetailResponse.notFoundIDs;
- _consumables = [];
+ _consumables = <String>[];
_purchasePending = false;
_loading = false;
});
@@ -115,7 +116,7 @@
await _inAppPurchasePlatform.restorePurchases();
- List<String> consumables = await ConsumableStore.load();
+ final List<String> consumables = await ConsumableStore.load();
setState(() {
_isAvailable = isAvailable;
_products = productDetailResponse.productDetails;
@@ -134,11 +135,11 @@
@override
Widget build(BuildContext context) {
- List<Widget> stack = [];
+ final List<Widget> stack = <Widget>[];
if (_queryProductError == null) {
stack.add(
ListView(
- children: [
+ children: <Widget>[
_buildConnectionCheckTile(),
_buildProductList(),
_buildConsumableBox(),
@@ -154,10 +155,10 @@
if (_purchasePending) {
stack.add(
Stack(
- children: [
+ children: const <Widget>[
Opacity(
opacity: 0.3,
- child: const ModalBarrier(dismissible: false, color: Colors.grey),
+ child: ModalBarrier(dismissible: false, color: Colors.grey),
),
Center(
child: CircularProgressIndicator(),
@@ -181,7 +182,7 @@
Card _buildConnectionCheckTile() {
if (_loading) {
- return Card(child: ListTile(title: const Text('Trying to connect...')));
+ return const Card(child: ListTile(title: Text('Trying to connect...')));
}
final Widget storeHeader = ListTile(
leading: Icon(_isAvailable ? Icons.check : Icons.block,
@@ -192,8 +193,8 @@
final List<Widget> children = <Widget>[storeHeader];
if (!_isAvailable) {
- children.addAll([
- Divider(),
+ children.addAll(<Widget>[
+ const Divider(),
ListTile(
title: Text('Not connected',
style: TextStyle(color: ThemeData.light().errorColor)),
@@ -207,29 +208,30 @@
Card _buildProductList() {
if (_loading) {
- return Card(
- child: (ListTile(
+ return const Card(
+ child: ListTile(
leading: CircularProgressIndicator(),
- title: Text('Fetching products...'))));
+ title: Text('Fetching products...')));
}
if (!_isAvailable) {
- return Card();
+ return const Card();
}
- final ListTile productHeader = ListTile(title: Text('Products for Sale'));
- List<ListTile> productList = <ListTile>[];
+ const ListTile productHeader = ListTile(title: Text('Products for Sale'));
+ final List<ListTile> productList = <ListTile>[];
if (_notFoundIds.isNotEmpty) {
productList.add(ListTile(
title: Text('[${_notFoundIds.join(", ")}] not found',
style: TextStyle(color: ThemeData.light().errorColor)),
- subtitle: Text(
+ subtitle: const Text(
'This app needs special configuration to run. Please see example/README.md for instructions.')));
}
// This loading previous purchases code is just a demo. Please do not use this as it is.
// In your app you should always verify the purchase data using the `verificationData` inside the [PurchaseDetails] object before trusting it.
// We recommend that you use your own server to verify the purchase data.
- Map<String, PurchaseDetails> purchases =
- Map.fromEntries(_purchases.map((PurchaseDetails purchase) {
+ final Map<String, PurchaseDetails> purchases =
+ Map<String, PurchaseDetails>.fromEntries(
+ _purchases.map((PurchaseDetails purchase) {
if (purchase.pendingCompletePurchase) {
_inAppPurchasePlatform.completePurchase(purchase);
}
@@ -237,7 +239,7 @@
}));
productList.addAll(_products.map(
(ProductDetails productDetails) {
- PurchaseDetails? previousPurchase = purchases[productDetails.id];
+ final PurchaseDetails? previousPurchase = purchases[productDetails.id];
return ListTile(
title: Text(
productDetails.title,
@@ -249,18 +251,18 @@
? IconButton(
onPressed: () {
final InAppPurchaseAndroidPlatformAddition addition =
- InAppPurchasePlatformAddition.instance
+ InAppPurchasePlatformAddition.instance!
as InAppPurchaseAndroidPlatformAddition;
- var skuDetails =
+ final SkuDetailsWrapper skuDetails =
(productDetails as GooglePlayProductDetails)
.skuDetails;
addition
.launchPriceChangeConfirmationFlow(
sku: skuDetails.sku)
- .then((value) => print(
- "confirmationResponse: ${value.responseCode}"));
+ .then((BillingResultWrapper value) => print(
+ 'confirmationResponse: ${value.responseCode}'));
},
- icon: Icon(Icons.upgrade))
+ icon: const Icon(Icons.upgrade))
: TextButton(
child: Text(productDetails.price),
style: TextButton.styleFrom(
@@ -272,10 +274,11 @@
// verify the latest status of you your subscription by using server side receipt validation
// and update the UI accordingly. The subscription purchase status shown
// inside the app may not be accurate.
- final oldSubscription = _getOldSubscription(
- productDetails as GooglePlayProductDetails,
- purchases);
- GooglePlayPurchaseParam purchaseParam =
+ final GooglePlayPurchaseDetails? oldSubscription =
+ _getOldSubscription(
+ productDetails as GooglePlayProductDetails,
+ purchases);
+ final GooglePlayPurchaseParam purchaseParam =
GooglePlayPurchaseParam(
productDetails: productDetails,
applicationUserName: null,
@@ -299,26 +302,26 @@
));
return Card(
- child:
- Column(children: <Widget>[productHeader, Divider()] + productList));
+ child: Column(
+ children: <Widget>[productHeader, const Divider()] + productList));
}
Card _buildConsumableBox() {
if (_loading) {
- return Card(
- child: (ListTile(
+ return const Card(
+ child: ListTile(
leading: CircularProgressIndicator(),
- title: Text('Fetching consumables...'))));
+ title: Text('Fetching consumables...')));
}
if (!_isAvailable || _notFoundIds.contains(_kConsumableId)) {
- return Card();
+ return const Card();
}
- final ListTile consumableHeader =
+ const ListTile consumableHeader =
ListTile(title: Text('Purchased consumables'));
final List<Widget> tokens = _consumables.map((String id) {
return GridTile(
child: IconButton(
- icon: Icon(
+ icon: const Icon(
Icons.stars,
size: 42.0,
color: Colors.orange,
@@ -331,12 +334,12 @@
return Card(
child: Column(children: <Widget>[
consumableHeader,
- Divider(),
+ const Divider(),
GridView.count(
crossAxisCount: 5,
children: tokens,
shrinkWrap: true,
- padding: EdgeInsets.all(16.0),
+ padding: const EdgeInsets.all(16.0),
)
]));
}
@@ -355,11 +358,11 @@
});
}
- void deliverProduct(PurchaseDetails purchaseDetails) async {
+ Future<void> deliverProduct(PurchaseDetails purchaseDetails) async {
// IMPORTANT!! Always verify purchase details before delivering the product.
if (purchaseDetails.productID == _kConsumableId) {
await ConsumableStore.save(purchaseDetails.purchaseID!);
- List<String> consumables = await ConsumableStore.load();
+ final List<String> consumables = await ConsumableStore.load();
setState(() {
_purchasePending = false;
_consumables = consumables;
@@ -388,8 +391,9 @@
// handle invalid purchase here if _verifyPurchase` failed.
}
- void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList) {
- purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
+ Future<void> _listenToPurchaseUpdated(
+ List<PurchaseDetails> purchaseDetailsList) async {
+ for (final PurchaseDetails purchaseDetails in purchaseDetailsList) {
if (purchaseDetails.status == PurchaseStatus.pending) {
showPendingUI();
} else {
@@ -397,7 +401,7 @@
handleError(purchaseDetails.error!);
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
- bool valid = await _verifyPurchase(purchaseDetails);
+ final bool valid = await _verifyPurchase(purchaseDetails);
if (valid) {
deliverProduct(purchaseDetails);
} else {
@@ -408,7 +412,7 @@
if (!_kAutoConsume && purchaseDetails.productID == _kConsumableId) {
final InAppPurchaseAndroidPlatformAddition addition =
- InAppPurchasePlatformAddition.instance
+ InAppPurchasePlatformAddition.instance!
as InAppPurchaseAndroidPlatformAddition;
await addition.consumePurchase(purchaseDetails);
@@ -418,7 +422,7 @@
await _inAppPurchasePlatform.completePurchase(purchaseDetails);
}
}
- });
+ }
}
GooglePlayPurchaseDetails? _getOldSubscription(
@@ -435,31 +439,31 @@
if (productDetails.id == _kSilverSubscriptionId &&
purchases[_kGoldSubscriptionId] != null) {
oldSubscription =
- purchases[_kGoldSubscriptionId] as GooglePlayPurchaseDetails;
+ purchases[_kGoldSubscriptionId]! as GooglePlayPurchaseDetails;
} else if (productDetails.id == _kGoldSubscriptionId &&
purchases[_kSilverSubscriptionId] != null) {
oldSubscription =
- purchases[_kSilverSubscriptionId] as GooglePlayPurchaseDetails;
+ purchases[_kSilverSubscriptionId]! as GooglePlayPurchaseDetails;
}
return oldSubscription;
}
}
class _FeatureCard extends StatelessWidget {
- final InAppPurchaseAndroidPlatformAddition addition =
- InAppPurchasePlatformAddition.instance
- as InAppPurchaseAndroidPlatformAddition;
-
_FeatureCard({Key? key}) : super(key: key);
+ final InAppPurchaseAndroidPlatformAddition addition =
+ InAppPurchasePlatformAddition.instance!
+ as InAppPurchaseAndroidPlatformAddition;
+
@override
Widget build(BuildContext context) {
return Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
- ListTile(title: Text('Available features')),
- Divider(),
+ const ListTile(title: Text('Available features')),
+ const Divider(),
for (BillingClientFeature feature in BillingClientFeature.values)
_buildFeatureWidget(feature),
]));
@@ -468,9 +472,9 @@
Widget _buildFeatureWidget(BillingClientFeature feature) {
return FutureBuilder<bool>(
future: addition.isFeatureSupported(feature),
- builder: (context, snapshot) {
+ builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
Color color = Colors.grey;
- bool? data = snapshot.data;
+ final bool? data = snapshot.data;
if (data != null) {
color = data ? Colors.green : Colors.red;
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml
index f272616..9c16efc 100644
--- a/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml
@@ -9,7 +9,6 @@
dependencies:
flutter:
sdk: flutter
- shared_preferences: ^2.0.0
in_app_purchase_android:
# When depending on this package from a real application you should use:
# in_app_purchase_android: ^x.y.z
@@ -17,15 +16,14 @@
# The example app is bundled with the plugin so we use a path dependency on
# the parent directory to use the current plugin's version.
path: ../
-
in_app_purchase_platform_interface: ^1.0.0
+ shared_preferences: ^2.0.0
dev_dependencies:
flutter_driver:
sdk: flutter
integration_test:
sdk: flutter
- pedantic: ^1.10.0
flutter:
uses-material-design: true
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
index 29441fb..416eb56 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/billing_client_wrapper.dart
@@ -38,7 +38,8 @@
///
/// Wraps a
/// [`PurchasesUpdatedListener`](https://developer.android.com/reference/com/android/billingclient/api/PurchasesUpdatedListener.html).
-typedef void PurchasesUpdatedListener(PurchasesResultWrapper purchasesResult);
+typedef PurchasesUpdatedListener = void Function(
+ PurchasesResultWrapper purchasesResult);
/// This class can be used directly instead of [InAppPurchaseConnection] to call
/// Play-specific billing APIs.
@@ -56,7 +57,9 @@
/// Creates a billing client.
BillingClient(PurchasesUpdatedListener onPurchasesUpdated) {
channel.setMethodCallHandler(callHandler);
- _callbacks[kOnPurchasesUpdated] = [onPurchasesUpdated];
+ _callbacks[kOnPurchasesUpdated] = <PurchasesUpdatedListener>[
+ onPurchasesUpdated
+ ];
}
// Occasionally methods in the native layer require a Dart callback to be
@@ -67,7 +70,7 @@
// matching callback here to remember, and then once its twin is triggered it
// sends the handle back over the platform channel. We then access that handle
// in this array and call it in Dart code. See also [_callHandler].
- Map<String, List<Function>> _callbacks = <String, List<Function>>{};
+ final Map<String, List<Function>> _callbacks = <String, List<Function>>{};
/// Calls
/// [`BillingClient#isReady()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#isReady())
@@ -101,12 +104,12 @@
Future<BillingResultWrapper> startConnection(
{required OnBillingServiceDisconnected
onBillingServiceDisconnected}) async {
- List<Function> disconnectCallbacks =
- _callbacks[_kOnBillingServiceDisconnected] ??= [];
+ final List<Function> disconnectCallbacks =
+ _callbacks[_kOnBillingServiceDisconnected] ??= <Function>[];
disconnectCallbacks.add(onBillingServiceDisconnected);
return BillingResultWrapper.fromJson((await channel
.invokeMapMethod<String, dynamic>(
- "BillingClient#startConnection(BillingClientStateListener)",
+ 'BillingClient#startConnection(BillingClientStateListener)',
<String, dynamic>{
'handle': disconnectCallbacks.length - 1,
})) ??
@@ -121,7 +124,7 @@
///
/// This triggers the destruction of the `BillingClient` instance in Java.
Future<void> endConnection() async {
- return channel.invokeMethod<void>("BillingClient#endConnection()", null);
+ return channel.invokeMethod<void>('BillingClient#endConnection()', null);
}
/// Returns a list of [SkuDetailsWrapper]s that have [SkuDetailsWrapper.sku]
@@ -136,7 +139,7 @@
Future<SkuDetailsResponseWrapper> querySkuDetails(
{required SkuType skuType, required List<String> skusList}) async {
final Map<String, dynamic> arguments = <String, dynamic>{
- 'skuType': SkuTypeConverter().toJson(skuType),
+ 'skuType': const SkuTypeConverter().toJson(skuType),
'skusList': skusList
};
return SkuDetailsResponseWrapper.fromJson((await channel.invokeMapMethod<
@@ -197,7 +200,7 @@
'obfuscatedProfileId': obfuscatedProfileId,
'oldSku': oldSku,
'purchaseToken': purchaseToken,
- 'prorationMode': ProrationModeConverter().toJson(prorationMode ??
+ 'prorationMode': const ProrationModeConverter().toJson(prorationMode ??
ProrationMode.unknownSubscriptionUpgradeDowngradePolicy)
};
return BillingResultWrapper.fromJson(
@@ -223,7 +226,7 @@
return PurchasesResultWrapper.fromJson((await channel
.invokeMapMethod<String, dynamic>(
'BillingClient#queryPurchases(String)', <String, dynamic>{
- 'skuType': SkuTypeConverter().toJson(skuType)
+ 'skuType': const SkuTypeConverter().toJson(skuType)
})) ??
<String, dynamic>{});
}
@@ -247,7 +250,7 @@
String, dynamic>(
'BillingClient#queryPurchaseHistoryAsync(String, PurchaseHistoryResponseListener)',
<String, dynamic>{
- 'skuType': SkuTypeConverter().toJson(skuType)
+ 'skuType': const SkuTypeConverter().toJson(skuType)
})) ??
<String, dynamic>{});
}
@@ -300,9 +303,9 @@
/// Checks if the specified feature or capability is supported by the Play Store.
/// Call this to check if a [BillingClientFeature] is supported by the device.
Future<bool> isFeatureSupported(BillingClientFeature feature) async {
- var result = await channel.invokeMethod<bool>(
+ final bool? result = await channel.invokeMethod<bool>(
'BillingClient#isFeatureSupported(String)', <String, dynamic>{
- 'feature': BillingClientFeatureConverter().toJson(feature),
+ 'feature': const BillingClientFeatureConverter().toJson(feature),
});
return result ?? false;
}
@@ -337,10 +340,10 @@
final PurchasesUpdatedListener listener =
_callbacks[kOnPurchasesUpdated]!.first as PurchasesUpdatedListener;
listener(PurchasesResultWrapper.fromJson(
- call.arguments.cast<String, dynamic>()));
+ (call.arguments as Map<dynamic, dynamic>).cast<String, dynamic>()));
break;
case _kOnBillingServiceDisconnected:
- final int handle = call.arguments['handle'];
+ final int handle = call.arguments['handle'] as int;
await _callbacks[_kOnBillingServiceDisconnected]![handle]();
break;
}
@@ -352,7 +355,7 @@
/// Wraps
/// [`com.android.billingclient.api.BillingClientStateListener.onServiceDisconnected()`](https://developer.android.com/reference/com/android/billingclient/api/BillingClientStateListener.html#onBillingServiceDisconnected())
/// to call back on `BillingClient` disconnect.
-typedef void OnBillingServiceDisconnected();
+typedef OnBillingServiceDisconnected = void Function();
/// Possible `BillingClient` response statuses.
///
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/purchase_wrapper.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/purchase_wrapper.dart
index 742288e..653e514 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/purchase_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/purchase_wrapper.dart
@@ -25,10 +25,11 @@
/// This wraps [`com.android.billlingclient.api.Purchase`](https://developer.android.com/reference/com/android/billingclient/api/Purchase)
@JsonSerializable()
@PurchaseStateConverter()
+@immutable
class PurchaseWrapper {
/// Creates a purchase wrapper with the given purchase details.
@visibleForTesting
- PurchaseWrapper({
+ const PurchaseWrapper({
required this.orderId,
required this.packageName,
required this.purchaseTime,
@@ -50,19 +51,23 @@
@override
bool operator ==(Object other) {
- if (identical(other, this)) return true;
- if (other.runtimeType != runtimeType) return false;
- final PurchaseWrapper typedOther = other as PurchaseWrapper;
- return typedOther.orderId == orderId &&
- typedOther.packageName == packageName &&
- typedOther.purchaseTime == purchaseTime &&
- typedOther.purchaseToken == purchaseToken &&
- typedOther.signature == signature &&
- typedOther.sku == sku &&
- typedOther.isAutoRenewing == isAutoRenewing &&
- typedOther.originalJson == originalJson &&
- typedOther.isAcknowledged == isAcknowledged &&
- typedOther.purchaseState == purchaseState;
+ if (identical(other, this)) {
+ return true;
+ }
+ if (other.runtimeType != runtimeType) {
+ return false;
+ }
+ return other is PurchaseWrapper &&
+ other.orderId == orderId &&
+ other.packageName == packageName &&
+ other.purchaseTime == purchaseTime &&
+ other.purchaseToken == purchaseToken &&
+ other.signature == signature &&
+ other.sku == sku &&
+ other.isAutoRenewing == isAutoRenewing &&
+ other.originalJson == originalJson &&
+ other.isAcknowledged == isAcknowledged &&
+ other.purchaseState == purchaseState;
}
@override
@@ -167,10 +172,11 @@
// We can optionally make [PurchaseWrapper] extend or implement [PurchaseHistoryRecordWrapper].
// For now, we keep them separated classes to be consistent with Android's BillingClient implementation.
@JsonSerializable()
+@immutable
class PurchaseHistoryRecordWrapper {
/// Creates a [PurchaseHistoryRecordWrapper] with the given record details.
@visibleForTesting
- PurchaseHistoryRecordWrapper({
+ const PurchaseHistoryRecordWrapper({
required this.purchaseTime,
required this.purchaseToken,
required this.signature,
@@ -216,16 +222,19 @@
@override
bool operator ==(Object other) {
- if (identical(other, this)) return true;
- if (other.runtimeType != runtimeType) return false;
- final PurchaseHistoryRecordWrapper typedOther =
- other as PurchaseHistoryRecordWrapper;
- return typedOther.purchaseTime == purchaseTime &&
- typedOther.purchaseToken == purchaseToken &&
- typedOther.signature == signature &&
- typedOther.sku == sku &&
- typedOther.originalJson == originalJson &&
- typedOther.developerPayload == developerPayload;
+ if (identical(other, this)) {
+ return true;
+ }
+ if (other.runtimeType != runtimeType) {
+ return false;
+ }
+ return other is PurchaseHistoryRecordWrapper &&
+ other.purchaseTime == purchaseTime &&
+ other.purchaseToken == purchaseToken &&
+ other.signature == signature &&
+ other.sku == sku &&
+ other.originalJson == originalJson &&
+ other.developerPayload == developerPayload;
}
@override
@@ -242,9 +251,10 @@
/// Wraps [`com.android.billingclient.api.Purchase.PurchasesResult`](https://developer.android.com/reference/com/android/billingclient/api/Purchase.PurchasesResult).
@JsonSerializable()
@BillingResponseConverter()
+@immutable
class PurchasesResultWrapper {
/// Creates a [PurchasesResultWrapper] with the given purchase result details.
- PurchasesResultWrapper(
+ const PurchasesResultWrapper(
{required this.responseCode,
required this.billingResult,
required this.purchasesList});
@@ -255,12 +265,16 @@
@override
bool operator ==(Object other) {
- if (identical(other, this)) return true;
- if (other.runtimeType != runtimeType) return false;
- final PurchasesResultWrapper typedOther = other as PurchasesResultWrapper;
- return typedOther.responseCode == responseCode &&
- typedOther.purchasesList == purchasesList &&
- typedOther.billingResult == billingResult;
+ if (identical(other, this)) {
+ return true;
+ }
+ if (other.runtimeType != runtimeType) {
+ return false;
+ }
+ return other is PurchasesResultWrapper &&
+ other.responseCode == responseCode &&
+ other.purchasesList == purchasesList &&
+ other.billingResult == billingResult;
}
@override
@@ -288,9 +302,10 @@
/// that contains a detailed description of the status.
@JsonSerializable()
@BillingResponseConverter()
+@immutable
class PurchasesHistoryResult {
/// Creates a [PurchasesHistoryResult] with the provided history.
- PurchasesHistoryResult(
+ const PurchasesHistoryResult(
{required this.billingResult, required this.purchaseHistoryRecordList});
/// Factory for creating a [PurchasesHistoryResult] from a [Map] with the history result details.
@@ -299,11 +314,15 @@
@override
bool operator ==(Object other) {
- if (identical(other, this)) return true;
- if (other.runtimeType != runtimeType) return false;
- final PurchasesHistoryResult typedOther = other as PurchasesHistoryResult;
- return typedOther.purchaseHistoryRecordList == purchaseHistoryRecordList &&
- typedOther.billingResult == billingResult;
+ if (identical(other, this)) {
+ return true;
+ }
+ if (other.runtimeType != runtimeType) {
+ return false;
+ }
+ return other is PurchasesHistoryResult &&
+ other.purchaseHistoryRecordList == purchaseHistoryRecordList &&
+ other.billingResult == billingResult;
}
@override
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/sku_details_wrapper.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/sku_details_wrapper.dart
index 8069a1f..53595c5 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/sku_details_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/billing_client_wrappers/sku_details_wrapper.dart
@@ -18,7 +18,7 @@
///
/// This usually indicates a series underlining code issue in the plugin.
@visibleForTesting
-const kInvalidBillingResultErrorMessage =
+const String kInvalidBillingResultErrorMessage =
'Invalid billing result map from method channel.';
/// Dart wrapper around [`com.android.billingclient.api.SkuDetails`](https://developer.android.com/reference/com/android/billingclient/api/SkuDetails).
@@ -26,10 +26,11 @@
/// Contains the details of an available product in Google Play Billing.
@JsonSerializable()
@SkuTypeConverter()
+@immutable
class SkuDetailsWrapper {
/// Creates a [SkuDetailsWrapper] with the given purchase details.
@visibleForTesting
- SkuDetailsWrapper({
+ const SkuDetailsWrapper({
required this.description,
required this.freeTrialPeriod,
required this.introductoryPrice,
@@ -50,8 +51,6 @@
required this.originalPriceAmountMicros,
}) : _introductoryPriceMicros = introductoryPriceMicros;
- final String _introductoryPriceMicros;
-
/// Constructs an instance of this from a key value map of data.
///
/// The map needs to have named string keys with values matching the names and
@@ -60,6 +59,8 @@
factory SkuDetailsWrapper.fromJson(Map<String, dynamic> map) =>
_$SkuDetailsWrapperFromJson(map);
+ final String _introductoryPriceMicros;
+
/// Textual description of the product.
@JsonKey(defaultValue: '')
final String description;
@@ -182,10 +183,11 @@
///
/// Returned by [BillingClient.querySkuDetails].
@JsonSerializable()
+@immutable
class SkuDetailsResponseWrapper {
/// Creates a [SkuDetailsResponseWrapper] with the given purchase details.
@visibleForTesting
- SkuDetailsResponseWrapper(
+ const SkuDetailsResponseWrapper(
{required this.billingResult, required this.skuDetailsList});
/// Constructs an instance of this from a key value map of data.
@@ -220,9 +222,10 @@
/// Params containing the response code and the debug message from the Play Billing API response.
@JsonSerializable()
@BillingResponseConverter()
+@immutable
class BillingResultWrapper {
/// Constructs the object with [responseCode] and [debugMessage].
- BillingResultWrapper({required this.responseCode, this.debugMessage});
+ const BillingResultWrapper({required this.responseCode, this.debugMessage});
/// Constructs an instance of this from a key value map of data.
///
@@ -230,7 +233,7 @@
/// types of all of the members on this class.
factory BillingResultWrapper.fromJson(Map<String, dynamic>? map) {
if (map == null || map.isEmpty) {
- return BillingResultWrapper(
+ return const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage);
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart
index 7c8ca52..61af756 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart
@@ -40,7 +40,8 @@
InAppPurchaseAndroidPlatformAddition(billingClient);
_readyFuture = _connect();
- _purchaseUpdatedController = StreamController.broadcast();
+ _purchaseUpdatedController =
+ StreamController<List<PurchaseDetails>>.broadcast();
}
/// Registers this class as the default instance of [InAppPurchasePlatform].
@@ -64,7 +65,7 @@
late final BillingClient billingClient;
late Future<void> _readyFuture;
- static Set<String> _productIdsToConsume = Set<String>();
+ static final Set<String> _productIdsToConsume = <String>{};
@override
Future<bool> isAvailable() async {
@@ -78,7 +79,7 @@
List<SkuDetailsResponseWrapper> responses;
PlatformException? exception;
try {
- responses = await Future.wait([
+ responses = await Future.wait(<Future<SkuDetailsResponseWrapper>>[
billingClient.querySkuDetails(
skuType: SkuType.inapp, skusList: identifiers.toList()),
billingClient.querySkuDetails(
@@ -86,30 +87,31 @@
]);
} on PlatformException catch (e) {
exception = e;
- responses = [
+ responses = <SkuDetailsResponseWrapper>[
// ignore: invalid_use_of_visible_for_testing_member
SkuDetailsResponseWrapper(
billingResult: BillingResultWrapper(
responseCode: BillingResponse.error, debugMessage: e.code),
- skuDetailsList: []),
+ skuDetailsList: const <SkuDetailsWrapper>[]),
// ignore: invalid_use_of_visible_for_testing_member
SkuDetailsResponseWrapper(
billingResult: BillingResultWrapper(
responseCode: BillingResponse.error, debugMessage: e.code),
- skuDetailsList: [])
+ skuDetailsList: const <SkuDetailsWrapper>[])
];
}
- List<ProductDetails> productDetailsList =
+ final List<ProductDetails> productDetailsList =
responses.expand((SkuDetailsResponseWrapper response) {
return response.skuDetailsList;
}).map((SkuDetailsWrapper skuDetailWrapper) {
return GooglePlayProductDetails.fromSkuDetails(skuDetailWrapper);
}).toList();
- Set<String> successIDS = productDetailsList
+ final Set<String> successIDS = productDetailsList
.map((ProductDetails productDetails) => productDetails.id)
.toSet();
- List<String> notFoundIDS = identifiers.difference(successIDS).toList();
+ final List<String> notFoundIDS =
+ identifiers.difference(successIDS).toList();
return ProductDetailsResponse(
productDetails: productDetailsList,
notFoundIDs: notFoundIDS,
@@ -130,7 +132,7 @@
changeSubscriptionParam = purchaseParam.changeSubscriptionParam;
}
- BillingResultWrapper billingResultWrapper =
+ final BillingResultWrapper billingResultWrapper =
await billingClient.launchBillingFlow(
sku: purchaseParam.productDetails.id,
accountId: purchaseParam.applicationUserName,
@@ -158,11 +160,11 @@
'On Android, the `purchase` should always be of type `GooglePlayPurchaseDetails`.',
);
- GooglePlayPurchaseDetails googlePurchase =
+ final GooglePlayPurchaseDetails googlePurchase =
purchase as GooglePlayPurchaseDetails;
if (googlePurchase.billingClientPurchase.isAcknowledged) {
- return BillingResultWrapper(responseCode: BillingResponse.ok);
+ return const BillingResultWrapper(responseCode: BillingResponse.ok);
}
if (googlePurchase.verificationData == null) {
@@ -180,22 +182,22 @@
}) async {
List<PurchasesResultWrapper> responses;
- responses = await Future.wait([
+ responses = await Future.wait(<Future<PurchasesResultWrapper>>[
billingClient.queryPurchases(SkuType.inapp),
billingClient.queryPurchases(SkuType.subs)
]);
- Set errorCodeSet = responses
+ final Set<String> errorCodeSet = responses
.where((PurchasesResultWrapper response) =>
response.responseCode != BillingResponse.ok)
.map((PurchasesResultWrapper response) =>
response.responseCode.toString())
.toSet();
- String errorMessage =
+ final String errorMessage =
errorCodeSet.isNotEmpty ? errorCodeSet.join(', ') : '';
- List<PurchaseDetails> pastPurchases =
+ final List<PurchaseDetails> pastPurchases =
responses.expand((PurchasesResultWrapper response) {
return response.purchasesList;
}).map((PurchaseWrapper purchaseWrapper) {
@@ -229,7 +231,7 @@
}
final BillingResultWrapper billingResult =
- await (InAppPurchasePlatformAddition.instance
+ await (InAppPurchasePlatformAddition.instance!
as InAppPurchaseAndroidPlatformAddition)
.consumePurchase(purchaseDetails);
final BillingResponse consumedResponse = billingResult.responseCode;
@@ -276,7 +278,7 @@
} else if (resultWrapper.responseCode == BillingResponse.ok) {
status = PurchaseStatus.purchased;
}
- return [
+ return <PurchaseDetails>[
PurchaseDetails(
purchaseID: '',
productID: '',
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart
index dd6fe37..9bcfc3d 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart
@@ -74,16 +74,16 @@
List<PurchasesResultWrapper> responses;
PlatformException? exception;
try {
- responses = await Future.wait([
+ responses = await Future.wait(<Future<PurchasesResultWrapper>>[
_billingClient.queryPurchases(SkuType.inapp),
_billingClient.queryPurchases(SkuType.subs)
]);
} on PlatformException catch (e) {
exception = e;
- responses = [
+ responses = <PurchasesResultWrapper>[
PurchasesResultWrapper(
responseCode: BillingResponse.error,
- purchasesList: [],
+ purchasesList: const <PurchaseWrapper>[],
billingResult: BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: e.details.toString(),
@@ -91,7 +91,7 @@
),
PurchasesResultWrapper(
responseCode: BillingResponse.error,
- purchasesList: [],
+ purchasesList: const <PurchaseWrapper>[],
billingResult: BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: e.details.toString(),
@@ -100,17 +100,17 @@
];
}
- Set errorCodeSet = responses
+ final Set<String> errorCodeSet = responses
.where((PurchasesResultWrapper response) =>
response.responseCode != BillingResponse.ok)
.map((PurchasesResultWrapper response) =>
response.responseCode.toString())
.toSet();
- String errorMessage =
+ final String errorMessage =
errorCodeSet.isNotEmpty ? errorCodeSet.join(', ') : '';
- List<GooglePlayPurchaseDetails> pastPurchases =
+ final List<GooglePlayPurchaseDetails> pastPurchases =
responses.expand((PurchasesResultWrapper response) {
return response.purchasesList;
}).map((PurchaseWrapper purchaseWrapper) {
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart
index 59d33fe..58fd34e 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart
@@ -29,10 +29,6 @@
currencySymbol: currencySymbol,
);
- /// Points back to the [SkuDetailsWrapper] object that was used to generate
- /// this [GooglePlayProductDetails] object.
- final SkuDetailsWrapper skuDetails;
-
/// Generate a [GooglePlayProductDetails] object based on an Android
/// [SkuDetailsWrapper] object.
factory GooglePlayProductDetails.fromSkuDetails(
@@ -49,4 +45,8 @@
skuDetails: skuDetails,
);
}
+
+ /// Points back to the [SkuDetailsWrapper] object that was used to generate
+ /// this [GooglePlayProductDetails] object.
+ final SkuDetailsWrapper skuDetails;
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_purchase_details.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_purchase_details.dart
index e607164..42c61a3 100644
--- a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_purchase_details.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_purchase_details.dart
@@ -25,13 +25,9 @@
verificationData: verificationData,
status: status,
) {
- this.pendingCompletePurchase = !billingClientPurchase.isAcknowledged;
+ pendingCompletePurchase = !billingClientPurchase.isAcknowledged;
}
- /// Points back to the [PurchaseWrapper] which was used to generate this
- /// [GooglePlayPurchaseDetails] object.
- final PurchaseWrapper billingClientPurchase;
-
/// Generate a [PurchaseDetails] object based on an Android [Purchase] object.
factory GooglePlayPurchaseDetails.fromPurchase(PurchaseWrapper purchase) {
final GooglePlayPurchaseDetails purchaseDetails = GooglePlayPurchaseDetails(
@@ -43,7 +39,8 @@
source: kIAPSource),
transactionDate: purchase.purchaseTime.toString(),
billingClientPurchase: purchase,
- status: PurchaseStateConverter().toPurchaseStatus(purchase.purchaseState),
+ status: const PurchaseStateConverter()
+ .toPurchaseStatus(purchase.purchaseState),
);
if (purchaseDetails.status == PurchaseStatus.error) {
@@ -56,4 +53,8 @@
return purchaseDetails;
}
+
+ /// Points back to the [PurchaseWrapper] which was used to generate this
+ /// [GooglePlayPurchaseDetails] object.
+ final PurchaseWrapper billingClientPurchase;
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
index 08e971a..0a667c6 100644
--- a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: An implementation for the Android platform of the Flutter `in_app_purchase` plugin. This uses the Android BillingClient APIs.
repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
-version: 0.2.2+1
+version: 0.2.2+2
environment:
sdk: ">=2.14.0 <3.0.0"
@@ -28,5 +28,4 @@
flutter_test:
sdk: flutter
json_serializable: ^6.0.0
- pedantic: ^1.10.0
test: ^1.16.0
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/billing_client_wrapper_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/billing_client_wrapper_test.dart
index ba6e755..1e30ce4 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/billing_client_wrapper_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/billing_client_wrapper_test.dart
@@ -40,7 +40,7 @@
// Make sure that the enum values are supported and that the converter call
// does not fail
test('response states', () async {
- BillingResponseConverter converter = BillingResponseConverter();
+ const BillingResponseConverter converter = BillingResponseConverter();
converter.fromJson(-3);
converter.fromJson(-2);
converter.fromJson(-1);
@@ -56,20 +56,20 @@
});
group('startConnection', () {
- final String methodName =
+ const String methodName =
'BillingClient#startConnection(BillingClientStateListener)';
test('returns BillingResultWrapper', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResponse responseCode = BillingResponse.developerError;
stubPlatform.addResponse(
name: methodName,
value: <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
);
- BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
expect(
await billingClient.startConnection(
@@ -79,11 +79,11 @@
test('passes handle to onBillingServiceDisconnected', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResponse responseCode = BillingResponse.developerError;
stubPlatform.addResponse(
name: methodName,
value: <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
);
@@ -101,14 +101,14 @@
expect(
await billingClient.startConnection(
onBillingServiceDisconnected: () {}),
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
});
});
test('endConnection', () async {
- final String endConnectionName = 'BillingClient#endConnection()';
+ const String endConnectionName = 'BillingClient#endConnection()';
expect(stubPlatform.countPreviousCalls(endConnectionName), equals(0));
stubPlatform.addResponse(name: endConnectionName, value: null);
await billingClient.endConnection();
@@ -116,15 +116,15 @@
});
group('querySkuDetails', () {
- final String queryMethodName =
+ const String queryMethodName =
'BillingClient#querySkuDetailsAsync(SkuDetailsParams, SkuDetailsResponseListener)';
test('handles empty skuDetails', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResponse responseCode = BillingResponse.developerError;
stubPlatform.addResponse(name: queryMethodName, value: <dynamic, dynamic>{
'billingResult': <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
'skuDetailsList': <Map<String, dynamic>>[]
@@ -134,7 +134,7 @@
.querySkuDetails(
skuType: SkuType.inapp, skusList: <String>['invalid']);
- BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
expect(response.billingResult, equals(billingResult));
expect(response.skuDetailsList, isEmpty);
@@ -142,10 +142,10 @@
test('returns SkuDetailsResponseWrapper', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
+ const BillingResponse responseCode = BillingResponse.ok;
stubPlatform.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
'skuDetailsList': <Map<String, dynamic>>[buildSkuMap(dummySkuDetails)]
@@ -155,7 +155,7 @@
.querySkuDetails(
skuType: SkuType.inapp, skusList: <String>['invalid']);
- BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
expect(response.billingResult, equals(billingResult));
expect(response.skuDetailsList, contains(dummySkuDetails));
@@ -168,7 +168,7 @@
.querySkuDetails(
skuType: SkuType.inapp, skusList: <String>['invalid']);
- BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage);
expect(response.billingResult, equals(billingResult));
@@ -177,21 +177,21 @@
});
group('launchBillingFlow', () {
- final String launchMethodName =
+ const String launchMethodName =
'BillingClient#launchBillingFlow(Activity, BillingFlowParams)';
test('serializes and deserializes data', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
- final String profileId = "hashedProfileId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
+ const String profileId = 'hashedProfileId';
expect(
await billingClient.launchBillingFlow(
@@ -199,8 +199,9 @@
accountId: accountId,
obfuscatedProfileId: profileId),
equals(expectedBillingResult));
- Map<dynamic, dynamic> arguments =
- stubPlatform.previousCallMatching(launchMethodName).arguments;
+ final Map<dynamic, dynamic> arguments = stubPlatform
+ .previousCallMatching(launchMethodName)
+ .arguments as Map<dynamic, dynamic>;
expect(arguments['sku'], equals(skuDetails.sku));
expect(arguments['accountId'], equals(accountId));
expect(arguments['obfuscatedProfileId'], equals(profileId));
@@ -210,16 +211,16 @@
'Change subscription throws assertion error `oldSku` and `purchaseToken` has different nullability',
() async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = 'hashedAccountId';
- final String profileId = 'hashedProfileId';
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
+ const String profileId = 'hashedProfileId';
expect(
billingClient.launchBillingFlow(
@@ -244,16 +245,16 @@
'serializes and deserializes data on change subscription without proration',
() async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = 'hashedAccountId';
- final String profileId = 'hashedProfileId';
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
+ const String profileId = 'hashedProfileId';
expect(
await billingClient.launchBillingFlow(
@@ -263,8 +264,9 @@
oldSku: dummyOldPurchase.sku,
purchaseToken: dummyOldPurchase.purchaseToken),
equals(expectedBillingResult));
- Map<dynamic, dynamic> arguments =
- stubPlatform.previousCallMatching(launchMethodName).arguments;
+ final Map<dynamic, dynamic> arguments = stubPlatform
+ .previousCallMatching(launchMethodName)
+ .arguments as Map<dynamic, dynamic>;
expect(arguments['sku'], equals(skuDetails.sku));
expect(arguments['accountId'], equals(accountId));
expect(arguments['oldSku'], equals(dummyOldPurchase.sku));
@@ -277,17 +279,18 @@
'serializes and deserializes data on change subscription with proration',
() async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = 'hashedAccountId';
- final String profileId = 'hashedProfileId';
- final prorationMode = ProrationMode.immediateAndChargeProratedPrice;
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
+ const String profileId = 'hashedProfileId';
+ const ProrationMode prorationMode =
+ ProrationMode.immediateAndChargeProratedPrice;
expect(
await billingClient.launchBillingFlow(
@@ -298,8 +301,9 @@
prorationMode: prorationMode,
purchaseToken: dummyOldPurchase.purchaseToken),
equals(expectedBillingResult));
- Map<dynamic, dynamic> arguments =
- stubPlatform.previousCallMatching(launchMethodName).arguments;
+ final Map<dynamic, dynamic> arguments = stubPlatform
+ .previousCallMatching(launchMethodName)
+ .arguments as Map<dynamic, dynamic>;
expect(arguments['sku'], equals(skuDetails.sku));
expect(arguments['accountId'], equals(accountId));
expect(arguments['oldSku'], equals(dummyOldPurchase.sku));
@@ -307,24 +311,25 @@
expect(
arguments['purchaseToken'], equals(dummyOldPurchase.purchaseToken));
expect(arguments['prorationMode'],
- ProrationModeConverter().toJson(prorationMode));
+ const ProrationModeConverter().toJson(prorationMode));
});
test('handles null accountId', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
expect(await billingClient.launchBillingFlow(sku: skuDetails.sku),
equals(expectedBillingResult));
- Map<dynamic, dynamic> arguments =
- stubPlatform.previousCallMatching(launchMethodName).arguments;
+ final Map<dynamic, dynamic> arguments = stubPlatform
+ .previousCallMatching(launchMethodName)
+ .arguments as Map<dynamic, dynamic>;
expect(arguments['sku'], equals(skuDetails.sku));
expect(arguments['accountId'], isNull);
});
@@ -334,10 +339,10 @@
name: launchMethodName,
value: null,
);
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
expect(
await billingClient.launchBillingFlow(sku: skuDetails.sku),
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
});
@@ -348,17 +353,17 @@
'BillingClient#queryPurchases(String)';
test('serializes and deserializes data', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
final List<PurchaseWrapper> expectedList = <PurchaseWrapper>[
dummyPurchase
];
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform
.addResponse(name: queryPurchasesMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(expectedCode),
+ 'responseCode': const BillingResponseConverter().toJson(expectedCode),
'purchasesList': expectedList
.map((PurchaseWrapper purchase) => buildPurchaseMap(purchase))
.toList(),
@@ -373,15 +378,15 @@
});
test('handles empty purchases', () async {
- final BillingResponse expectedCode = BillingResponse.userCanceled;
+ const BillingResponse expectedCode = BillingResponse.userCanceled;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform
.addResponse(name: queryPurchasesMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(expectedCode),
- 'purchasesList': [],
+ 'responseCode': const BillingResponseConverter().toJson(expectedCode),
+ 'purchasesList': <dynamic>[],
});
final PurchasesResultWrapper response =
@@ -402,7 +407,7 @@
expect(
response.billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
expect(response.responseCode, BillingResponse.error);
@@ -415,13 +420,13 @@
'BillingClient#queryPurchaseHistoryAsync(String, PurchaseHistoryResponseListener)';
test('serializes and deserializes data', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
final List<PurchaseHistoryRecordWrapper> expectedList =
<PurchaseHistoryRecordWrapper>[
dummyPurchaseHistoryRecord,
];
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: queryPurchaseHistoryMethodName,
@@ -440,14 +445,16 @@
});
test('handles empty purchases', () async {
- final BillingResponse expectedCode = BillingResponse.userCanceled;
+ const BillingResponse expectedCode = BillingResponse.userCanceled;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
- stubPlatform.addResponse(name: queryPurchaseHistoryMethodName, value: {
- 'billingResult': buildBillingResultMap(expectedBillingResult),
- 'purchaseHistoryRecordList': [],
- });
+ stubPlatform.addResponse(
+ name: queryPurchaseHistoryMethodName,
+ value: <dynamic, dynamic>{
+ 'billingResult': buildBillingResultMap(expectedBillingResult),
+ 'purchaseHistoryRecordList': <dynamic>[],
+ });
final PurchasesHistoryResult response =
await billingClient.queryPurchaseHistory(SkuType.inapp);
@@ -466,7 +473,7 @@
expect(
response.billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
expect(response.purchaseHistoryRecordList, isEmpty);
@@ -477,9 +484,9 @@
const String consumeMethodName =
'BillingClient#consumeAsync(String, ConsumeResponseListener)';
test('consume purchase async success', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
@@ -501,7 +508,7 @@
expect(
billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
});
@@ -511,9 +518,9 @@
const String acknowledgeMethodName =
'BillingClient#(AcknowledgePurchaseParams params, (AcknowledgePurchaseParams, AcknowledgePurchaseResponseListener)';
test('acknowledge purchase success', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: acknowledgeMethodName,
@@ -534,7 +541,7 @@
expect(
billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
});
@@ -548,7 +555,8 @@
stubPlatform.addResponse(
name: isFeatureSupportedMethodName,
value: false,
- additionalStepBeforeReturn: (value) => arguments = value,
+ additionalStepBeforeReturn: (dynamic value) =>
+ arguments = value as Map<dynamic, dynamic>,
);
final bool isSupported = await billingClient
.isFeatureSupported(BillingClientFeature.subscriptions);
@@ -561,7 +569,8 @@
stubPlatform.addResponse(
name: isFeatureSupportedMethodName,
value: true,
- additionalStepBeforeReturn: (value) => arguments = value,
+ additionalStepBeforeReturn: (dynamic value) =>
+ arguments = value as Map<dynamic, dynamic>,
);
final bool isSupported = await billingClient
.isFeatureSupported(BillingClientFeature.subscriptions);
@@ -574,7 +583,8 @@
const String launchPriceChangeConfirmationFlowMethodName =
'BillingClient#launchPriceChangeConfirmationFlow (Activity, PriceChangeFlowParams, PriceChangeConfirmationListener)';
- final expectedBillingResultPriceChangeConfirmation = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResultPriceChangeConfirmation =
+ BillingResultWrapper(
responseCode: BillingResponse.ok,
debugMessage: 'dummy message',
);
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/purchase_wrapper_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/purchase_wrapper_test.dart
index f513420..65c8bb2 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/purchase_wrapper_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/purchase_wrapper_test.dart
@@ -6,7 +6,7 @@
import 'package:in_app_purchase_android/in_app_purchase_android.dart';
import 'package:test/test.dart';
-final PurchaseWrapper dummyPurchase = PurchaseWrapper(
+const PurchaseWrapper dummyPurchase = PurchaseWrapper(
orderId: 'orderId',
packageName: 'packageName',
purchaseTime: 0,
@@ -22,7 +22,7 @@
obfuscatedProfileId: 'Profile103',
);
-final PurchaseWrapper dummyUnacknowledgedPurchase = PurchaseWrapper(
+const PurchaseWrapper dummyUnacknowledgedPurchase = PurchaseWrapper(
orderId: 'orderId',
packageName: 'packageName',
purchaseTime: 0,
@@ -36,7 +36,7 @@
purchaseState: PurchaseStateWrapper.purchased,
);
-final PurchaseHistoryRecordWrapper dummyPurchaseHistoryRecord =
+const PurchaseHistoryRecordWrapper dummyPurchaseHistoryRecord =
PurchaseHistoryRecordWrapper(
purchaseTime: 0,
signature: 'signature',
@@ -46,7 +46,7 @@
developerPayload: 'dummy payload',
);
-final PurchaseWrapper dummyOldPurchase = PurchaseWrapper(
+const PurchaseWrapper dummyOldPurchase = PurchaseWrapper(
orderId: 'oldOrderId',
packageName: 'oldPackageName',
purchaseTime: 0,
@@ -63,7 +63,7 @@
void main() {
group('PurchaseWrapper', () {
test('converts from map', () {
- final PurchaseWrapper expected = dummyPurchase;
+ const PurchaseWrapper expected = dummyPurchase;
final PurchaseWrapper parsed =
PurchaseWrapper.fromJson(buildPurchaseMap(expected));
@@ -109,7 +109,7 @@
group('PurchaseHistoryRecordWrapper', () {
test('converts from map', () {
- final PurchaseHistoryRecordWrapper expected = dummyPurchaseHistoryRecord;
+ const PurchaseHistoryRecordWrapper expected = dummyPurchaseHistoryRecord;
final PurchaseHistoryRecordWrapper parsed =
PurchaseHistoryRecordWrapper.fromJson(
buildPurchaseHistoryRecordMap(expected));
@@ -120,13 +120,13 @@
group('PurchasesResultWrapper', () {
test('parsed from map', () {
- final BillingResponse responseCode = BillingResponse.ok;
+ const BillingResponse responseCode = BillingResponse.ok;
final List<PurchaseWrapper> purchases = <PurchaseWrapper>[
dummyPurchase,
dummyPurchase
];
const String debugMessage = 'dummy Message';
- final BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
final PurchasesResultWrapper expected = PurchasesResultWrapper(
billingResult: billingResult,
@@ -135,7 +135,7 @@
final PurchasesResultWrapper parsed =
PurchasesResultWrapper.fromJson(<String, dynamic>{
'billingResult': buildBillingResultMap(billingResult),
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'purchasesList': <Map<String, dynamic>>[
buildPurchaseMap(dummyPurchase),
buildPurchaseMap(dummyPurchase)
@@ -148,10 +148,10 @@
test('parsed from empty map', () {
final PurchasesResultWrapper parsed =
- PurchasesResultWrapper.fromJson(<String, dynamic>{});
+ PurchasesResultWrapper.fromJson(const <String, dynamic>{});
expect(
parsed.billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
expect(parsed.responseCode, BillingResponse.error);
@@ -161,14 +161,14 @@
group('PurchasesHistoryResult', () {
test('parsed from map', () {
- final BillingResponse responseCode = BillingResponse.ok;
+ const BillingResponse responseCode = BillingResponse.ok;
final List<PurchaseHistoryRecordWrapper> purchaseHistoryRecordList =
<PurchaseHistoryRecordWrapper>[
dummyPurchaseHistoryRecord,
dummyPurchaseHistoryRecord
];
const String debugMessage = 'dummy Message';
- final BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
final PurchasesHistoryResult expected = PurchasesHistoryResult(
billingResult: billingResult,
@@ -188,10 +188,10 @@
test('parsed from empty map', () {
final PurchasesHistoryResult parsed =
- PurchasesHistoryResult.fromJson(<String, dynamic>{});
+ PurchasesHistoryResult.fromJson(const <String, dynamic>{});
expect(
parsed.billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
expect(parsed.purchaseHistoryRecordList, isEmpty);
@@ -210,7 +210,8 @@
'isAutoRenewing': original.isAutoRenewing,
'originalJson': original.originalJson,
'developerPayload': original.developerPayload,
- 'purchaseState': PurchaseStateConverter().toJson(original.purchaseState),
+ 'purchaseState':
+ const PurchaseStateConverter().toJson(original.purchaseState),
'isAcknowledged': original.isAcknowledged,
'obfuscatedAccountId': original.obfuscatedAccountId,
'obfuscatedProfileId': original.obfuscatedProfileId,
@@ -231,7 +232,8 @@
Map<String, dynamic> buildBillingResultMap(BillingResultWrapper original) {
return <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(original.responseCode),
+ 'responseCode':
+ const BillingResponseConverter().toJson(original.responseCode),
'debugMessage': original.debugMessage,
};
}
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_deprecated_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_deprecated_test.dart
index 3e29d92..f27ea02 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_deprecated_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_deprecated_test.dart
@@ -13,7 +13,7 @@
test(
'Deprecated `introductoryPriceMicros` field reflects parameter from constructor',
() {
- final SkuDetailsWrapper skuDetails = SkuDetailsWrapper(
+ const SkuDetailsWrapper skuDetails = SkuDetailsWrapper(
description: 'description',
freeTrialPeriod: 'freeTrialPeriod',
introductoryPrice: 'introductoryPrice',
@@ -42,7 +42,7 @@
test(
'`introductoryPriceAmoutMicros` constructor parameter is reflected by deprecated `introductoryPriceMicros` and `introductoryPriceAmountMicros` fields',
() {
- final SkuDetailsWrapper skuDetails = SkuDetailsWrapper(
+ const SkuDetailsWrapper skuDetails = SkuDetailsWrapper(
description: 'description',
freeTrialPeriod: 'freeTrialPeriod',
introductoryPrice: 'introductoryPrice',
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_test.dart
index 08cde07..ecc399b 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/billing_client_wrappers/sku_details_wrapper_test.dart
@@ -6,7 +6,7 @@
import 'package:in_app_purchase_android/src/types/google_play_product_details.dart';
import 'package:test/test.dart';
-final SkuDetailsWrapper dummySkuDetails = SkuDetailsWrapper(
+const SkuDetailsWrapper dummySkuDetails = SkuDetailsWrapper(
description: 'description',
freeTrialPeriod: 'freeTrialPeriod',
introductoryPrice: 'introductoryPrice',
@@ -28,7 +28,7 @@
void main() {
group('SkuDetailsWrapper', () {
test('converts from map', () {
- final SkuDetailsWrapper expected = dummySkuDetails;
+ const SkuDetailsWrapper expected = dummySkuDetails;
final SkuDetailsWrapper parsed =
SkuDetailsWrapper.fromJson(buildSkuMap(expected));
@@ -38,13 +38,13 @@
group('SkuDetailsResponseWrapper', () {
test('parsed from map', () {
- final BillingResponse responseCode = BillingResponse.ok;
+ const BillingResponse responseCode = BillingResponse.ok;
const String debugMessage = 'dummy message';
final List<SkuDetailsWrapper> skusDetails = <SkuDetailsWrapper>[
dummySkuDetails,
dummySkuDetails
];
- BillingResultWrapper result = BillingResultWrapper(
+ const BillingResultWrapper result = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
final SkuDetailsResponseWrapper expected = SkuDetailsResponseWrapper(
billingResult: result, skuDetailsList: skusDetails);
@@ -52,7 +52,7 @@
final SkuDetailsResponseWrapper parsed =
SkuDetailsResponseWrapper.fromJson(<String, dynamic>{
'billingResult': <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
'skuDetailsList': <Map<String, dynamic>>[
@@ -78,10 +78,10 @@
});
test('handles empty list of skuDetails', () {
- final BillingResponse responseCode = BillingResponse.error;
+ const BillingResponse responseCode = BillingResponse.error;
const String debugMessage = 'dummy message';
final List<SkuDetailsWrapper> skusDetails = <SkuDetailsWrapper>[];
- BillingResultWrapper billingResult = BillingResultWrapper(
+ const BillingResultWrapper billingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
final SkuDetailsResponseWrapper expected = SkuDetailsResponseWrapper(
billingResult: billingResult, skuDetailsList: skusDetails);
@@ -89,10 +89,10 @@
final SkuDetailsResponseWrapper parsed =
SkuDetailsResponseWrapper.fromJson(<String, dynamic>{
'billingResult': <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'debugMessage': debugMessage,
},
- 'skuDetailsList': <Map<String, dynamic>>[]
+ 'skuDetailsList': const <Map<String, dynamic>>[]
});
expect(parsed.billingResult, equals(expected.billingResult));
@@ -101,10 +101,10 @@
test('fromJson creates an object with default values', () {
final SkuDetailsResponseWrapper skuDetails =
- SkuDetailsResponseWrapper.fromJson(<String, dynamic>{});
+ SkuDetailsResponseWrapper.fromJson(const <String, dynamic>{});
expect(
skuDetails.billingResult,
- equals(BillingResultWrapper(
+ equals(const BillingResultWrapper(
responseCode: BillingResponse.error,
debugMessage: kInvalidBillingResultErrorMessage)));
expect(skuDetails.skuDetailsList, isEmpty);
@@ -114,7 +114,7 @@
group('BillingResultWrapper', () {
test('fromJson on empty map creates an object with default values', () {
final BillingResultWrapper billingResult =
- BillingResultWrapper.fromJson(<String, dynamic>{});
+ BillingResultWrapper.fromJson(const <String, dynamic>{});
expect(billingResult.debugMessage, kInvalidBillingResultErrorMessage);
expect(billingResult.responseCode, BillingResponse.error);
});
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_addition_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_addition_test.dart
index 112300d..9d2045b 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_addition_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_addition_test.dart
@@ -30,8 +30,8 @@
widgets.WidgetsFlutterBinding.ensureInitialized();
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: startConnectionCall,
@@ -45,9 +45,9 @@
const String consumeMethodName =
'BillingClient#consumeAsync(String, ConsumeResponseListener)';
test('consume purchase async success', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
@@ -66,14 +66,14 @@
const String queryMethodName = 'BillingClient#queryPurchases(String)';
test('handles error', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform
.addResponse(name: queryMethodName, value: <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'purchasesList': <Map<String, dynamic>>[]
});
final QueryPurchaseDetailsResponse response =
@@ -87,14 +87,14 @@
test('returns SkuDetailsResponseWrapper', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform
.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'purchasesList': <Map<String, dynamic>>[
buildPurchaseMap(dummyPurchase),
]
@@ -111,21 +111,22 @@
test('should store platform exception in the response', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: queryMethodName,
value: <dynamic, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode':
+ const BillingResponseConverter().toJson(responseCode),
'billingResult': buildBillingResultMap(expectedBillingResult),
'purchasesList': <Map<String, dynamic>>[]
},
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
throw PlatformException(
code: 'error_code',
message: 'error_message',
- details: {'info': 'error_info'},
+ details: <dynamic, dynamic>{'info': 'error_info'},
);
});
final QueryPurchaseDetailsResponse response =
@@ -134,7 +135,8 @@
expect(response.error, isNotNull);
expect(response.error!.code, 'error_code');
expect(response.error!.message, 'error_message');
- expect(response.error!.details, {'info': 'error_info'});
+ expect(
+ response.error!.details, <String, dynamic>{'info': 'error_info'});
});
});
});
@@ -147,7 +149,8 @@
stubPlatform.addResponse(
name: isFeatureSupportedMethodName,
value: false,
- additionalStepBeforeReturn: (value) => arguments = value,
+ additionalStepBeforeReturn: (dynamic value) =>
+ arguments = value as Map<dynamic, dynamic>,
);
final bool isSupported = await iapAndroidPlatformAddition
.isFeatureSupported(BillingClientFeature.subscriptions);
@@ -160,7 +163,8 @@
stubPlatform.addResponse(
name: isFeatureSupportedMethodName,
value: true,
- additionalStepBeforeReturn: (value) => arguments = value,
+ additionalStepBeforeReturn: (dynamic value) =>
+ arguments = value as Map<dynamic, dynamic>,
);
final bool isSupported = await iapAndroidPlatformAddition
.isFeatureSupported(BillingClientFeature.subscriptions);
@@ -172,9 +176,10 @@
group('launchPriceChangeConfirmationFlow', () {
const String launchPriceChangeConfirmationFlowMethodName =
'BillingClient#launchPriceChangeConfirmationFlow (Activity, PriceChangeFlowParams, PriceChangeConfirmationListener)';
- const dummySku = 'sku';
+ const String dummySku = 'sku';
- final expectedBillingResultPriceChangeConfirmation = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResultPriceChangeConfirmation =
+ BillingResultWrapper(
responseCode: BillingResponse.ok,
debugMessage: 'dummy message',
);
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
index 9c167e5..b19d631 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/in_app_purchase_android_platform_test.dart
@@ -33,8 +33,8 @@
widgets.WidgetsFlutterBinding.ensureInitialized();
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: startConnectionCall,
@@ -70,28 +70,28 @@
});
group('querySkuDetails', () {
- final String queryMethodName =
+ const String queryMethodName =
'BillingClient#querySkuDetailsAsync(SkuDetailsParams, SkuDetailsResponseListener)';
test('handles empty skuDetails', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'skuDetailsList': [],
+ 'skuDetailsList': <Map<String, dynamic>>[],
});
final ProductDetailsResponse response =
- await iapAndroidPlatform.queryProductDetails(<String>[''].toSet());
+ await iapAndroidPlatform.queryProductDetails(<String>{''});
expect(response.productDetails, isEmpty);
});
test('should get correct product details', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
@@ -99,8 +99,8 @@
});
// Since queryProductDetails makes 2 platform method calls (one for each SkuType), the result will contain 2 dummyWrapper instead
// of 1.
- final ProductDetailsResponse response = await iapAndroidPlatform
- .queryProductDetails(<String>['valid'].toSet());
+ final ProductDetailsResponse response =
+ await iapAndroidPlatform.queryProductDetails(<String>{'valid'});
expect(response.productDetails.first.title, dummySkuDetails.title);
expect(response.productDetails.first.description,
dummySkuDetails.description);
@@ -110,8 +110,8 @@
test('should get the correct notFoundIDs', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
@@ -119,41 +119,42 @@
});
// Since queryProductDetails makes 2 platform method calls (one for each SkuType), the result will contain 2 dummyWrapper instead
// of 1.
- final ProductDetailsResponse response = await iapAndroidPlatform
- .queryProductDetails(<String>['invalid'].toSet());
+ final ProductDetailsResponse response =
+ await iapAndroidPlatform.queryProductDetails(<String>{'invalid'});
expect(response.notFoundIDs.first, 'invalid');
});
test(
'should have error stored in the response when platform exception is thrown',
() async {
- final BillingResponse responseCode = BillingResponse.ok;
+ const BillingResponse responseCode = BillingResponse.ok;
stubPlatform.addResponse(
name: queryMethodName,
value: <String, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode':
+ const BillingResponseConverter().toJson(responseCode),
'skuDetailsList': <Map<String, dynamic>>[
buildSkuMap(dummySkuDetails)
]
},
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
throw PlatformException(
code: 'error_code',
message: 'error_message',
- details: {'info': 'error_info'},
+ details: <dynamic, dynamic>{'info': 'error_info'},
);
});
// Since queryProductDetails makes 2 platform method calls (one for each SkuType), the result will contain 2 dummyWrapper instead
// of 1.
- final ProductDetailsResponse response = await iapAndroidPlatform
- .queryProductDetails(<String>['invalid'].toSet());
- expect(response.notFoundIDs, ['invalid']);
+ final ProductDetailsResponse response =
+ await iapAndroidPlatform.queryProductDetails(<String>{'invalid'});
+ expect(response.notFoundIDs, <String>['invalid']);
expect(response.productDetails, isEmpty);
expect(response.error, isNotNull);
expect(response.error!.source, kIAPSource);
expect(response.error!.code, 'error_code');
expect(response.error!.message, 'error_message');
- expect(response.error!.details, {'info': 'error_info'});
+ expect(response.error!.details, <String, dynamic>{'info': 'error_info'});
});
});
@@ -161,13 +162,13 @@
const String queryMethodName = 'BillingClient#queryPurchases(String)';
test('handles error', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(name: queryMethodName, value: <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'purchasesList': <Map<String, dynamic>>[]
});
@@ -175,9 +176,12 @@
iapAndroidPlatform.restorePurchases(),
throwsA(
isA<InAppPurchaseException>()
- .having((e) => e.source, 'source', kIAPSource)
- .having((e) => e.code, 'code', kRestoredPurchaseErrorCode)
- .having((e) => e.message, 'message', responseCode.toString()),
+ .having(
+ (InAppPurchaseException e) => e.source, 'source', kIAPSource)
+ .having((InAppPurchaseException e) => e.code, 'code',
+ kRestoredPurchaseErrorCode)
+ .having((InAppPurchaseException e) => e.message, 'message',
+ responseCode.toString()),
),
);
});
@@ -185,21 +189,22 @@
test('should store platform exception in the response', () async {
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: queryMethodName,
value: <dynamic, dynamic>{
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode':
+ const BillingResponseConverter().toJson(responseCode),
'billingResult': buildBillingResultMap(expectedBillingResult),
'purchasesList': <Map<String, dynamic>>[]
},
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
throw PlatformException(
code: 'error_code',
message: 'error_message',
- details: {'info': 'error_info'},
+ details: <dynamic, dynamic>{'info': 'error_info'},
);
});
@@ -207,19 +212,23 @@
iapAndroidPlatform.restorePurchases(),
throwsA(
isA<PlatformException>()
- .having((e) => e.code, 'code', 'error_code')
- .having((e) => e.message, 'message', 'error_message')
- .having((e) => e.details, 'details', {'info': 'error_info'}),
+ .having((PlatformException e) => e.code, 'code', 'error_code')
+ .having((PlatformException e) => e.message, 'message',
+ 'error_message')
+ .having((PlatformException e) => e.details, 'details',
+ <String, dynamic>{'info': 'error_info'}),
),
);
});
test('returns SkuDetailsResponseWrapper', () async {
- Completer completer = Completer();
- Stream<List<PurchaseDetails>> stream = iapAndroidPlatform.purchaseStream;
+ final Completer<List<PurchaseDetails>> completer =
+ Completer<List<PurchaseDetails>>();
+ final Stream<List<PurchaseDetails>> stream =
+ iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
- subscription = stream.listen((purchaseDetailsList) {
+ late StreamSubscription<List<PurchaseDetails>> subscription;
+ subscription = stream.listen((List<PurchaseDetails> purchaseDetailsList) {
if (purchaseDetailsList.first.status == PurchaseStatus.restored) {
completer.complete(purchaseDetailsList);
subscription.cancel();
@@ -227,13 +236,13 @@
});
const String debugMessage = 'dummy message';
- final BillingResponse responseCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse responseCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: responseCode, debugMessage: debugMessage);
stubPlatform.addResponse(name: queryMethodName, value: <String, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(responseCode),
+ 'responseCode': const BillingResponseConverter().toJson(responseCode),
'purchasesList': <Map<String, dynamic>>[
buildPurchaseMap(dummyPurchase),
]
@@ -246,8 +255,8 @@
final List<PurchaseDetails> restoredPurchases = await completer.future;
expect(restoredPurchases.length, 2);
- restoredPurchases.forEach((element) {
- GooglePlayPurchaseDetails purchase =
+ for (final PurchaseDetails element in restoredPurchases) {
+ final GooglePlayPurchaseDetails purchase =
element as GooglePlayPurchaseDetails;
expect(purchase.productID, dummyPurchase.sku);
@@ -260,40 +269,41 @@
expect(purchase.transactionDate, dummyPurchase.purchaseTime.toString());
expect(purchase.billingClientPurchase, dummyPurchase);
expect(purchase.status, PurchaseStatus.restored);
- });
+ }
});
});
group('make payment', () {
- final String launchMethodName =
+ const String launchMethodName =
'BillingClient#launchBillingFlow(Activity, BillingFlowParams)';
const String consumeMethodName =
'BillingClient#consumeAsync(String, ConsumeResponseListener)';
test('buy non consumable, serializes and deserializes data', () async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': [
- {
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': <dynamic>[
+ <dynamic, dynamic>{
'orderId': 'orderID1',
'sku': skuDetails.sku,
'isAutoRenewing': false,
- 'packageName': "package",
+ 'packageName': 'package',
'purchaseTime': 1231231231,
- 'purchaseToken': "token",
+ 'purchaseToken': 'token',
'signature': 'sign',
'originalJson': 'json',
'developerPayload': 'dummy payload',
@@ -304,10 +314,11 @@
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -319,7 +330,7 @@
final bool launchResult = await iapAndroidPlatform.buyNonConsumable(
purchaseParam: purchaseParam);
- PurchaseDetails result = await completer.future;
+ final PurchaseDetails result = await completer.future;
expect(launchResult, isTrue);
expect(result.purchaseID, 'orderID1');
expect(result.status, PurchaseStatus.purchased);
@@ -327,29 +338,31 @@
});
test('handles an error with an empty purchases list', () async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.error;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.error;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': []
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': const <dynamic>[]
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -359,7 +372,7 @@
productDetails: GooglePlayProductDetails.fromSkuDetails(skuDetails),
applicationUserName: accountId);
await iapAndroidPlatform.buyNonConsumable(purchaseParam: purchaseParam);
- PurchaseDetails result = await completer.future;
+ final PurchaseDetails result = await completer.future;
expect(result.error, isNotNull);
expect(result.error!.source, kIAPSource);
@@ -369,29 +382,30 @@
test('buy consumable with auto consume, serializes and deserializes data',
() async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': [
- {
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': <dynamic>[
+ <dynamic, dynamic>{
'orderId': 'orderID1',
'sku': skuDetails.sku,
'isAutoRenewing': false,
- 'packageName': "package",
+ 'packageName': 'package',
'purchaseTime': 1231231231,
- 'purchaseToken': "token",
+ 'purchaseToken': 'token',
'signature': 'sign',
'originalJson': 'json',
'developerPayload': 'dummy payload',
@@ -402,24 +416,25 @@
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer consumeCompleter = Completer();
+ final Completer<String> consumeCompleter = Completer<String>();
// adding call back for consume purchase
- final BillingResponse expectedCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResultForConsume =
+ const BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResultForConsume =
BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- String purchaseToken = args['purchaseToken'];
- consumeCompleter.complete((purchaseToken));
+ final String purchaseToken = args['purchaseToken'] as String;
+ consumeCompleter.complete(purchaseToken);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -432,7 +447,8 @@
await iapAndroidPlatform.buyConsumable(purchaseParam: purchaseParam);
// Verify that the result has succeeded
- GooglePlayPurchaseDetails result = await completer.future;
+ final GooglePlayPurchaseDetails result =
+ await completer.future as GooglePlayPurchaseDetails;
expect(launchResult, isTrue);
expect(result.billingClientPurchase, isNotNull);
expect(result.billingClientPurchase.purchaseToken,
@@ -444,8 +460,8 @@
test('buyNonConsumable propagates failures to launch the billing flow',
() async {
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.error;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.error;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
@@ -463,8 +479,8 @@
test('buyConsumable propagates failures to launch the billing flow',
() async {
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
@@ -481,28 +497,29 @@
});
test('adds consumption failures to PurchaseDetails objects', () async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': [
- {
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': <dynamic>[
+ <dynamic, dynamic>{
'orderId': 'orderID1',
'sku': skuDetails.sku,
'isAutoRenewing': false,
- 'packageName': "package",
+ 'packageName': 'package',
'purchaseTime': 1231231231,
- 'purchaseToken': "token",
+ 'purchaseToken': 'token',
'signature': 'sign',
'originalJson': 'json',
'developerPayload': 'dummy payload',
@@ -513,24 +530,25 @@
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer consumeCompleter = Completer();
+ final Completer<String> consumeCompleter = Completer<String>();
// adding call back for consume purchase
- final BillingResponse expectedCode = BillingResponse.error;
- final BillingResultWrapper expectedBillingResultForConsume =
+ const BillingResponse expectedCode = BillingResponse.error;
+ const BillingResultWrapper expectedBillingResultForConsume =
BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- String purchaseToken = args['purchaseToken'];
+ final String purchaseToken = args['purchaseToken'] as String;
consumeCompleter.complete(purchaseToken);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -542,7 +560,8 @@
await iapAndroidPlatform.buyConsumable(purchaseParam: purchaseParam);
// Verify that the result has an error for the failed consumption
- GooglePlayPurchaseDetails result = await completer.future;
+ final GooglePlayPurchaseDetails result =
+ await completer.future as GooglePlayPurchaseDetails;
expect(result.billingClientPurchase, isNotNull);
expect(result.billingClientPurchase.purchaseToken,
await consumeCompleter.future);
@@ -554,29 +573,30 @@
test(
'buy consumable without auto consume, consume api should not receive calls',
() async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.developerError;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.developerError;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': [
- {
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': <dynamic>[
+ <dynamic, dynamic>{
'orderId': 'orderID1',
'sku': skuDetails.sku,
'isAutoRenewing': false,
- 'packageName': "package",
+ 'packageName': 'package',
'purchaseTime': 1231231231,
- 'purchaseToken': "token",
+ 'purchaseToken': 'token',
'signature': 'sign',
'originalJson': 'json',
'developerPayload': 'dummy payload',
@@ -587,22 +607,23 @@
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer consumeCompleter = Completer();
+ final Completer<String?> consumeCompleter = Completer<String?>();
// adding call back for consume purchase
- final BillingResponse expectedCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResultForConsume =
+ const BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResultForConsume =
BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- String purchaseToken = args['purchaseToken'];
- consumeCompleter.complete((purchaseToken));
+ final String purchaseToken = args['purchaseToken'] as String;
+ consumeCompleter.complete(purchaseToken);
});
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
consumeCompleter.complete(null);
subscription.cancel();
@@ -618,28 +639,29 @@
test(
'should get canceled purchase status when response code is BillingResponse.userCanceled',
() async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.userCanceled;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.userCanceled;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': [
- {
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': <dynamic>[
+ <dynamic, dynamic>{
'orderId': 'orderID1',
'sku': skuDetails.sku,
'isAutoRenewing': false,
- 'packageName': "package",
+ 'packageName': 'package',
'purchaseTime': 1231231231,
- 'purchaseToken': "token",
+ 'purchaseToken': 'token',
'signature': 'sign',
'originalJson': 'json',
'developerPayload': 'dummy payload',
@@ -650,24 +672,25 @@
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer consumeCompleter = Completer();
+ final Completer<String> consumeCompleter = Completer<String>();
// adding call back for consume purchase
- final BillingResponse expectedCode = BillingResponse.userCanceled;
- final BillingResultWrapper expectedBillingResultForConsume =
+ const BillingResponse expectedCode = BillingResponse.userCanceled;
+ const BillingResultWrapper expectedBillingResultForConsume =
BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: consumeMethodName,
value: buildBillingResultMap(expectedBillingResultForConsume),
additionalStepBeforeReturn: (dynamic args) {
- String purchaseToken = args['purchaseToken'];
+ final String purchaseToken = args['purchaseToken'] as String;
consumeCompleter.complete(purchaseToken);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -679,36 +702,39 @@
await iapAndroidPlatform.buyConsumable(purchaseParam: purchaseParam);
// Verify that the result has an error for the failed consumption
- GooglePlayPurchaseDetails result = await completer.future;
+ final GooglePlayPurchaseDetails result =
+ await completer.future as GooglePlayPurchaseDetails;
expect(result.status, PurchaseStatus.canceled);
});
test(
'should get purchased purchase status when upgrading subscription by deferred proration mode',
() async {
- final SkuDetailsWrapper skuDetails = dummySkuDetails;
- final String accountId = "hashedAccountId";
+ const SkuDetailsWrapper skuDetails = dummySkuDetails;
+ const String accountId = 'hashedAccountId';
const String debugMessage = 'dummy message';
- final BillingResponse sentCode = BillingResponse.ok;
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResponse sentCode = BillingResponse.ok;
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: sentCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: launchMethodName,
value: buildBillingResultMap(expectedBillingResult),
- additionalStepBeforeReturn: (_) {
+ additionalStepBeforeReturn: (dynamic _) {
// Mock java update purchase callback.
- MethodCall call = MethodCall(kOnPurchasesUpdated, {
+ final MethodCall call =
+ MethodCall(kOnPurchasesUpdated, <dynamic, dynamic>{
'billingResult': buildBillingResultMap(expectedBillingResult),
- 'responseCode': BillingResponseConverter().toJson(sentCode),
- 'purchasesList': []
+ 'responseCode': const BillingResponseConverter().toJson(sentCode),
+ 'purchasesList': const <dynamic>[]
});
iapAndroidPlatform.billingClient.callHandler(call);
});
- Completer completer = Completer();
+ final Completer<PurchaseDetails> completer = Completer<PurchaseDetails>();
PurchaseDetails purchaseDetails;
- Stream purchaseStream = iapAndroidPlatform.purchaseStream;
- late StreamSubscription subscription;
+ final Stream<List<PurchaseDetails>> purchaseStream =
+ iapAndroidPlatform.purchaseStream;
+ late StreamSubscription<List<PurchaseDetails>> subscription;
subscription = purchaseStream.listen((_) {
purchaseDetails = _.first;
completer.complete(purchaseDetails);
@@ -724,7 +750,7 @@
));
await iapAndroidPlatform.buyNonConsumable(purchaseParam: purchaseParam);
- PurchaseDetails result = await completer.future;
+ final PurchaseDetails result = await completer.future;
expect(result.status, PurchaseStatus.purchased);
});
});
@@ -733,17 +759,18 @@
const String completeMethodName =
'BillingClient#(AcknowledgePurchaseParams params, (AcknowledgePurchaseParams, AcknowledgePurchaseResponseListener)';
test('complete purchase success', () async {
- final BillingResponse expectedCode = BillingResponse.ok;
+ const BillingResponse expectedCode = BillingResponse.ok;
const String debugMessage = 'dummy message';
- final BillingResultWrapper expectedBillingResult = BillingResultWrapper(
+ const BillingResultWrapper expectedBillingResult = BillingResultWrapper(
responseCode: expectedCode, debugMessage: debugMessage);
stubPlatform.addResponse(
name: completeMethodName,
value: buildBillingResultMap(expectedBillingResult),
);
- PurchaseDetails purchaseDetails =
+ final PurchaseDetails purchaseDetails =
GooglePlayPurchaseDetails.fromPurchase(dummyUnacknowledgedPurchase);
- Completer completer = Completer();
+ final Completer<BillingResultWrapper> completer =
+ Completer<BillingResultWrapper>();
purchaseDetails.status = PurchaseStatus.purchased;
if (purchaseDetails.pendingCompletePurchase) {
final BillingResultWrapper billingResultWrapper =
diff --git a/packages/in_app_purchase/in_app_purchase_android/test/stub_in_app_purchase_platform.dart b/packages/in_app_purchase/in_app_purchase_android/test/stub_in_app_purchase_platform.dart
index 11a3426..75972e6 100644
--- a/packages/in_app_purchase/in_app_purchase_android/test/stub_in_app_purchase_platform.dart
+++ b/packages/in_app_purchase/in_app_purchase_android/test/stub_in_app_purchase_platform.dart
@@ -5,11 +5,12 @@
import 'dart:async';
import 'package:flutter/services.dart';
-typedef void AdditionalSteps(dynamic args);
+typedef AdditionalSteps = void Function(dynamic args);
class StubInAppPurchasePlatform {
- Map<String, dynamic> _expectedCalls = <String, dynamic>{};
- Map<String, AdditionalSteps?> _additionalSteps = <String, AdditionalSteps?>{};
+ final Map<String, dynamic> _expectedCalls = <String, dynamic>{};
+ final Map<String, AdditionalSteps?> _additionalSteps =
+ <String, AdditionalSteps?>{};
void addResponse(
{required String name,
dynamic value,
@@ -18,7 +19,7 @@
_expectedCalls[name] = value;
}
- List<MethodCall> _previousCalls = <MethodCall>[];
+ final List<MethodCall> _previousCalls = <MethodCall>[];
List<MethodCall> get previousCalls => _previousCalls;
MethodCall previousCallMatching(String name) =>
_previousCalls.firstWhere((MethodCall call) => call.method == name);
diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml
index 2c87f48..89d061f 100644
--- a/script/configs/custom_analysis.yaml
+++ b/script/configs/custom_analysis.yaml
@@ -15,4 +15,3 @@
- google_maps_flutter/google_maps_flutter_platform_interface
- google_maps_flutter/google_maps_flutter_web
- in_app_purchase/in_app_purchase
-- in_app_purchase/in_app_purchase_android