diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java b/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java index 5b92a503..c50a4e8e 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java @@ -9,9 +9,19 @@ import io.flutter.plugin.common.MethodChannel.Result; public class OneSignalDebug extends FlutterMessengerResponder implements MethodCallHandler { + private static OneSignalDebug sharedInstance; + + public static OneSignalDebug getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalDebug(); + } + return sharedInstance; + } + + private OneSignalDebug() {} static void registerWith(BinaryMessenger messenger) { - OneSignalDebug controller = new OneSignalDebug(); + OneSignalDebug controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#debug"); controller.channel.setMethodCallHandler(controller); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java index 7d2a29c0..a1fee5b5 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java @@ -20,13 +20,23 @@ public class OneSignalInAppMessages extends FlutterMessengerResponder implements MethodCallHandler, IInAppMessageClickListener, IInAppMessageLifecycleListener { + private static OneSignalInAppMessages sharedInstance; + + public static OneSignalInAppMessages getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalInAppMessages(); + } + return sharedInstance; + } + + private OneSignalInAppMessages() {} static void registerWith(BinaryMessenger messenger) { - OneSignalInAppMessages sharedInstance = new OneSignalInAppMessages(); + OneSignalInAppMessages controller = getSharedInstance(); - sharedInstance.messenger = messenger; - sharedInstance.channel = new MethodChannel(messenger, "OneSignal#inappmessages"); - sharedInstance.channel.setMethodCallHandler(sharedInstance); + controller.messenger = messenger; + controller.channel = new MethodChannel(messenger, "OneSignal#inappmessages"); + controller.channel.setMethodCallHandler(controller); } @Override @@ -89,7 +99,9 @@ private void paused(MethodCall call, Result result) { } public void lifecycleInit(Result result) { + OneSignal.getInAppMessages().removeLifecycleListener(this); OneSignal.getInAppMessages().addLifecycleListener(this); + OneSignal.getInAppMessages().removeClickListener(this); OneSignal.getInAppMessages().addClickListener(this); replySuccess(result, null); } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java b/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java index e7549a01..b209c6f4 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java @@ -9,9 +9,19 @@ import io.flutter.plugin.common.MethodChannel.Result; public class OneSignalLocation extends FlutterMessengerResponder implements MethodCallHandler { + private static OneSignalLocation sharedInstance; + + public static OneSignalLocation getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalLocation(); + } + return sharedInstance; + } + + private OneSignalLocation() {} static void registerWith(BinaryMessenger messenger) { - OneSignalLocation controller = new OneSignalLocation(); + OneSignalLocation controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#location"); controller.channel.setMethodCallHandler(controller); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java index 869fb9a6..11ce9456 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java @@ -24,9 +24,20 @@ public class OneSignalNotifications extends FlutterMessengerResponder implements MethodCallHandler, INotificationClickListener, INotificationLifecycleListener, IPermissionObserver { + private static OneSignalNotifications sharedInstance; + private final HashMap notificationOnWillDisplayEventCache = new HashMap<>(); private final HashMap preventedDefaultCache = new HashMap<>(); + public static OneSignalNotifications getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalNotifications(); + } + return sharedInstance; + } + + private OneSignalNotifications() {} + /** * A helper class to encapsulate invoking the suspending function [requestPermission] in Java. * To support API level < 24, the SDK cannot use the OneSignal-defined [Continue.with] helper method. @@ -61,7 +72,7 @@ public void resumeWith(@NonNull Object o) { } static void registerWith(BinaryMessenger messenger) { - OneSignalNotifications controller = new OneSignalNotifications(); + OneSignalNotifications controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#notifications"); controller.channel.setMethodCallHandler(controller); @@ -216,12 +227,17 @@ public void onNotificationPermissionChange(boolean permission) { } private void lifecycleInit(Result result) { + OneSignal.getNotifications().removeForegroundLifecycleListener(this); OneSignal.getNotifications().addForegroundLifecycleListener(this); + OneSignal.getNotifications().removePermissionObserver(this); OneSignal.getNotifications().addPermissionObserver(this); + notificationOnWillDisplayEventCache.clear(); + preventedDefaultCache.clear(); replySuccess(result, null); } private void registerClickListener() { + OneSignal.getNotifications().removeClickListener(this); OneSignal.getNotifications().addClickListener(this); } } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java index c0b1ca0b..bb5bdc2e 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java @@ -13,9 +13,19 @@ public class OneSignalPushSubscription extends FlutterMessengerResponder implements MethodCallHandler, IPushSubscriptionObserver { + private static OneSignalPushSubscription sharedInstance; + + public static OneSignalPushSubscription getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalPushSubscription(); + } + return sharedInstance; + } + + private OneSignalPushSubscription() {} static void registerWith(BinaryMessenger messenger) { - OneSignalPushSubscription controller = new OneSignalPushSubscription(); + OneSignalPushSubscription controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#pushsubscription"); controller.channel.setMethodCallHandler(controller); @@ -46,6 +56,7 @@ private void optOut(MethodCall call, Result reply) { } private void lifecycleInit(Result result) { + OneSignal.getUser().getPushSubscription().removeObserver(this); OneSignal.getUser().getPushSubscription().addObserver(this); replySuccess(result, null); } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalSession.java b/android/src/main/java/com/onesignal/flutter/OneSignalSession.java index 19d1ce49..ae3a3637 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalSession.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalSession.java @@ -8,9 +8,19 @@ import io.flutter.plugin.common.MethodChannel.Result; public class OneSignalSession extends FlutterMessengerResponder implements MethodCallHandler { + private static OneSignalSession sharedInstance; + + public static OneSignalSession getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalSession(); + } + return sharedInstance; + } + + private OneSignalSession() {} static void registerWith(BinaryMessenger messenger) { - OneSignalSession controller = new OneSignalSession(); + OneSignalSession controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#session"); controller.channel.setMethodCallHandler(controller); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalUser.java b/android/src/main/java/com/onesignal/flutter/OneSignalUser.java index 835aed50..d5116622 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalUser.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalUser.java @@ -14,9 +14,19 @@ import org.json.JSONException; public class OneSignalUser extends FlutterMessengerResponder implements MethodCallHandler, IUserStateObserver { + private static OneSignalUser sharedInstance; + + public static OneSignalUser getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalUser(); + } + return sharedInstance; + } + + private OneSignalUser() {} static void registerWith(BinaryMessenger messenger) { - OneSignalUser controller = new OneSignalUser(); + OneSignalUser controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#user"); controller.channel.setMethodCallHandler(controller); @@ -50,6 +60,7 @@ private void setLanguage(MethodCall call, Result result) { } private void lifecycleInit(Result result) { + OneSignal.getUser().removeObserver(this); OneSignal.getUser().addObserver(this); replySuccess(result, null); } diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec deleted file mode 100644 index 3aed58d3..00000000 --- a/example/ios/Flutter/Flutter.podspec +++ /dev/null @@ -1,18 +0,0 @@ -# -# This podspec is NOT to be published. It is only used as a local source! -# This is a generated file; do not edit or check into version control. -# - -Pod::Spec.new do |s| - s.name = 'Flutter' - s.version = '1.0.0' - s.summary = 'A UI toolkit for beautiful and fast apps.' - s.homepage = 'https://flutter.dev' - s.license = { :type => 'BSD' } - s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '13.0' - # Framework linking is handled by Flutter tooling, not CocoaPods. - # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. - s.vendored_frameworks = 'path/to/nothing' -end diff --git a/example/lib/main.dart b/example/lib/main.dart index b77b9201..707166fe 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -66,16 +66,13 @@ class _MyAppState extends State { }); OneSignal.Notifications.addClickListener((event) { - print('NOTIFICATION CLICK LISTENER CALLED WITH EVENT: $event'); - this.setState(() { - _debugLabelString = - "Clicked notification: \n${event.notification.jsonRepresentation().replaceAll("\\n", "\n")}"; - }); + print( + 'NOTIFICATION CLICK LISTENER CALLED WITH EVENT: ${event.notification.title}'); }); OneSignal.Notifications.addForegroundWillDisplayListener((event) { print( - 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.jsonRepresentation()}'); + 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.title}'); /// Display Notification, preventDefault to not display event.preventDefault(); diff --git a/ios/Classes/OSFlutterInAppMessages.m b/ios/Classes/OSFlutterInAppMessages.m index a8f538a3..8acbaefd 100644 --- a/ios/Classes/OSFlutterInAppMessages.m +++ b/ios/Classes/OSFlutterInAppMessages.m @@ -107,10 +107,15 @@ - (void)paused:(FlutterMethodCall *)call withResult:(FlutterResult)result { - (void)lifecycleInit:(FlutterMethodCall *)call withResult:(FlutterResult)result { + [OneSignal.InAppMessages + removeClickListener:OSFlutterInAppMessages.sharedInstance]; [OneSignal.InAppMessages addClickListener:OSFlutterInAppMessages.sharedInstance]; + [OneSignal.InAppMessages + removeLifecycleListener:OSFlutterInAppMessages.sharedInstance]; [OneSignal.InAppMessages addLifecycleListener:OSFlutterInAppMessages.sharedInstance]; + result(nil); } #pragma mark In App Message Click diff --git a/ios/Classes/OSFlutterNotifications.m b/ios/Classes/OSFlutterNotifications.m index 242ee4b4..cbe71d01 100644 --- a/ios/Classes/OSFlutterNotifications.m +++ b/ios/Classes/OSFlutterNotifications.m @@ -116,13 +116,16 @@ - (void)registerForProvisionalAuthorization:(FlutterMethodCall *)call - (void)lifecycleInit:(FlutterMethodCall *)call withResult:(FlutterResult)result { + [OneSignal.Notifications removeForegroundLifecycleListener:self]; [OneSignal.Notifications addForegroundLifecycleListener:self]; + [OneSignal.Notifications removePermissionObserver:self]; [OneSignal.Notifications addPermissionObserver:self]; result(nil); } - (void)registerClickListener:(FlutterMethodCall *)call withResult:(FlutterResult)result { + [OneSignal.Notifications removeClickListener:self]; [OneSignal.Notifications addClickListener:self]; result(nil); } diff --git a/ios/Classes/OSFlutterPushSubscription.m b/ios/Classes/OSFlutterPushSubscription.m index 45b41aa2..785a21a4 100644 --- a/ios/Classes/OSFlutterPushSubscription.m +++ b/ios/Classes/OSFlutterPushSubscription.m @@ -32,14 +32,23 @@ @implementation OSFlutterPushSubscription -+ (void)registerWithRegistrar:(NSObject *)registrar { - OSFlutterPushSubscription *instance = [OSFlutterPushSubscription new]; ++ (instancetype)sharedInstance { + static OSFlutterPushSubscription *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [OSFlutterPushSubscription new]; + }); + return sharedInstance; +} - instance.channel = ++ (void)registerWithRegistrar:(NSObject *)registrar { + OSFlutterPushSubscription.sharedInstance.channel = [FlutterMethodChannel methodChannelWithName:@"OneSignal#pushsubscription" binaryMessenger:[registrar messenger]]; - [registrar addMethodCallDelegate:instance channel:instance.channel]; + [registrar + addMethodCallDelegate:OSFlutterPushSubscription.sharedInstance + channel:OSFlutterPushSubscription.sharedInstance.channel]; } - (void)handleMethodCall:(FlutterMethodCall *)call @@ -72,6 +81,7 @@ - (void)optOut:(FlutterMethodCall *)call withResult:(FlutterResult)result { - (void)lifecycleInit:(FlutterMethodCall *)call withResult:(FlutterResult)result { + [OneSignal.User.pushSubscription removeObserver:self]; [OneSignal.User.pushSubscription addObserver:self]; result(nil); } diff --git a/ios/Classes/OSFlutterUser.h b/ios/Classes/OSFlutterUser.h index 67042f59..f0de67fe 100644 --- a/ios/Classes/OSFlutterUser.h +++ b/ios/Classes/OSFlutterUser.h @@ -32,4 +32,6 @@ @property(strong, nonatomic) FlutterMethodChannel *channel; ++ (instancetype)sharedInstance; + @end diff --git a/ios/Classes/OSFlutterUser.m b/ios/Classes/OSFlutterUser.m index 165b9ef8..8e487609 100644 --- a/ios/Classes/OSFlutterUser.m +++ b/ios/Classes/OSFlutterUser.m @@ -31,14 +31,22 @@ #import @implementation OSFlutterUser -+ (void)registerWithRegistrar:(NSObject *)registrar { - OSFlutterUser *instance = [OSFlutterUser new]; ++ (instancetype)sharedInstance { + static OSFlutterUser *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [OSFlutterUser new]; + }); + return sharedInstance; +} - instance.channel = ++ (void)registerWithRegistrar:(NSObject *)registrar { + OSFlutterUser.sharedInstance.channel = [FlutterMethodChannel methodChannelWithName:@"OneSignal#user" binaryMessenger:[registrar messenger]]; - [registrar addMethodCallDelegate:instance channel:instance.channel]; + [registrar addMethodCallDelegate:OSFlutterUser.sharedInstance + channel:OSFlutterUser.sharedInstance.channel]; [OSFlutterPushSubscription registerWithRegistrar:registrar]; } @@ -139,6 +147,7 @@ - (void)removeSms:(FlutterMethodCall *)call withResult:(FlutterResult)result { - (void)lifecycleInit:(FlutterMethodCall *)call withResult:(FlutterResult)result { + [OneSignal.User removeObserver:self]; [OneSignal.User addObserver:self]; result(nil); }