Skip to content

Commit

Permalink
Android plugin API updated to support v2 Embedding while remaining co…
Browse files Browse the repository at this point in the history
…mpatible with apps that don’t use the v2 Android embedding.
  • Loading branch information
luis901101 committed Oct 4, 2021
1 parent 96e6998 commit 952e78c
Show file tree
Hide file tree
Showing 10 changed files with 128 additions and 74 deletions.
11 changes: 9 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,12 @@
pubspec.lock

build/
.idea/
android/.idea
android/.idea
.flutter-plugins-dependencies
flutter_export_environment.sh

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package com.onesignal.flutter;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;

import com.onesignal.OneSignal;

import java.util.HashMap;

import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;

abstract class FlutterRegistrarResponder {
Context context;
MethodChannel channel;
PluginRegistry.Registrar flutterRegistrar;
BinaryMessenger messenger;

/**
* MethodChannel class is home to success() method used by Result class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.Collection;
import java.util.Map;

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;
Expand All @@ -14,11 +15,11 @@
public class OneSignalInAppMessagingController extends FlutterRegistrarResponder implements MethodCallHandler {
private MethodChannel channel;

static void registerWith(Registrar registrar) {
static void registerWith(BinaryMessenger messenger) {
OneSignalInAppMessagingController controller = new OneSignalInAppMessagingController();
controller.channel = new MethodChannel(registrar.messenger(), "OneSignal#inAppMessages");
controller.messenger = messenger;
controller.channel = new MethodChannel(messenger, "OneSignal#inAppMessages");
controller.channel.setMethodCallHandler(controller);
controller.flutterRegistrar = registrar;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicBoolean;

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;
Expand All @@ -21,8 +22,8 @@ class OSFlutterOutcomeEventsHandler extends FlutterRegistrarResponder implements
// this property guarantees the callback will never be called more than once.
private AtomicBoolean replySubmitted = new AtomicBoolean(false);

OSFlutterOutcomeEventsHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result result) {
this.flutterRegistrar = flutterRegistrar;
OSFlutterOutcomeEventsHandler(BinaryMessenger messenger, MethodChannel channel, Result result) {
this.messenger = messenger;
this.channel = channel;
this.result = result;
}
Expand All @@ -42,14 +43,12 @@ public void onSuccess(OSOutcomeEvent outcomeEvent) {

public class OneSignalOutcomeEventsController extends FlutterRegistrarResponder implements MethodCallHandler {
private MethodChannel channel;
private Registrar registrar;

static void registerWith(Registrar registrar) {
static void registerWith(BinaryMessenger messenger) {
OneSignalOutcomeEventsController controller = new OneSignalOutcomeEventsController();
controller.registrar = registrar;
controller.channel = new MethodChannel(registrar.messenger(), "OneSignal#outcomes");
controller.messenger = messenger;
controller.channel = new MethodChannel(messenger, "OneSignal#outcomes");
controller.channel.setMethodCallHandler(controller);
controller.flutterRegistrar = registrar;
}

@Override
Expand All @@ -72,7 +71,7 @@ private void sendOutcome(MethodCall call, Result result) {
return;
}

OneSignal.sendOutcome(name, new OSFlutterOutcomeEventsHandler(registrar, channel, result));
OneSignal.sendOutcome(name, new OSFlutterOutcomeEventsHandler(messenger, channel, result));
}

private void sendUniqueOutcome(MethodCall call, Result result) {
Expand All @@ -83,7 +82,7 @@ private void sendUniqueOutcome(MethodCall call, Result result) {
return;
}

OneSignal.sendUniqueOutcome(name, new OSFlutterOutcomeEventsHandler(registrar, channel, result));
OneSignal.sendUniqueOutcome(name, new OSFlutterOutcomeEventsHandler(messenger, channel, result));
}

private void sendOutcomeWithValue(MethodCall call, Result result) {
Expand All @@ -100,7 +99,7 @@ private void sendOutcomeWithValue(MethodCall call, Result result) {
return;
}

OneSignal.sendOutcomeWithValue(name, value.floatValue(), new OSFlutterOutcomeEventsHandler(registrar, channel, result));
OneSignal.sendOutcomeWithValue(name, value.floatValue(), new OSFlutterOutcomeEventsHandler(messenger, channel, result));
}

}
99 changes: 66 additions & 33 deletions android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.onesignal.flutter;

import android.annotation.SuppressLint;
import android.content.Context;

import com.onesignal.OSDeviceState;
Expand All @@ -25,6 +26,9 @@
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
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;
Expand All @@ -36,7 +40,8 @@
/** OnesignalPlugin */
public class OneSignalPlugin
extends FlutterRegistrarResponder
implements MethodCallHandler,
implements FlutterPlugin,
MethodCallHandler,
OneSignal.OSNotificationOpenedHandler,
OneSignal.OSInAppMessageClickHandler,
OSSubscriptionObserver,
Expand All @@ -52,32 +57,61 @@ public class OneSignalPlugin
private boolean hasSetRequiresPrivacyConsent = false;
private boolean waitingForUserPrivacyConsent = false;

private HashMap<String, OSNotificationReceivedEvent> notificationReceivedEventCache = new HashMap<>();
private final HashMap<String, OSNotificationReceivedEvent> notificationReceivedEventCache = new HashMap<>();

public OneSignalPlugin() {
}

private void init(Context context, BinaryMessenger messenger)
{
this.context = context;
this.messenger = messenger;

public static void registerWith(Registrar registrar) {
OneSignal.sdkType = "flutter";

OneSignalPlugin plugin = new OneSignalPlugin();
waitingForUserPrivacyConsent = false;
channel = new MethodChannel(messenger, "OneSignal");
channel.setMethodCallHandler(this);

OneSignalTagsController.registerWith(messenger);
OneSignalInAppMessagingController.registerWith(messenger);
OneSignalOutcomeEventsController.registerWith(messenger);
}

@Override
public void onAttachedToEngine(@NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
init(
flutterPluginBinding.getApplicationContext(),
flutterPluginBinding.getBinaryMessenger()
);
}

@Override
public void onDetachedFromEngine(@NonNull FlutterPlugin.FlutterPluginBinding binding) {
onDetachedFromEngine();
}

private void onDetachedFromEngine() {
OneSignal.setNotificationOpenedHandler(null);
OneSignal.setInAppMessageClickHandler(null);
}

plugin.waitingForUserPrivacyConsent = false;
plugin.channel = new MethodChannel(registrar.messenger(), "OneSignal");
plugin.channel.setMethodCallHandler(plugin);
plugin.flutterRegistrar = registrar;
// This static method is only to remain compatible with apps that don’t use the v2 Android embedding.
@Deprecated()
@SuppressLint("Registrar")
public static void registerWith(Registrar registrar) {
final OneSignalPlugin plugin = new OneSignalPlugin();
plugin.init(registrar.context(), registrar.messenger());

// Create a callback for the flutterRegistrar to connect the applications onDestroy
plugin.flutterRegistrar.addViewDestroyListener(new PluginRegistry.ViewDestroyListener() {
registrar.addViewDestroyListener(new PluginRegistry.ViewDestroyListener() {
@Override
public boolean onViewDestroy(FlutterNativeView flutterNativeView) {
// Remove all handlers so they aren't triggered with wrong context
OneSignal.setNotificationOpenedHandler(null);
OneSignal.setInAppMessageClickHandler(null);
plugin.onDetachedFromEngine();
return false;
}
});

OneSignalTagsController.registerWith(registrar);
OneSignalInAppMessagingController.registerWith(registrar);
OneSignalOutcomeEventsController.registerWith(registrar);
}

@Override
Expand Down Expand Up @@ -145,7 +179,6 @@ private void disablePush(MethodCall call, Result result) {

private void setAppId(MethodCall call, Result reply) {
String appId = call.argument("appId");
Context context = flutterRegistrar.activeContext();

OneSignal.setInAppMessageClickHandler(this);
OneSignal.initWithContext(context);
Expand Down Expand Up @@ -231,7 +264,7 @@ private void getDeviceState(Result reply) {

private void postNotification(MethodCall call, final Result reply) {
JSONObject json = new JSONObject((Map<String, Object>) call.arguments);
OneSignal.postNotification(json, new OSFlutterPostNotificationHandler(flutterRegistrar, channel, reply, "postNotification"));
OneSignal.postNotification(json, new OSFlutterPostNotificationHandler(messenger, channel, reply, "postNotification"));
}

private void promptLocation(Result reply) {
Expand All @@ -248,22 +281,22 @@ private void setEmail(MethodCall call, final Result reply) {
String email = call.argument("email");
String emailAuthHashToken = call.argument("emailAuthHashToken");

OneSignal.setEmail(email, emailAuthHashToken, new OSFlutterEmailHandler(flutterRegistrar, channel, reply, "setEmail"));
OneSignal.setEmail(email, emailAuthHashToken, new OSFlutterEmailHandler(messenger, channel, reply, "setEmail"));
}

private void logoutEmail(final Result reply) {
OneSignal.logoutEmail(new OSFlutterEmailHandler(flutterRegistrar, channel, reply, "logoutEmail"));
OneSignal.logoutEmail(new OSFlutterEmailHandler(messenger, channel, reply, "logoutEmail"));
}

private void setSMSNumber(MethodCall call, final Result reply) {
String smsNumber = call.argument("smsNumber");
String smsAuthHashToken = call.argument("smsAuthHashToken");

OneSignal.setSMSNumber(smsNumber, smsAuthHashToken, new OSFlutterSMSHandler(flutterRegistrar, channel, reply, "setSMSNumber"));
OneSignal.setSMSNumber(smsNumber, smsAuthHashToken, new OSFlutterSMSHandler(messenger, channel, reply, "setSMSNumber"));
}

private void logoutSMSNumber(final Result reply) {
OneSignal.logoutSMSNumber(new OSFlutterSMSHandler(flutterRegistrar, channel, reply, "logoutSMSNumber"));
OneSignal.logoutSMSNumber(new OSFlutterSMSHandler(messenger, channel, reply, "logoutSMSNumber"));
}

private void setLanguage(MethodCall call, final Result result) {
Expand All @@ -282,11 +315,11 @@ private void setExternalUserId(MethodCall call, final Result result) {
if (authHashToken != null && authHashToken.length() == 0)
authHashToken = null;

OneSignal.setExternalUserId(externalUserId, authHashToken, new OSFlutterExternalUserIdHandler(flutterRegistrar, channel, result, "setExternalUserId"));
OneSignal.setExternalUserId(externalUserId, authHashToken, new OSFlutterExternalUserIdHandler(messenger, channel, result, "setExternalUserId"));
}

private void removeExternalUserId(final Result result) {
OneSignal.removeExternalUserId(new OSFlutterExternalUserIdHandler(flutterRegistrar, channel, result, "removeExternalUserId"));
OneSignal.removeExternalUserId(new OSFlutterExternalUserIdHandler(messenger, channel, result, "removeExternalUserId"));
}

private void initNotificationOpenedHandlerParams() {
Expand Down Expand Up @@ -399,8 +432,8 @@ public void notificationWillShowInForeground(OSNotificationReceivedEvent notific
static class OSFlutterEmailHandler extends OSFlutterHandler
implements OneSignal.EmailUpdateHandler {

OSFlutterEmailHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
super(flutterRegistrar, channel, res, methodName);
OSFlutterEmailHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
super(messenger, channel, res, methodName);
}

@Override
Expand All @@ -427,8 +460,8 @@ public void onFailure(EmailUpdateError error) {
static class OSFlutterSMSHandler extends OSFlutterHandler
implements OneSignal.OSSMSUpdateHandler {

OSFlutterSMSHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
super(flutterRegistrar, channel, res, methodName);
OSFlutterSMSHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
super(messenger, channel, res, methodName);
}

@Override
Expand Down Expand Up @@ -457,8 +490,8 @@ public void onFailure(OneSignal.OSSMSUpdateError error) {
static class OSFlutterExternalUserIdHandler extends OSFlutterHandler
implements OneSignal.OSExternalUserIdUpdateCompletionHandler {

OSFlutterExternalUserIdHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
super(flutterRegistrar, channel, res, methodName);
OSFlutterExternalUserIdHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
super(messenger, channel, res, methodName);
}

@Override
Expand Down Expand Up @@ -487,8 +520,8 @@ public void onFailure(OneSignal.ExternalIdError error) {
static class OSFlutterPostNotificationHandler extends OSFlutterHandler
implements OneSignal.PostNotificationResponseHandler {

OSFlutterPostNotificationHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
super(flutterRegistrar, channel, res, methodName);
OSFlutterPostNotificationHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
super(messenger, channel, res, methodName);
}

@Override
Expand Down Expand Up @@ -525,8 +558,8 @@ static class OSFlutterHandler extends FlutterRegistrarResponder {
protected final String methodName;
protected final AtomicBoolean replySubmitted = new AtomicBoolean(false);

OSFlutterHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
this.flutterRegistrar = flutterRegistrar;
OSFlutterHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
this.messenger = messenger;
this.channel = channel;
this.result = res;
this.methodName = methodName;
Expand Down
Loading

0 comments on commit 952e78c

Please sign in to comment.