Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.3.0+3

* Fixes Java lint issues.

## 0.3.0+2

* Removes obsolete null checks on non-nullable values.
Expand All @@ -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.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ android {
checkAllWarnings true
warningsAsErrors true
disable 'AndroidGradlePluginVersion', 'InvalidPackage', 'GradleDependency'
baseline file("lint-baseline.xml")
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
Expand All @@ -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'
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
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;

/** The implementation for {@link BillingClientFactory} for the plugin. */
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,58 +25,31 @@ 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<Purchase>)";
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())
.registerActivityLifecycleCallbacks(plugin.methodCallHandler);
}

@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());
}
Expand All @@ -88,7 +61,7 @@ public void onDetachedFromActivity() {
}

@Override
public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
onAttachedToActivity(binding);
}

Expand All @@ -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);
}

Expand Down
Loading