Skip to content

Commit

Permalink
Plugin migration to post Flutter 1.12 (#240)
Browse files Browse the repository at this point in the history
Co-authored-by: Marina González <marinagonzalez@mindapps.se>
  • Loading branch information
mgonzalezc and Marina González committed Nov 29, 2020
1 parent 4268721 commit 4f40a37
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 46 deletions.
@@ -1,5 +1,7 @@
package com.dooboolab.flutterinapppurchase;

import android.app.Activity;
import android.content.Context;
import android.util.Log;

import com.amazon.device.iap.PurchasingListener;
Expand Down Expand Up @@ -27,31 +29,38 @@
import java.util.Map;
import java.util.Set;

import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

/** AmazonInappPurchasePlugin */
public class AmazonInappPurchasePlugin implements MethodCallHandler {
public static Registrar reg;

private final String TAG = "InappPurchasePlugin";
private Result result = null;
private static MethodChannel channel;
private MethodChannel channel;
private Context context;
private Activity activity;

public void setContext(Context context) {
this.context = context;
}

public void setActivity(Activity activity) {
this.activity = activity;
}

/** Plugin registration. */
public static void registerWith(Registrar registrar) {
channel = new MethodChannel(registrar.messenger(), "flutter_inapp");
channel.setMethodCallHandler(new FlutterInappPurchasePlugin());
reg = registrar;
public void setChannel(MethodChannel channel) {
this.channel = channel;
}

@Override
public void onMethodCall(final MethodCall call, final Result result) {
this.result=result;
try {
PurchasingService.registerListener(reg.context(), purchasesUpdatedListener);
PurchasingService.registerListener(context, purchasesUpdatedListener);

} catch (Exception e) {
result.error(call.method, "Call endConnection method if you want to start over.", e.getMessage());
Expand Down
@@ -1,6 +1,11 @@
package com.dooboolab.flutterinapppurchase;

import androidx.annotation.Nullable;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.android.billingclient.api.AcknowledgePurchaseParams;
Expand All @@ -26,29 +31,80 @@
import java.util.ArrayList;
import java.util.List;

import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.FlutterException;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

/** AndroidInappPurchasePlugin */
public class AndroidInappPurchasePlugin implements MethodCallHandler {
public static Registrar reg;
public class AndroidInappPurchasePlugin implements MethodCallHandler, Application.ActivityLifecycleCallbacks {
static private ArrayList<SkuDetails> skus;
private final String TAG = "InappPurchasePlugin";
private BillingClient billingClient;
private static MethodChannel channel;
private Context context;
private Activity activity;
private MethodChannel channel;

/** Plugin registration. */
public static void registerWith(Registrar registrar) {
channel = new MethodChannel(registrar.messenger(), "flutter_inapp");
channel.setMethodCallHandler(new FlutterInappPurchasePlugin());
reg = registrar;
AndroidInappPurchasePlugin() {
skus = new ArrayList<>();
}

public void setContext(Context context) {
this.context = context;
}

public void setActivity(Activity activity) {
this.activity = activity;
}

public void setChannel(MethodChannel channel) {
this.channel = channel;
}

public void onDetachedFromActivity() {
endBillingClientConnection();
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {

}

@Override
public void onActivityPaused(Activity activity) {

}

@Override
public void onActivityDestroyed(Activity activity) {
if (this.activity == activity && this.context != null) {
((Application) this.context).unregisterActivityLifecycleCallbacks(this);
endBillingClientConnection();
}
}

@Override
public void onActivityStopped(Activity activity) {

}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override
public void onMethodCall(final MethodCall call, final Result result) {
if (call.method.equals("getPlatformVersion")) {
Expand All @@ -68,9 +124,9 @@ else if (call.method.equals("initConnection")) {
return;
}

billingClient = BillingClient.newBuilder(reg.context()).setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
billingClient = BillingClient.newBuilder(context).setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
billingClient.startConnection(new BillingClientStateListener() {
private boolean alreadyFinished = false;

Expand Down Expand Up @@ -389,7 +445,9 @@ else if (call.method.equals("buyItemByType")) {

builder.setSkuDetails(selectedSku);
BillingFlowParams flowParams = builder.build();
billingClient.launchBillingFlow(reg.activity(), flowParams);
if (activity != null) {
billingClient.launchBillingFlow(activity, flowParams);
}
}

/*
Expand Down Expand Up @@ -528,4 +586,13 @@ public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purch
}
}
};

private void endBillingClientConnection() {
if (billingClient != null) {
try {
billingClient.endConnection();
billingClient = null;
} catch (Exception ignored) {}
}
}
}
@@ -1,52 +1,141 @@
package com.dooboolab.flutterinapppurchase;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;

import io.flutter.plugin.common.MethodCall;
import java.util.ArrayList;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

/** FlutterInappPurchasePlugin */
public class FlutterInappPurchasePlugin implements MethodCallHandler {
static AndroidInappPurchasePlugin androidPlugin;
static AmazonInappPurchasePlugin amazonPlugin;
private static Registrar mRegistrar;
public class FlutterInappPurchasePlugin implements FlutterPlugin, ActivityAware {

private AndroidInappPurchasePlugin androidInappPurchasePlugin;
private AmazonInappPurchasePlugin amazonInappPurchasePlugin;
private Context context;
private MethodChannel channel;

private static boolean isAndroid;
private static boolean isAmazon;

@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
context = binding.getApplicationContext();
isAndroid = isPackageInstalled(context, "com.android.vending");
isAmazon = isPackageInstalled(context, "com.amazon.venezia");

if (isAndroid) {
androidInappPurchasePlugin = new AndroidInappPurchasePlugin();
androidInappPurchasePlugin.setContext(context);

setupMethodChannel(binding.getBinaryMessenger(), androidInappPurchasePlugin);

} else if(isAmazon) {
amazonInappPurchasePlugin = new AmazonInappPurchasePlugin();
amazonInappPurchasePlugin.setContext(context);

setupMethodChannel(binding.getBinaryMessenger(), amazonInappPurchasePlugin);
}
}

FlutterInappPurchasePlugin() {
androidPlugin = new AndroidInappPurchasePlugin();
amazonPlugin = new AmazonInappPurchasePlugin();
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
if (isPackageInstalled(context, "com.android.vending")) {
tearDownChannel();
} else if(isPackageInstalled(context, "com.amazon.venezia")) {
tearDownChannel();
}
}

// Plugin registration.
/** Plugin registration. */
public static void registerWith(Registrar registrar) {
mRegistrar = registrar;
if(isPackageInstalled(mRegistrar.context(), "com.android.vending")) {
androidPlugin.registerWith(registrar);
} else if(isPackageInstalled(mRegistrar.context(), "com.amazon.venezia")) {
amazonPlugin.registerWith(registrar);
FlutterInappPurchasePlugin plugin = new FlutterInappPurchasePlugin();
if(isAndroid) {
AndroidInappPurchasePlugin androidInappPurchasePlugin = new AndroidInappPurchasePlugin();
androidInappPurchasePlugin.setContext(registrar.context());
androidInappPurchasePlugin.setActivity(registrar.activity());

plugin.setupMethodChannel(registrar.messenger(), androidInappPurchasePlugin);
plugin.setAndroidInappPurchasePlugin(androidInappPurchasePlugin);
} else if(isAmazon) {
AmazonInappPurchasePlugin amazonInappPurchasePlugin = new AmazonInappPurchasePlugin();
amazonInappPurchasePlugin.setContext(registrar.context());
amazonInappPurchasePlugin.setActivity(registrar.activity());

plugin.setupMethodChannel(registrar.messenger(), amazonInappPurchasePlugin);
plugin.setAmazonInappPurchasePlugin(amazonInappPurchasePlugin);
}
}

@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
if (isPackageInstalled(context, "com.android.vending")) {
androidInappPurchasePlugin.setActivity(binding.getActivity());
} else if(isPackageInstalled(context, "com.amazon.venezia")) {
amazonInappPurchasePlugin.setActivity(binding.getActivity());
}
}

@Override
public void onDetachedFromActivity() {
if (isPackageInstalled(context, "com.android.vending")) {
androidInappPurchasePlugin.setActivity(null);
androidInappPurchasePlugin.onDetachedFromActivity();
} else if(isPackageInstalled(context, "com.amazon.venezia")) {
amazonInappPurchasePlugin.setActivity(null);
}
}

@Override
public void onMethodCall(final MethodCall call, final Result result) {
if(isPackageInstalled(mRegistrar.context(), "com.android.vending")) {
androidPlugin.onMethodCall(call, result);
} else if(isPackageInstalled(mRegistrar.context(), "com.amazon.venezia")) {
amazonPlugin.onMethodCall(call, result);
} else result.notImplemented();
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
onAttachedToActivity(binding);
}

public static final boolean isPackageInstalled(Context ctx, String packageName) {
@Override
public void onDetachedFromActivityForConfigChanges() {
onDetachedFromActivity();
}

private static boolean isPackageInstalled(Context ctx, String packageName) {
try {
ctx.getPackageManager().getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}

private void setupMethodChannel(BinaryMessenger messenger, MethodChannel.MethodCallHandler handler) {
channel = new MethodChannel(messenger, "flutter_inapp");
channel.setMethodCallHandler(handler);
setChannelByPlatform(channel);
}

private void tearDownChannel() {
channel.setMethodCallHandler(null);
channel = null;
setChannelByPlatform(null);
}

private void setChannelByPlatform(MethodChannel channel) {
if(isAndroid) {
androidInappPurchasePlugin.setChannel(channel);
} else if (isAmazon) {
amazonInappPurchasePlugin.setChannel(channel);
}
}

private void setAndroidInappPurchasePlugin(AndroidInappPurchasePlugin androidInappPurchasePlugin) {
this.androidInappPurchasePlugin = androidInappPurchasePlugin;
}

private void setAmazonInappPurchasePlugin(AmazonInappPurchasePlugin amazonInappPurchasePlugin) {
this.amazonInappPurchasePlugin = amazonInappPurchasePlugin;
}
}

0 comments on commit 4f40a37

Please sign in to comment.