diff --git a/.gitignore b/.gitignore index ccd9688e..4999ea3b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,12 @@ pubspec.lock build/ -.idea/ -android/.idea \ No newline at end of file +android/.idea +.flutter-plugins-dependencies +flutter_export_environment.sh + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ \ No newline at end of file diff --git a/android/src/main/java/com/onesignal/flutter/FlutterRegistrarResponder.java b/android/src/main/java/com/onesignal/flutter/FlutterRegistrarResponder.java index 05b2d3f6..b55b32fb 100644 --- a/android/src/main/java/com/onesignal/flutter/FlutterRegistrarResponder.java +++ b/android/src/main/java/com/onesignal/flutter/FlutterRegistrarResponder.java @@ -1,5 +1,6 @@ package com.onesignal.flutter; +import android.content.Context; import android.os.Handler; import android.os.Looper; @@ -7,12 +8,14 @@ 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 diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessagingController.java b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessagingController.java index 8db1c351..e35714ad 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessagingController.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessagingController.java @@ -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; @@ -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 diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalOutcomeEventsController.java b/android/src/main/java/com/onesignal/flutter/OneSignalOutcomeEventsController.java index 74d9508b..b9ce73ce 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalOutcomeEventsController.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalOutcomeEventsController.java @@ -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; @@ -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; } @@ -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 @@ -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) { @@ -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) { @@ -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)); } } \ No newline at end of file diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 129868fa..a63622c7 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -1,5 +1,6 @@ package com.onesignal.flutter; +import android.annotation.SuppressLint; import android.content.Context; import com.onesignal.OSDeviceState; @@ -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; @@ -36,7 +40,8 @@ /** OnesignalPlugin */ public class OneSignalPlugin extends FlutterRegistrarResponder - implements MethodCallHandler, + implements FlutterPlugin, + MethodCallHandler, OneSignal.OSNotificationOpenedHandler, OneSignal.OSInAppMessageClickHandler, OSSubscriptionObserver, @@ -52,32 +57,61 @@ public class OneSignalPlugin private boolean hasSetRequiresPrivacyConsent = false; private boolean waitingForUserPrivacyConsent = false; - private HashMap notificationReceivedEventCache = new HashMap<>(); + private final HashMap 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 @@ -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); @@ -231,7 +264,7 @@ private void getDeviceState(Result reply) { private void postNotification(MethodCall call, final Result reply) { JSONObject json = new JSONObject((Map) 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) { @@ -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) { @@ -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() { @@ -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 @@ -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 @@ -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 @@ -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 @@ -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; diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalTagsController.java b/android/src/main/java/com/onesignal/flutter/OneSignalTagsController.java index d4db16fd..9486aabc 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalTagsController.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalTagsController.java @@ -11,6 +11,7 @@ import java.util.Map; 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; @@ -30,8 +31,8 @@ class OSFlutterChangeTagsHandler extends FlutterRegistrarResponder implements Ch // this property guarantees the callback will never be called more than once. private AtomicBoolean replySubmitted = new AtomicBoolean(false); - OSFlutterChangeTagsHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res) { - this.flutterRegistrar = flutterRegistrar; + OSFlutterChangeTagsHandler(BinaryMessenger messenger, MethodChannel channel, Result res) { + this.messenger = messenger; this.channel = channel; this.result = res; } @@ -71,14 +72,12 @@ public void tagsAvailable(JSONObject jsonObject) { public class OneSignalTagsController extends FlutterRegistrarResponder implements MethodCallHandler { private MethodChannel channel; - private Registrar registrar; - static void registerWith(Registrar registrar) { + static void registerWith(BinaryMessenger messenger) { OneSignalTagsController controller = new OneSignalTagsController(); - controller.registrar = registrar; - controller.channel = new MethodChannel(registrar.messenger(), "OneSignal#tags"); + controller.messenger = messenger; + controller.channel = new MethodChannel(messenger, "OneSignal#tags"); controller.channel.setMethodCallHandler(controller); - controller.flutterRegistrar = registrar; } @Override @@ -94,14 +93,14 @@ else if (call.method.contentEquals("OneSignal#deleteTags")) } private void getTags(MethodCall call, Result result) { - OneSignal.getTags(new OSFlutterChangeTagsHandler(registrar, channel, result)); + OneSignal.getTags(new OSFlutterChangeTagsHandler(messenger, channel, result)); } private void sendTags(MethodCall call, Result result) { // call.arguments is being casted to a Map so a try-catch with // a ClassCastException will be thrown try { - OneSignal.sendTags(new JSONObject((Map) call.arguments), new OSFlutterChangeTagsHandler(registrar, channel, result)); + OneSignal.sendTags(new JSONObject((Map) call.arguments), new OSFlutterChangeTagsHandler(messenger, channel, result)); } catch(ClassCastException e) { replyError(result, "OneSignal", "sendTags failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null); } @@ -111,7 +110,7 @@ private void deleteTags(MethodCall call, Result result) { // call.arguments is being casted to a List so a try-catch with // a ClassCastException will be thrown try { - OneSignal.deleteTags((List) call.arguments, new OSFlutterChangeTagsHandler(registrar, channel, result)); + OneSignal.deleteTags((List) call.arguments, new OSFlutterChangeTagsHandler(messenger, channel, result)); } catch(ClassCastException e) { replyError(result, "OneSignal", "deleteTags failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null); } diff --git a/example/.gitignore b/example/.gitignore index dee655cc..18d5e693 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -7,3 +7,5 @@ build/ .flutter-plugins +.flutter-plugins-dependencies +flutter_export_environment.sh \ No newline at end of file diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index fba2fd08..b348a0c1 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -19,7 +19,6 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - + + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" + /> + + + + diff --git a/example/android/app/src/main/java/com/onesignal/onesignalexample/MainActivity.java b/example/android/app/src/main/java/com/onesignal/onesignalexample/MainActivity.java index c8ac8c4a..30811875 100644 --- a/example/android/app/src/main/java/com/onesignal/onesignalexample/MainActivity.java +++ b/example/android/app/src/main/java/com/onesignal/onesignalexample/MainActivity.java @@ -1,13 +1,6 @@ package com.onesignal.onesignalexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } } diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml index 00fa4417..723556da 100644 --- a/example/android/app/src/main/res/values/styles.xml +++ b/example/android/app/src/main/res/values/styles.xml @@ -5,4 +5,7 @@ Flutter draws its first frame --> @drawable/launch_background +