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 cf62ad38ec96..f1b22d6a620b 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+3 + +* Fixes Java lint issues. + ## 0.3.0+2 * Removes obsolete null checks on non-nullable values. @@ -7,6 +11,7 @@ * Fixes misaligned method signature strings. ## 0.3.0 + * **BREAKING CHANGE**: Removes `launchPriceChangeConfirmationFlow` from `InAppPurchaseAndroidPlatform`. Price changes are now [handled by Google Play](https://developer.android.com/google/play/billing/subscriptions#price-change). * Returns both base plans and offers when `queryProductDetailsAsync` is called. 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 94acf3a86551..a07a53a77d8f 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 @@ -36,7 +36,6 @@ android { checkAllWarnings true warningsAsErrors true disable 'AndroidGradlePluginVersion', 'InvalidPackage', 'GradleDependency' - baseline file("lint-baseline.xml") } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -59,7 +58,7 @@ android { dependencies { implementation 'androidx.annotation:annotation:1.6.0' - // org.jetbrains.kotlin:kotlin-bom artifact purpose is to align kotlin stdlib and related code versions. + // org.jetbrains.kotlin:kotlin-bom artifact purpose is to align kotlin stdlib and related code versions. // See: https://youtrack.jetbrains.com/issue/KT-55297/kotlin-stdlib-should-declare-constraints-on-kotlin-stdlib-jdk8-and-kotlin-stdlib-jdk7 implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) implementation 'com.android.billingclient:billing:5.2.0' diff --git a/packages/in_app_purchase/in_app_purchase_android/android/lint-baseline.xml b/packages/in_app_purchase/in_app_purchase_android/android/lint-baseline.xml deleted file mode 100644 index 1505288bdd3c..000000000000 --- a/packages/in_app_purchase/in_app_purchase_android/android/lint-baseline.xml +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactoryImpl.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactoryImpl.java index 6d2639840a74..201d57c7fa25 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactoryImpl.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/BillingClientFactoryImpl.java @@ -5,6 +5,7 @@ package io.flutter.plugins.inapppurchase; import android.content.Context; +import androidx.annotation.NonNull; import com.android.billingclient.api.BillingClient; import io.flutter.plugin.common.MethodChannel; @@ -12,7 +13,8 @@ final class BillingClientFactoryImpl implements BillingClientFactory { @Override - public BillingClient createBillingClient(Context context, MethodChannel channel) { + public BillingClient createBillingClient( + @NonNull Context context, @NonNull MethodChannel channel) { BillingClient.Builder builder = BillingClient.newBuilder(context).enablePendingPurchases(); return builder.setListener(new PluginPurchaseListener(channel)).build(); diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index c02bc8e893b3..4db2ca5d79e5 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -4,9 +4,9 @@ package io.flutter.plugins.inapppurchase; -import android.app.Activity; import android.app.Application; import android.content.Context; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.android.billingclient.api.BillingClient; import io.flutter.embedding.engine.plugins.FlutterPlugin; @@ -25,39 +25,13 @@ public class InAppPurchasePlugin implements FlutterPlugin, ActivityAware { // code owner of this package. static final String PROXY_VALUE = "io.flutter.plugins.inapppurchase"; - @VisibleForTesting - static final class MethodNames { - static final String IS_READY = "BillingClient#isReady()"; - static final String START_CONNECTION = - "BillingClient#startConnection(BillingClientStateListener)"; - static final String END_CONNECTION = "BillingClient#endConnection()"; - static final String ON_DISCONNECT = "BillingClientStateListener#onBillingServiceDisconnected()"; - static final String QUERY_PRODUCT_DETAILS = - "BillingClient#queryProductDetailsAsync(QueryProductDetailsParams, ProductDetailsResponseListener)"; - static final String LAUNCH_BILLING_FLOW = - "BillingClient#launchBillingFlow(Activity, BillingFlowParams)"; - static final String ON_PURCHASES_UPDATED = - "PurchasesUpdatedListener#onPurchasesUpdated(BillingResult, List)"; - static final String QUERY_PURCHASES_ASYNC = - "BillingClient#queryPurchasesAsync(QueryPurchaseParams, PurchaseResponseListener)"; - static final String QUERY_PURCHASE_HISTORY_ASYNC = - "BillingClient#queryPurchaseHistoryAsync(QueryPurchaseHistoryParams, PurchaseHistoryResponseListener)"; - static final String CONSUME_PURCHASE_ASYNC = - "BillingClient#consumeAsync(ConsumeParams, ConsumeResponseListener)"; - static final String ACKNOWLEDGE_PURCHASE = - "BillingClient#acknowledgePurchase(AcknowledgePurchaseParams, AcknowledgePurchaseResponseListener)"; - static final String IS_FEATURE_SUPPORTED = "BillingClient#isFeatureSupported(String)"; - static final String GET_CONNECTION_STATE = "BillingClient#getConnectionState()"; - - private MethodNames() {}; - } - private MethodChannel methodChannel; private MethodCallHandlerImpl methodCallHandler; /** Plugin registration. */ @SuppressWarnings("deprecation") - public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) { + public static void registerWith( + @NonNull io.flutter.plugin.common.PluginRegistry.Registrar registrar) { InAppPurchasePlugin plugin = new InAppPurchasePlugin(); registrar.activity().getIntent().putExtra(PROXY_PACKAGE_KEY, PROXY_VALUE); ((Application) registrar.context().getApplicationContext()) @@ -65,18 +39,17 @@ public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registra } @Override - public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding binding) { - setupMethodChannel( - /*activity=*/ null, binding.getBinaryMessenger(), binding.getApplicationContext()); + public void onAttachedToEngine(@NonNull FlutterPlugin.FlutterPluginBinding binding) { + setUpMethodChannel(binding.getBinaryMessenger(), binding.getApplicationContext()); } @Override - public void onDetachedFromEngine(FlutterPlugin.FlutterPluginBinding binding) { + public void onDetachedFromEngine(@NonNull FlutterPlugin.FlutterPluginBinding binding) { teardownMethodChannel(); } @Override - public void onAttachedToActivity(ActivityPluginBinding binding) { + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { binding.getActivity().getIntent().putExtra(PROXY_PACKAGE_KEY, PROXY_VALUE); methodCallHandler.setActivity(binding.getActivity()); } @@ -88,7 +61,7 @@ public void onDetachedFromActivity() { } @Override - public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { onAttachedToActivity(binding); } @@ -97,10 +70,11 @@ public void onDetachedFromActivityForConfigChanges() { methodCallHandler.setActivity(null); } - private void setupMethodChannel(Activity activity, BinaryMessenger messenger, Context context) { + private void setUpMethodChannel(BinaryMessenger messenger, Context context) { methodChannel = new MethodChannel(messenger, "plugins.flutter.io/in_app_purchase"); methodCallHandler = - new MethodCallHandlerImpl(activity, context, methodChannel, new BillingClientFactoryImpl()); + new MethodCallHandlerImpl( + /*activity=*/ null, context, methodChannel, new BillingClientFactoryImpl()); methodChannel.setMethodCallHandler(methodCallHandler); } 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 c2ce590eecd2..e6c6e0ae7934 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 @@ -17,8 +17,8 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.billingclient.api.AcknowledgePurchaseParams; -import com.android.billingclient.api.AcknowledgePurchaseResponseListener; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; import com.android.billingclient.api.BillingFlowParams; @@ -27,11 +27,6 @@ import com.android.billingclient.api.ConsumeParams; import com.android.billingclient.api.ConsumeResponseListener; import com.android.billingclient.api.ProductDetails; -import com.android.billingclient.api.ProductDetailsResponseListener; -import com.android.billingclient.api.Purchase; -import com.android.billingclient.api.PurchaseHistoryRecord; -import com.android.billingclient.api.PurchaseHistoryResponseListener; -import com.android.billingclient.api.PurchasesResponseListener; import com.android.billingclient.api.QueryProductDetailsParams; import com.android.billingclient.api.QueryProductDetailsParams.Product; import com.android.billingclient.api.QueryPurchaseHistoryParams; @@ -47,6 +42,31 @@ class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler, Application.ActivityLifecycleCallbacks { + @VisibleForTesting + static final class MethodNames { + static final String IS_READY = "BillingClient#isReady()"; + static final String START_CONNECTION = + "BillingClient#startConnection(BillingClientStateListener)"; + static final String END_CONNECTION = "BillingClient#endConnection()"; + static final String ON_DISCONNECT = "BillingClientStateListener#onBillingServiceDisconnected()"; + static final String QUERY_PRODUCT_DETAILS = + "BillingClient#queryProductDetailsAsync(QueryProductDetailsParams, ProductDetailsResponseListener)"; + static final String LAUNCH_BILLING_FLOW = + "BillingClient#launchBillingFlow(Activity, BillingFlowParams)"; + static final String QUERY_PURCHASES_ASYNC = + "BillingClient#queryPurchasesAsync(QueryPurchaseParams, PurchaseResponseListener)"; + static final String QUERY_PURCHASE_HISTORY_ASYNC = + "BillingClient#queryPurchaseHistoryAsync(QueryPurchaseHistoryParams, PurchaseHistoryResponseListener)"; + static final String CONSUME_PURCHASE_ASYNC = + "BillingClient#consumeAsync(ConsumeParams, ConsumeResponseListener)"; + static final String ACKNOWLEDGE_PURCHASE = + "BillingClient#acknowledgePurchase(AcknowledgePurchaseParams, AcknowledgePurchaseResponseListener)"; + static final String IS_FEATURE_SUPPORTED = "BillingClient#isFeatureSupported(String)"; + static final String GET_CONNECTION_STATE = "BillingClient#getConnectionState()"; + + private MethodNames() {} + } + private static final String TAG = "InAppPurchasePlugin"; private static final String LOAD_PRODUCT_DOC_URL = "https://github.com/flutter/packages/blob/main/packages/in_app_purchase/in_app_purchase/README.md#loading-products-for-sale"; @@ -56,7 +76,7 @@ class MethodCallHandlerImpl @Nullable private Activity activity; private final Context applicationContext; - private final MethodChannel methodChannel; + final MethodChannel methodChannel; private final HashMap cachedProducts = new HashMap<>(); @@ -111,22 +131,22 @@ void onDetachedFromActivity() { } @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { + public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { switch (call.method) { - case InAppPurchasePlugin.MethodNames.IS_READY: + case MethodNames.IS_READY: isReady(result); break; - case InAppPurchasePlugin.MethodNames.START_CONNECTION: + case MethodNames.START_CONNECTION: startConnection((int) call.argument("handle"), result); break; - case InAppPurchasePlugin.MethodNames.END_CONNECTION: + case MethodNames.END_CONNECTION: endConnection(result); break; - case InAppPurchasePlugin.MethodNames.QUERY_PRODUCT_DETAILS: + case MethodNames.QUERY_PRODUCT_DETAILS: List productList = toProductList(call.argument("productList")); queryProductDetailsAsync(productList, result); break; - case InAppPurchasePlugin.MethodNames.LAUNCH_BILLING_FLOW: + case MethodNames.LAUNCH_BILLING_FLOW: launchBillingFlow( (String) call.argument("product"), (String) call.argument("offerToken"), @@ -139,22 +159,22 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { : ProrationMode.UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, result); break; - case InAppPurchasePlugin.MethodNames.QUERY_PURCHASES_ASYNC: + case MethodNames.QUERY_PURCHASES_ASYNC: queryPurchasesAsync((String) call.argument("productType"), result); break; - case InAppPurchasePlugin.MethodNames.QUERY_PURCHASE_HISTORY_ASYNC: + case MethodNames.QUERY_PURCHASE_HISTORY_ASYNC: queryPurchaseHistoryAsync((String) call.argument("productType"), result); break; - case InAppPurchasePlugin.MethodNames.CONSUME_PURCHASE_ASYNC: + case MethodNames.CONSUME_PURCHASE_ASYNC: consumeAsync((String) call.argument("purchaseToken"), result); break; - case InAppPurchasePlugin.MethodNames.ACKNOWLEDGE_PURCHASE: + case MethodNames.ACKNOWLEDGE_PURCHASE: acknowledgePurchase((String) call.argument("purchaseToken"), result); break; - case InAppPurchasePlugin.MethodNames.IS_FEATURE_SUPPORTED: + case MethodNames.IS_FEATURE_SUPPORTED: isFeatureSupported((String) call.argument("feature"), result); break; - case InAppPurchasePlugin.MethodNames.GET_CONNECTION_STATE: + case MethodNames.GET_CONNECTION_STATE: getConnectionState(result); break; default: @@ -192,18 +212,13 @@ private void queryProductDetailsAsync( QueryProductDetailsParams.newBuilder().setProductList(productList).build(); billingClient.queryProductDetailsAsync( params, - new ProductDetailsResponseListener() { - @Override - public void onProductDetailsResponse( - @NonNull BillingResult billingResult, - @NonNull List productDetailsList) { - updateCachedProducts(productDetailsList); - final Map productDetailsResponse = new HashMap<>(); - productDetailsResponse.put("billingResult", fromBillingResult(billingResult)); - productDetailsResponse.put( - "productDetailsList", fromProductDetailsList(productDetailsList)); - result.success(productDetailsResponse); - } + (billingResult, productDetailsList) -> { + updateCachedProducts(productDetailsList); + final Map productDetailsResponse = new HashMap<>(); + productDetailsResponse.put("billingResult", fromBillingResult(billingResult)); + productDetailsResponse.put( + "productDetailsList", fromProductDetailsList(productDetailsList)); + result.success(productDetailsResponse); }); } @@ -322,12 +337,7 @@ private void consumeAsync(String purchaseToken, final MethodChannel.Result resul } ConsumeResponseListener listener = - new ConsumeResponseListener() { - @Override - public void onConsumeResponse(BillingResult billingResult, String outToken) { - result.success(fromBillingResult(billingResult)); - } - }; + (billingResult, outToken) -> result.success(fromBillingResult(billingResult)); ConsumeParams.Builder paramsBuilder = ConsumeParams.newBuilder().setPurchaseToken(purchaseToken); @@ -347,18 +357,14 @@ private void queryPurchasesAsync(String productType, MethodChannel.Result result paramsBuilder.setProductType(productType); billingClient.queryPurchasesAsync( paramsBuilder.build(), - new PurchasesResponseListener() { - @Override - public void onQueryPurchasesResponse( - BillingResult billingResult, List purchasesList) { - final Map serialized = new HashMap<>(); - // The response code is no longer passed, as part of billing 4.0, so we pass OK here - // as success is implied by calling this callback. - serialized.put("responseCode", BillingClient.BillingResponseCode.OK); - serialized.put("billingResult", fromBillingResult(billingResult)); - serialized.put("purchasesList", fromPurchasesList(purchasesList)); - result.success(serialized); - } + (billingResult, purchasesList) -> { + final Map serialized = new HashMap<>(); + // The response code is no longer passed, as part of billing 4.0, so we pass OK here + // as success is implied by calling this callback. + serialized.put("responseCode", BillingClient.BillingResponseCode.OK); + serialized.put("billingResult", fromBillingResult(billingResult)); + serialized.put("purchasesList", fromPurchasesList(purchasesList)); + result.success(serialized); }); } @@ -369,16 +375,11 @@ private void queryPurchaseHistoryAsync(String productType, final MethodChannel.R billingClient.queryPurchaseHistoryAsync( QueryPurchaseHistoryParams.newBuilder().setProductType(productType).build(), - new PurchaseHistoryResponseListener() { - @Override - public void onPurchaseHistoryResponse( - BillingResult billingResult, List purchasesList) { - final Map serialized = new HashMap<>(); - serialized.put("billingResult", fromBillingResult(billingResult)); - serialized.put( - "purchaseHistoryRecordList", fromPurchaseHistoryRecordList(purchasesList)); - result.success(serialized); - } + (billingResult, purchasesList) -> { + final Map serialized = new HashMap<>(); + serialized.put("billingResult", fromBillingResult(billingResult)); + serialized.put("purchaseHistoryRecordList", fromPurchaseHistoryRecordList(purchasesList)); + result.success(serialized); }); } @@ -401,7 +402,7 @@ private void startConnection(final int handle, final MethodChannel.Result result private boolean alreadyFinished = false; @Override - public void onBillingSetupFinished(BillingResult billingResult) { + public void onBillingSetupFinished(@NonNull BillingResult billingResult) { if (alreadyFinished) { Log.d(TAG, "Tried to call onBillingSetupFinished multiple times."); return; @@ -416,7 +417,7 @@ public void onBillingSetupFinished(BillingResult billingResult) { public void onBillingServiceDisconnected() { final Map arguments = new HashMap<>(); arguments.put("handle", handle); - methodChannel.invokeMethod(InAppPurchasePlugin.MethodNames.ON_DISCONNECT, arguments); + methodChannel.invokeMethod(MethodNames.ON_DISCONNECT, arguments); } }); } @@ -428,13 +429,7 @@ private void acknowledgePurchase(String purchaseToken, final MethodChannel.Resul AcknowledgePurchaseParams params = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchaseToken).build(); billingClient.acknowledgePurchase( - params, - new AcknowledgePurchaseResponseListener() { - @Override - public void onAcknowledgePurchaseResponse(BillingResult billingResult) { - result.success(fromBillingResult(billingResult)); - } - }); + params, billingResult -> result.success(fromBillingResult(billingResult))); } protected void updateCachedProducts(@Nullable List productDetailsList) { diff --git a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java index 54c775d0ad0f..ce919f75d123 100644 --- a/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java +++ b/packages/in_app_purchase/in_app_purchase_android/android/src/main/java/io/flutter/plugins/inapppurchase/PluginPurchaseListener.java @@ -7,7 +7,9 @@ import static io.flutter.plugins.inapppurchase.Translator.fromBillingResult; import static io.flutter.plugins.inapppurchase.Translator.fromPurchasesList; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesUpdatedListener; @@ -19,16 +21,21 @@ class PluginPurchaseListener implements PurchasesUpdatedListener { private final MethodChannel channel; + @VisibleForTesting + static final String ON_PURCHASES_UPDATED = + "PurchasesUpdatedListener#onPurchasesUpdated(BillingResult, List)"; + PluginPurchaseListener(MethodChannel channel) { this.channel = channel; } @Override - public void onPurchasesUpdated(BillingResult billingResult, @Nullable List purchases) { + public void onPurchasesUpdated( + @NonNull BillingResult billingResult, @Nullable List purchases) { final Map callbackArgs = new HashMap<>(); callbackArgs.put("billingResult", fromBillingResult(billingResult)); callbackArgs.put("responseCode", billingResult.getResponseCode()); callbackArgs.put("purchasesList", fromPurchasesList(purchases)); - channel.invokeMethod(InAppPurchasePlugin.MethodNames.ON_PURCHASES_UPDATED, callbackArgs); + channel.invokeMethod(ON_PURCHASES_UPDATED, callbackArgs); } } 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 585ed646b441..6f105112f1d1 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 @@ -4,18 +4,18 @@ package io.flutter.plugins.inapppurchase; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.ACKNOWLEDGE_PURCHASE; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.CONSUME_PURCHASE_ASYNC; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.END_CONNECTION; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.IS_FEATURE_SUPPORTED; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.IS_READY; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.LAUNCH_BILLING_FLOW; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.ON_DISCONNECT; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.ON_PURCHASES_UPDATED; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.QUERY_PRODUCT_DETAILS; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.QUERY_PURCHASES_ASYNC; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.QUERY_PURCHASE_HISTORY_ASYNC; -import static io.flutter.plugins.inapppurchase.InAppPurchasePlugin.MethodNames.START_CONNECTION; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.ACKNOWLEDGE_PURCHASE; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.CONSUME_PURCHASE_ASYNC; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.END_CONNECTION; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.IS_FEATURE_SUPPORTED; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.IS_READY; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.LAUNCH_BILLING_FLOW; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.ON_DISCONNECT; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.QUERY_PRODUCT_DETAILS; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.QUERY_PURCHASES_ASYNC; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.QUERY_PURCHASE_HISTORY_ASYNC; +import static io.flutter.plugins.inapppurchase.MethodCallHandlerImpl.MethodNames.START_CONNECTION; +import static io.flutter.plugins.inapppurchase.PluginPurchaseListener.ON_PURCHASES_UPDATED; import static io.flutter.plugins.inapppurchase.Translator.fromBillingResult; import static io.flutter.plugins.inapppurchase.Translator.fromProductDetailsList; import static io.flutter.plugins.inapppurchase.Translator.fromPurchaseHistoryRecordList; @@ -77,7 +77,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class MethodCallHandlerTest { @@ -604,30 +603,28 @@ public void queryPurchases_returns_success() throws Exception { CountDownLatch lock = new CountDownLatch(1); doAnswer( - new Answer() { - public Object answer(InvocationOnMock invocation) { - lock.countDown(); - return null; - } - }) + (Answer) + invocation -> { + lock.countDown(); + return null; + }) .when(result) .success(any(HashMap.class)); ArgumentCaptor purchasesResponseListenerArgumentCaptor = ArgumentCaptor.forClass(PurchasesResponseListener.class); doAnswer( - new Answer() { - public Object answer(InvocationOnMock invocation) { - BillingResult.Builder resultBuilder = - BillingResult.newBuilder() - .setResponseCode(BillingClient.BillingResponseCode.OK) - .setDebugMessage("hello message"); - purchasesResponseListenerArgumentCaptor - .getValue() - .onQueryPurchasesResponse(resultBuilder.build(), new ArrayList()); - return null; - } - }) + (Answer) + invocation -> { + BillingResult.Builder resultBuilder = + BillingResult.newBuilder() + .setResponseCode(BillingClient.BillingResponseCode.OK) + .setDebugMessage("hello message"); + purchasesResponseListenerArgumentCaptor + .getValue() + .onQueryPurchasesResponse(resultBuilder.build(), new ArrayList()); + return null; + }) .when(mockBillingClient) .queryPurchasesAsync( any(QueryPurchasesParams.class), purchasesResponseListenerArgumentCaptor.capture()); 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 a29be3d68bca..1267da2e5cd3 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/packages/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.3.0+2 +version: 0.3.0+3 environment: sdk: ">=2.18.0 <4.0.0"