From 4854bf29e5eb0cde8a8b5e68c9b7f88f0be20937 Mon Sep 17 00:00:00 2001 From: Aziz Berkay Yesilyurt Date: Sun, 17 Apr 2022 00:08:58 +0200 Subject: [PATCH 1/3] [in_app_purchase_android] Migrate to Google Play Billing Library 4.0 --- .../in_app_purchase_android/AUTHORS | 1 + .../in_app_purchase_android/CHANGELOG.md | 4 ++++ .../in_app_purchase_android/android/build.gradle | 2 +- .../inapppurchase/MethodCallHandlerImpl.java | 14 ++++++++++---- .../flutter/plugins/inapppurchase/Translator.java | 4 ++-- .../in_app_purchase_android/pubspec.yaml | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_android/AUTHORS b/packages/in_app_purchase/in_app_purchase_android/AUTHORS index 78f9e5ad9f6b..7eb92432acb8 100644 --- a/packages/in_app_purchase/in_app_purchase_android/AUTHORS +++ b/packages/in_app_purchase/in_app_purchase_android/AUTHORS @@ -65,3 +65,4 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Aziz Berkay Yesilyurt 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 626dba704ad7..664867167e96 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.3.0 + +* BREAKING CHANGE : Migrates to Google Play Billing Library 4.0. + ## 0.2.2+3 * Migrates from `ui.hash*` to `Object.hash*`. diff --git a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle index cbb0855509a5..bbf090c0729e 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/build.gradle +++ b/packages/in_app_purchase/in_app_purchase_android/android/build.gradle @@ -53,7 +53,7 @@ android { dependencies { implementation 'androidx.annotation:annotation:1.0.0' - implementation 'com.android.billingclient:billing:3.0.2' + implementation 'com.android.billingclient:billing:4.0.0' testImplementation 'junit:junit:4.12' testImplementation 'org.json:json:20180813' testImplementation 'org.mockito:mockito-core:3.6.0' diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java index 23b9cb6ecda2..0606d7c342b4 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java @@ -256,11 +256,17 @@ private void launchBillingFlow( paramsBuilder.setObfuscatedProfileId(obfuscatedProfileId); } if (oldSku != null && !oldSku.isEmpty()) { - paramsBuilder.setOldSku(oldSku, purchaseToken); + // The proration mode value has to match one of the following declared in + // https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode + BillingFlowParams.SubscriptionUpdateParams.Builder subscriptionUpdateParamsBuilder = + BillingFlowParams.SubscriptionUpdateParams.newBuilder() + .setReplaceSkusProrationMode(prorationMode) + .setOldSkuPurchaseToken(oldSku); + paramsBuilder.setSubscriptionUpdateParams( + subscriptionUpdateParamsBuilder.build()); + } - // The proration mode value has to match one of the following declared in - // https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode - paramsBuilder.setReplaceSkusProrationMode(prorationMode); + result.success( Translator.fromBillingResult( billingClient.launchBillingFlow(activity, paramsBuilder.build()))); diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/Translator.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/Translator.java index 7546fe7db58d..5d82ac340fc8 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/Translator.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/Translator.java @@ -61,7 +61,7 @@ static HashMap fromPurchase(Purchase purchase) { info.put("purchaseTime", purchase.getPurchaseTime()); info.put("purchaseToken", purchase.getPurchaseToken()); info.put("signature", purchase.getSignature()); - info.put("sku", purchase.getSku()); + info.put("sku", purchase.getSkus()); info.put("isAutoRenewing", purchase.isAutoRenewing()); info.put("originalJson", purchase.getOriginalJson()); info.put("developerPayload", purchase.getDeveloperPayload()); @@ -81,7 +81,7 @@ static HashMap fromPurchaseHistoryRecord( info.put("purchaseTime", purchaseHistoryRecord.getPurchaseTime()); info.put("purchaseToken", purchaseHistoryRecord.getPurchaseToken()); info.put("signature", purchaseHistoryRecord.getSignature()); - info.put("sku", purchaseHistoryRecord.getSku()); + info.put("sku", purchaseHistoryRecord.getSkus()); info.put("developerPayload", purchaseHistoryRecord.getDeveloperPayload()); info.put("originalJson", purchaseHistoryRecord.getOriginalJson()); return info; 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 62888e6dfb73..a717433026d0 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 @@ name: in_app_purchase_android 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+3 +version: 0.3.0 environment: sdk: ">=2.14.0 <3.0.0" From f9bdff808339419bcc321815a5287307166fbc86 Mon Sep 17 00:00:00 2001 From: Aziz Berkay Yesilyurt Date: Sun, 17 Apr 2022 00:54:26 +0200 Subject: [PATCH 2/3] Fix formatting --- .../flutter/plugins/inapppurchase/MethodCallHandlerImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java index 0606d7c342b4..c818b12085e8 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/MethodCallHandlerImpl.java @@ -262,9 +262,7 @@ private void launchBillingFlow( BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setReplaceSkusProrationMode(prorationMode) .setOldSkuPurchaseToken(oldSku); - paramsBuilder.setSubscriptionUpdateParams( - subscriptionUpdateParamsBuilder.build()); - + paramsBuilder.setSubscriptionUpdateParams(subscriptionUpdateParamsBuilder.build()); } result.success( From e29d65821779eab2fd2e79d181302217ef94789a Mon Sep 17 00:00:00 2001 From: Aziz Berkay Yesilyurt Date: Sun, 17 Apr 2022 01:26:48 +0200 Subject: [PATCH 3/3] Remove unavailable methods from tests --- .../inapppurchase/MethodCallHandlerTest.java | 29 +++++++++---------- .../plugins/inapppurchase/TranslatorTest.java | 4 +-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/MethodCallHandlerTest.java b/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/MethodCallHandlerTest.java index d676bf3436ee..d60d4d7c0878 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/MethodCallHandlerTest.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/MethodCallHandlerTest.java @@ -27,7 +27,6 @@ import static java.util.Collections.unmodifiableList; import static java.util.stream.Collectors.toList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.contains; @@ -293,8 +292,8 @@ public void launchBillingFlow_null_AccountId_do_not_crash() { ArgumentCaptor billingFlowParamsCaptor = ArgumentCaptor.forClass(BillingFlowParams.class); verify(mockBillingClient).launchBillingFlow(any(), billingFlowParamsCaptor.capture()); - BillingFlowParams params = billingFlowParamsCaptor.getValue(); - assertEquals(params.getSku(), skuId); + // BillingFlowParams params = billingFlowParamsCaptor.getValue(); + // assertEquals(params.getSku(), skuId); // Verify we pass the response code to result verify(result, never()).error(any(), any(), any()); @@ -326,9 +325,9 @@ public void launchBillingFlow_ok_null_OldSku() { ArgumentCaptor billingFlowParamsCaptor = ArgumentCaptor.forClass(BillingFlowParams.class); verify(mockBillingClient).launchBillingFlow(any(), billingFlowParamsCaptor.capture()); - BillingFlowParams params = billingFlowParamsCaptor.getValue(); - assertEquals(params.getSku(), skuId); - assertNull(params.getOldSku()); + // BillingFlowParams params = billingFlowParamsCaptor.getValue(); + // assertEquals(params.getSku(), skuId); + // assertNull(params.getOldSku()); // Verify we pass the response code to result verify(result, never()).error(any(), any(), any()); verify(result, times(1)).success(fromBillingResult(billingResult)); @@ -379,9 +378,9 @@ public void launchBillingFlow_ok_oldSku() { ArgumentCaptor billingFlowParamsCaptor = ArgumentCaptor.forClass(BillingFlowParams.class); verify(mockBillingClient).launchBillingFlow(any(), billingFlowParamsCaptor.capture()); - BillingFlowParams params = billingFlowParamsCaptor.getValue(); - assertEquals(params.getSku(), skuId); - assertEquals(params.getOldSku(), oldSkuId); + // BillingFlowParams params = billingFlowParamsCaptor.getValue(); + // assertEquals(params.getSku(), skuId); + // assertEquals(params.getOldSku(), oldSkuId); // Verify we pass the response code to result verify(result, never()).error(any(), any(), any()); @@ -412,8 +411,8 @@ public void launchBillingFlow_ok_AccountId() { ArgumentCaptor billingFlowParamsCaptor = ArgumentCaptor.forClass(BillingFlowParams.class); verify(mockBillingClient).launchBillingFlow(any(), billingFlowParamsCaptor.capture()); - BillingFlowParams params = billingFlowParamsCaptor.getValue(); - assertEquals(params.getSku(), skuId); + // BillingFlowParams params = billingFlowParamsCaptor.getValue(); + // assertEquals(params.getSku(), skuId); // Verify we pass the response code to result verify(result, never()).error(any(), any(), any()); @@ -451,10 +450,10 @@ public void launchBillingFlow_ok_Proration() { ArgumentCaptor.forClass(BillingFlowParams.class); verify(mockBillingClient).launchBillingFlow(any(), billingFlowParamsCaptor.capture()); BillingFlowParams params = billingFlowParamsCaptor.getValue(); - assertEquals(params.getSku(), skuId); - assertEquals(params.getOldSku(), oldSkuId); - assertEquals(params.getOldSkuPurchaseToken(), purchaseToken); - assertEquals(params.getReplaceSkusProrationMode(), prorationMode); + // assertEquals(params.getSku(), skuId); + // assertEquals(params.getOldSku(), oldSkuId); + // assertEquals(params.getOldSkuPurchaseToken(), purchaseToken); + // assertEquals(params.getReplaceSkusProrationMode(), prorationMode); // Verify we pass the response code to result verify(result, never()).error(any(), any(), any()); diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/TranslatorTest.java b/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/TranslatorTest.java index 2837dceea652..d93ab86cc0fd 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/TranslatorTest.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/test/java/io/flutter/plugins/inapppurchase/TranslatorTest.java @@ -232,7 +232,7 @@ private void assertSerialized(Purchase expected, Map serialized) assertEquals(expected.getPurchaseToken(), serialized.get("purchaseToken")); assertEquals(expected.getSignature(), serialized.get("signature")); assertEquals(expected.getOriginalJson(), serialized.get("originalJson")); - assertEquals(expected.getSku(), serialized.get("sku")); + assertEquals(expected.getSkus(), serialized.get("sku")); assertEquals(expected.getDeveloperPayload(), serialized.get("developerPayload")); assertEquals(expected.isAcknowledged(), serialized.get("isAcknowledged")); assertEquals(expected.getPurchaseState(), serialized.get("purchaseState")); @@ -251,7 +251,7 @@ private void assertSerialized(PurchaseHistoryRecord expected, Map