[in_app_purchase]IAP/platform interface add cancel status (#4093)

diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md
index cd4b86d..e01f527 100644
--- a/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.3.0
+
+* Added new `PurchaseStatus` named `canceled` to distinguish between an error and user cancellation. 
+
 ## 1.2.0
 
 * Added `toString()` to `IAPError`
@@ -12,4 +16,4 @@
 
 ## 1.0.0
 
-* Initial open-source release.
\ No newline at end of file
+* Initial open-source release.
diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/types/purchase_status.dart b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/types/purchase_status.dart
index 7869506..ed54e97 100644
--- a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/types/purchase_status.dart
+++ b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/types/purchase_status.dart
@@ -26,4 +26,9 @@
   /// the purchase by calling the `completePurchase` method. More information on
   /// verifying purchases can be found [here](https://pub.dev/packages/in_app_purchase#restoring-previous-purchases).
   restored,
+
+  /// The purchase has been canceled.
+  ///
+  /// Update your UI to indicate the purchase is canceled.
+  canceled,
 }
diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml
index 64574e0..fc306ac 100644
--- a/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 1.2.0
+version: 1.3.0
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/test/src/types/product_details_test.dart b/packages/in_app_purchase/in_app_purchase_platform_interface/test/src/types/product_details_test.dart
index ce49d99..737f0d0 100644
--- a/packages/in_app_purchase/in_app_purchase_platform_interface/test/src/types/product_details_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_platform_interface/test/src/types/product_details_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:flutter_test/flutter_test.dart';
 import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart';
+import 'package:in_app_purchase_platform_interface/src/types/purchase_status.dart';
 
 void main() {
   group('Constructor Tests', () {
@@ -27,4 +28,22 @@
       expect(productDetails.currencySymbol, r'$');
     });
   });
+
+  group('PurchaseStatus Tests', () {
+    test('PurchaseStatus should contain 5 options', () {
+      const List<PurchaseStatus> values = PurchaseStatus.values;
+
+      expect(values.length, 5);
+    });
+
+    test('PurchaseStatus enum should have items in correct index', () {
+      const List<PurchaseStatus> values = PurchaseStatus.values;
+
+      expect(values[0], PurchaseStatus.pending);
+      expect(values[1], PurchaseStatus.purchased);
+      expect(values[2], PurchaseStatus.error);
+      expect(values[3], PurchaseStatus.restored);
+      expect(values[4], PurchaseStatus.canceled);
+    });
+  });
 }