From 60e2ac19ab6d490bff6a41969e01ecef617002e6 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Fri, 19 Dec 2025 16:55:42 -0800 Subject: [PATCH 1/3] fix logic for android hot restarts --- .../com/onesignal/flutter/OneSignalDebug.java | 14 ++++- .../flutter/OneSignalInAppMessages.java | 56 ++++++++++--------- .../onesignal/flutter/OneSignalLocation.java | 12 +++- .../flutter/OneSignalNotifications.java | 26 +++++++-- .../onesignal/flutter/OneSignalPlugin.java | 37 ++++++------ .../flutter/OneSignalPushSubscription.java | 21 ++++--- .../onesignal/flutter/OneSignalSession.java | 12 +++- .../com/onesignal/flutter/OneSignalUser.java | 16 +++++- example/ios/Flutter/Flutter.podspec | 18 ------ example/lib/main.dart | 5 +- ios/Classes/OSFlutterInAppMessages.m | 5 ++ ios/Classes/OSFlutterNotifications.m | 3 + ios/Classes/OSFlutterPushSubscription.m | 18 ++++-- ios/Classes/OSFlutterUser.h | 2 + ios/Classes/OSFlutterUser.m | 17 ++++-- 15 files changed, 170 insertions(+), 92 deletions(-) delete mode 100644 example/ios/Flutter/Flutter.podspec diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java b/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java index 5b92a503..8fc5c02d 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; - static void registerWith(BinaryMessenger messenger) { - OneSignalDebug controller = new OneSignalDebug(); + public static OneSignalDebug getSharedInstance() { + if (sharedInstance == null) { + sharedInstance = new OneSignalDebug(); + } + return sharedInstance; + } + + private OneSignalDebug() { } + + static void registerWith(BinaryMessenger messenger) { + 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..559e9bd8 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java @@ -18,15 +18,25 @@ import java.util.Map; import org.json.JSONException; -public class OneSignalInAppMessages extends FlutterMessengerResponder - implements MethodCallHandler, IInAppMessageClickListener, IInAppMessageLifecycleListener { +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); } @@ -101,34 +113,27 @@ public void onClick(IInAppMessageClickEvent event) { "OneSignal#onClickInAppMessage", OneSignalSerializer.convertInAppMessageClickEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); - Logging.error( - "Encountered an error attempting to convert IInAppMessageClickEvent object to hash map:" - + e.toString(), - null); + Logging.error("Encountered an error attempting to convert IInAppMessageClickEvent object to hash map:" + e.toString(), null); } } @Override public void onWillDisplay(IInAppMessageWillDisplayEvent event) { try { - invokeMethodOnUiThread( - "OneSignal#onWillDisplayInAppMessage", - OneSignalSerializer.convertInAppMessageWillDisplayEventToMap(event)); + invokeMethodOnUiThread("OneSignal#onWillDisplayInAppMessage", + OneSignalSerializer.convertInAppMessageWillDisplayEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); - Logging.error( - "Encountered an error attempting to convert IInAppMessageWillDisplayEvent object to hash map:" - + e.toString(), - null); + Logging.error("Encountered an error attempting to convert IInAppMessageWillDisplayEvent object to hash map:" + e.toString(), null); } + } @Override public void onDidDisplay(IInAppMessageDidDisplayEvent event) { try { - invokeMethodOnUiThread( - "OneSignal#onDidDisplayInAppMessage", - OneSignalSerializer.convertInAppMessageDidDisplayEventToMap(event)); + invokeMethodOnUiThread("OneSignal#onDidDisplayInAppMessage", + OneSignalSerializer.convertInAppMessageDidDisplayEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -141,9 +146,8 @@ public void onDidDisplay(IInAppMessageDidDisplayEvent event) { @Override public void onWillDismiss(IInAppMessageWillDismissEvent event) { try { - invokeMethodOnUiThread( - "OneSignal#onWillDismissInAppMessage", - OneSignalSerializer.convertInAppMessageWillDismissEventToMap(event)); + invokeMethodOnUiThread("OneSignal#onWillDismissInAppMessage", + OneSignalSerializer.convertInAppMessageWillDismissEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -156,9 +160,8 @@ public void onWillDismiss(IInAppMessageWillDismissEvent event) { @Override public void onDidDismiss(IInAppMessageDidDismissEvent event) { try { - invokeMethodOnUiThread( - "OneSignal#onDidDismissInAppMessage", - OneSignalSerializer.convertInAppMessageDidDismissEventToMap(event)); + invokeMethodOnUiThread("OneSignal#onDidDismissInAppMessage", + OneSignalSerializer.convertInAppMessageDidDismissEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -166,5 +169,6 @@ public void onDidDismiss(IInAppMessageDidDismissEvent event) { + e.toString(), 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..92173d7b 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..d575ba74 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java @@ -22,11 +22,21 @@ import org.json.JSONException; import org.json.JSONObject; -public class OneSignalNotifications extends FlutterMessengerResponder - implements MethodCallHandler, INotificationClickListener, INotificationLifecycleListener, IPermissionObserver { +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 +71,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); @@ -117,8 +127,7 @@ private void clearAll(MethodCall call, Result result) { replySuccess(result, null); } - /// Our bridge layer needs to preventDefault() so that the Flutter listener has time to preventDefault() before the - // notification is displayed + /// Our bridge layer needs to preventDefault() so that the Flutter listener has time to preventDefault() before the notification is displayed /// This function is called after all of the flutter listeners have responded to the willDisplay event. /// If any of them have called preventDefault() we will not call display(). Otherwise we will display. private void proceedWithWillDisplay(MethodCall call, Result result) { @@ -209,19 +218,24 @@ public void onWillDisplay(INotificationWillDisplayEvent event) { } @Override - public void onNotificationPermissionChange(boolean permission) { + public void onNotificationPermissionChange(boolean permission) { HashMap hash = new HashMap<>(); hash.put("permission", permission); invokeMethodOnUiThread("OneSignal#onNotificationPermissionDidChange", hash); } 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/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 9d5ed6dd..8d62780e 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -19,12 +19,16 @@ public class OneSignalPlugin extends FlutterMessengerResponder public OneSignalPlugin() {} - private void init(Context context, BinaryMessenger messenger) { - this.context = context; - this.messenger = messenger; - OneSignalWrapper.setSdkType("flutter"); - // For 5.0.0, hard code to reflect SDK version - OneSignalWrapper.setSdkVersion("050305"); + private void init(Context context, BinaryMessenger messenger) + { + this.context = context; + this.messenger = messenger; + OneSignalWrapper.setSdkType("flutter"); + // For 5.0.0, hard code to reflect SDK version + OneSignalWrapper.setSdkVersion("050305"); + + channel = new MethodChannel(messenger, "OneSignal"); + channel.setMethodCallHandler(this); channel = new MethodChannel(messenger, "OneSignal"); channel.setMethodCallHandler(this); @@ -93,18 +97,13 @@ private void setConsentGiven(MethodCall call, Result reply) { replySuccess(reply, null); } - private void login(MethodCall call, Result result) { - OneSignal.login((String) call.argument("externalId")); - replySuccess(result, null); - } + private void loginWithJWT(MethodCall call, Result result) { + OneSignal.login((String) call.argument("externalId"), (String) call.argument("jwt")); + replySuccess(result, null); + } - private void loginWithJWT(MethodCall call, Result result) { - OneSignal.login((String) call.argument("externalId"), (String) call.argument("jwt")); - replySuccess(result, null); - } - - private void logout(MethodCall call, Result result) { - OneSignal.logout(); - replySuccess(result, null); - } + private void logout(MethodCall call, Result result) { + OneSignal.logout(); + replySuccess(result, null); + } } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java index c0b1ca0b..9b88504f 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java @@ -11,11 +11,20 @@ import io.flutter.plugin.common.MethodChannel.Result; import org.json.JSONException; -public class OneSignalPushSubscription extends FlutterMessengerResponder - implements MethodCallHandler, IPushSubscriptionObserver { +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 +55,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); } @@ -58,10 +68,7 @@ public void onPushSubscriptionChange(PushSubscriptionChangedState changeState) { OneSignalSerializer.convertOnPushSubscriptionChange(changeState)); } catch (JSONException e) { e.getStackTrace(); - Logging.error( - "Encountered an error attempting to convert PushSubscriptionChangedState object to hash map:" - + e.toString(), - null); + Logging.error("Encountered an error attempting to convert PushSubscriptionChangedState object to hash map:" + e.toString(), 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..a2188e7e 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..6448a27d 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalUser.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalUser.java @@ -13,10 +13,21 @@ import java.util.Map; import org.json.JSONException; -public class OneSignalUser extends FlutterMessengerResponder implements MethodCallHandler, IUserStateObserver { +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 +61,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..d1bc4136 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -74,8 +74,9 @@ class _MyAppState extends State { }); OneSignal.Notifications.addForegroundWillDisplayListener((event) { - print( - 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.jsonRepresentation()}'); + print("YO222222!"); + // print( + // 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.jsonRepresentation()}'); /// 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); } From d53ed413a7685387777677ed503437d920e09783 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Mon, 29 Dec 2025 13:52:05 -0800 Subject: [PATCH 2/3] fix formatting --- .../com/onesignal/flutter/OneSignalDebug.java | 4 +- .../flutter/OneSignalInAppMessages.java | 38 +++++++++++-------- .../onesignal/flutter/OneSignalLocation.java | 2 +- .../flutter/OneSignalNotifications.java | 10 +++-- .../onesignal/flutter/OneSignalPlugin.java | 33 ++++++++-------- .../flutter/OneSignalPushSubscription.java | 10 +++-- .../onesignal/flutter/OneSignalSession.java | 2 +- .../com/onesignal/flutter/OneSignalUser.java | 5 +-- 8 files changed, 58 insertions(+), 46 deletions(-) diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java b/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java index 8fc5c02d..c50a4e8e 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalDebug.java @@ -18,9 +18,9 @@ public static OneSignalDebug getSharedInstance() { return sharedInstance; } - private OneSignalDebug() { } + private OneSignalDebug() {} - static void registerWith(BinaryMessenger messenger) { + static void registerWith(BinaryMessenger messenger) { OneSignalDebug controller = getSharedInstance(); controller.messenger = messenger; controller.channel = new MethodChannel(messenger, "OneSignal#debug"); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java index 559e9bd8..a1fee5b5 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java @@ -18,8 +18,8 @@ import java.util.Map; import org.json.JSONException; -public class OneSignalInAppMessages extends FlutterMessengerResponder implements MethodCallHandler, -IInAppMessageClickListener, IInAppMessageLifecycleListener{ +public class OneSignalInAppMessages extends FlutterMessengerResponder + implements MethodCallHandler, IInAppMessageClickListener, IInAppMessageLifecycleListener { private static OneSignalInAppMessages sharedInstance; public static OneSignalInAppMessages getSharedInstance() { @@ -29,7 +29,7 @@ public static OneSignalInAppMessages getSharedInstance() { return sharedInstance; } - private OneSignalInAppMessages() { } + private OneSignalInAppMessages() {} static void registerWith(BinaryMessenger messenger) { OneSignalInAppMessages controller = getSharedInstance(); @@ -113,27 +113,34 @@ public void onClick(IInAppMessageClickEvent event) { "OneSignal#onClickInAppMessage", OneSignalSerializer.convertInAppMessageClickEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); - Logging.error("Encountered an error attempting to convert IInAppMessageClickEvent object to hash map:" + e.toString(), null); + Logging.error( + "Encountered an error attempting to convert IInAppMessageClickEvent object to hash map:" + + e.toString(), + null); } } @Override public void onWillDisplay(IInAppMessageWillDisplayEvent event) { try { - invokeMethodOnUiThread("OneSignal#onWillDisplayInAppMessage", - OneSignalSerializer.convertInAppMessageWillDisplayEventToMap(event)); + invokeMethodOnUiThread( + "OneSignal#onWillDisplayInAppMessage", + OneSignalSerializer.convertInAppMessageWillDisplayEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); - Logging.error("Encountered an error attempting to convert IInAppMessageWillDisplayEvent object to hash map:" + e.toString(), null); + Logging.error( + "Encountered an error attempting to convert IInAppMessageWillDisplayEvent object to hash map:" + + e.toString(), + null); } - } @Override public void onDidDisplay(IInAppMessageDidDisplayEvent event) { try { - invokeMethodOnUiThread("OneSignal#onDidDisplayInAppMessage", - OneSignalSerializer.convertInAppMessageDidDisplayEventToMap(event)); + invokeMethodOnUiThread( + "OneSignal#onDidDisplayInAppMessage", + OneSignalSerializer.convertInAppMessageDidDisplayEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -146,8 +153,9 @@ public void onDidDisplay(IInAppMessageDidDisplayEvent event) { @Override public void onWillDismiss(IInAppMessageWillDismissEvent event) { try { - invokeMethodOnUiThread("OneSignal#onWillDismissInAppMessage", - OneSignalSerializer.convertInAppMessageWillDismissEventToMap(event)); + invokeMethodOnUiThread( + "OneSignal#onWillDismissInAppMessage", + OneSignalSerializer.convertInAppMessageWillDismissEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -160,8 +168,9 @@ public void onWillDismiss(IInAppMessageWillDismissEvent event) { @Override public void onDidDismiss(IInAppMessageDidDismissEvent event) { try { - invokeMethodOnUiThread("OneSignal#onDidDismissInAppMessage", - OneSignalSerializer.convertInAppMessageDidDismissEventToMap(event)); + invokeMethodOnUiThread( + "OneSignal#onDidDismissInAppMessage", + OneSignalSerializer.convertInAppMessageDidDismissEventToMap(event)); } catch (JSONException e) { e.getStackTrace(); Logging.error( @@ -169,6 +178,5 @@ public void onDidDismiss(IInAppMessageDidDismissEvent event) { + e.toString(), null); } - } } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java b/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java index 92173d7b..b209c6f4 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalLocation.java @@ -18,7 +18,7 @@ public static OneSignalLocation getSharedInstance() { return sharedInstance; } - private OneSignalLocation() { } + private OneSignalLocation() {} static void registerWith(BinaryMessenger messenger) { OneSignalLocation controller = getSharedInstance(); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java index d575ba74..11ce9456 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java @@ -22,7 +22,8 @@ import org.json.JSONException; import org.json.JSONObject; -public class OneSignalNotifications extends FlutterMessengerResponder implements MethodCallHandler, INotificationClickListener, INotificationLifecycleListener, IPermissionObserver { +public class OneSignalNotifications extends FlutterMessengerResponder + implements MethodCallHandler, INotificationClickListener, INotificationLifecycleListener, IPermissionObserver { private static OneSignalNotifications sharedInstance; private final HashMap notificationOnWillDisplayEventCache = new HashMap<>(); @@ -35,7 +36,7 @@ public static OneSignalNotifications getSharedInstance() { return sharedInstance; } - private OneSignalNotifications() { } + private OneSignalNotifications() {} /** * A helper class to encapsulate invoking the suspending function [requestPermission] in Java. @@ -127,7 +128,8 @@ private void clearAll(MethodCall call, Result result) { replySuccess(result, null); } - /// Our bridge layer needs to preventDefault() so that the Flutter listener has time to preventDefault() before the notification is displayed + /// Our bridge layer needs to preventDefault() so that the Flutter listener has time to preventDefault() before the + // notification is displayed /// This function is called after all of the flutter listeners have responded to the willDisplay event. /// If any of them have called preventDefault() we will not call display(). Otherwise we will display. private void proceedWithWillDisplay(MethodCall call, Result result) { @@ -218,7 +220,7 @@ public void onWillDisplay(INotificationWillDisplayEvent event) { } @Override - public void onNotificationPermissionChange(boolean permission) { + public void onNotificationPermissionChange(boolean permission) { HashMap hash = new HashMap<>(); hash.put("permission", permission); invokeMethodOnUiThread("OneSignal#onNotificationPermissionDidChange", hash); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 8d62780e..68f30d94 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -19,16 +19,15 @@ public class OneSignalPlugin extends FlutterMessengerResponder public OneSignalPlugin() {} - private void init(Context context, BinaryMessenger messenger) - { - this.context = context; - this.messenger = messenger; - OneSignalWrapper.setSdkType("flutter"); - // For 5.0.0, hard code to reflect SDK version - OneSignalWrapper.setSdkVersion("050305"); + private void init(Context context, BinaryMessenger messenger) { + this.context = context; + this.messenger = messenger; + OneSignalWrapper.setSdkType("flutter"); + // For 5.0.0, hard code to reflect SDK version + OneSignalWrapper.setSdkVersion("050305"); - channel = new MethodChannel(messenger, "OneSignal"); - channel.setMethodCallHandler(this); + channel = new MethodChannel(messenger, "OneSignal"); + channel.setMethodCallHandler(this); channel = new MethodChannel(messenger, "OneSignal"); channel.setMethodCallHandler(this); @@ -97,13 +96,13 @@ private void setConsentGiven(MethodCall call, Result reply) { replySuccess(reply, null); } - private void loginWithJWT(MethodCall call, Result result) { - OneSignal.login((String) call.argument("externalId"), (String) call.argument("jwt")); - replySuccess(result, null); - } + private void loginWithJWT(MethodCall call, Result result) { + OneSignal.login((String) call.argument("externalId"), (String) call.argument("jwt")); + replySuccess(result, null); + } - private void logout(MethodCall call, Result result) { - OneSignal.logout(); - replySuccess(result, null); - } + private void logout(MethodCall call, Result result) { + OneSignal.logout(); + replySuccess(result, null); + } } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java index 9b88504f..bb5bdc2e 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPushSubscription.java @@ -11,7 +11,8 @@ import io.flutter.plugin.common.MethodChannel.Result; import org.json.JSONException; -public class OneSignalPushSubscription extends FlutterMessengerResponder implements MethodCallHandler, IPushSubscriptionObserver { +public class OneSignalPushSubscription extends FlutterMessengerResponder + implements MethodCallHandler, IPushSubscriptionObserver { private static OneSignalPushSubscription sharedInstance; public static OneSignalPushSubscription getSharedInstance() { @@ -21,7 +22,7 @@ public static OneSignalPushSubscription getSharedInstance() { return sharedInstance; } - private OneSignalPushSubscription() { } + private OneSignalPushSubscription() {} static void registerWith(BinaryMessenger messenger) { OneSignalPushSubscription controller = getSharedInstance(); @@ -68,7 +69,10 @@ public void onPushSubscriptionChange(PushSubscriptionChangedState changeState) { OneSignalSerializer.convertOnPushSubscriptionChange(changeState)); } catch (JSONException e) { e.getStackTrace(); - Logging.error("Encountered an error attempting to convert PushSubscriptionChangedState object to hash map:" + e.toString(), null); + Logging.error( + "Encountered an error attempting to convert PushSubscriptionChangedState object to hash map:" + + e.toString(), + null); } } } diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalSession.java b/android/src/main/java/com/onesignal/flutter/OneSignalSession.java index a2188e7e..ae3a3637 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalSession.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalSession.java @@ -17,7 +17,7 @@ public static OneSignalSession getSharedInstance() { return sharedInstance; } - private OneSignalSession() { } + private OneSignalSession() {} static void registerWith(BinaryMessenger messenger) { OneSignalSession controller = getSharedInstance(); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalUser.java b/android/src/main/java/com/onesignal/flutter/OneSignalUser.java index 6448a27d..d5116622 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalUser.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalUser.java @@ -13,8 +13,7 @@ import java.util.Map; import org.json.JSONException; -public class OneSignalUser extends FlutterMessengerResponder - implements MethodCallHandler, IUserStateObserver { +public class OneSignalUser extends FlutterMessengerResponder implements MethodCallHandler, IUserStateObserver { private static OneSignalUser sharedInstance; public static OneSignalUser getSharedInstance() { @@ -24,7 +23,7 @@ public static OneSignalUser getSharedInstance() { return sharedInstance; } - private OneSignalUser() { } + private OneSignalUser() {} static void registerWith(BinaryMessenger messenger) { OneSignalUser controller = getSharedInstance(); From c6360099b7410507adbc61741e6c6e84a0cb3edc Mon Sep 17 00:00:00 2001 From: Fadi George Date: Mon, 29 Dec 2025 14:52:29 -0800 Subject: [PATCH 3/3] update listener logs --- .../java/com/onesignal/flutter/OneSignalPlugin.java | 8 +++++--- example/lib/main.dart | 12 ++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 68f30d94..9d5ed6dd 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -29,9 +29,6 @@ private void init(Context context, BinaryMessenger messenger) { channel = new MethodChannel(messenger, "OneSignal"); channel.setMethodCallHandler(this); - channel = new MethodChannel(messenger, "OneSignal"); - channel.setMethodCallHandler(this); - OneSignalDebug.registerWith(messenger); OneSignalLocation.registerWith(messenger); OneSignalSession.registerWith(messenger); @@ -96,6 +93,11 @@ private void setConsentGiven(MethodCall call, Result reply) { replySuccess(reply, null); } + private void login(MethodCall call, Result result) { + OneSignal.login((String) call.argument("externalId")); + replySuccess(result, null); + } + private void loginWithJWT(MethodCall call, Result result) { OneSignal.login((String) call.argument("externalId"), (String) call.argument("jwt")); replySuccess(result, null); diff --git a/example/lib/main.dart b/example/lib/main.dart index d1bc4136..707166fe 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -66,17 +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("YO222222!"); - // print( - // 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.jsonRepresentation()}'); + print( + 'NOTIFICATION WILL DISPLAY LISTENER CALLED WITH: ${event.notification.title}'); /// Display Notification, preventDefault to not display event.preventDefault();