Skip to content

Commit 924bb48

Browse files
committed
Update In App Message click events
1 parent e88605d commit 924bb48

File tree

7 files changed

+106
-103
lines changed

7 files changed

+106
-103
lines changed

android/src/main/java/com/onesignal/flutter/OneSignalInAppMessages.java

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
import io.flutter.plugin.common.PluginRegistry.Registrar;
1818

1919
public class OneSignalInAppMessages extends FlutterRegistrarResponder implements MethodCallHandler,
20-
IInAppMessageClickHandler, IInAppMessageLifecycleListener{
21-
22-
private IInAppMessageClickResult inAppMessageClickedResult;
23-
private boolean hasSetInAppMessageClickedHandler = false;
20+
IInAppMessageClickListener, IInAppMessageLifecycleListener{
2421

2522
static void registerWith(BinaryMessenger messenger) {
2623
OneSignalInAppMessages sharedInstance = new OneSignalInAppMessages();
@@ -44,8 +41,6 @@ else if (call.method.contentEquals("OneSignal#arePaused"))
4441
replySuccess(result, OneSignal.getInAppMessages().getPaused());
4542
else if (call.method.contentEquals("OneSignal#paused"))
4643
this.paused(call, result);
47-
else if (call.method.contentEquals("OneSignal#initInAppMessageClickedHandlerParams"))
48-
this.initInAppMessageClickedHandlerParams();
4944
else if (call.method.contentEquals("OneSignal#lifecycleInit"))
5045
this.lifecycleInit();
5146
else
@@ -84,33 +79,16 @@ private void paused(MethodCall call, Result result) {
8479
replySuccess(result, null);
8580
}
8681

87-
private void initInAppMessageClickedHandlerParams() {
88-
this.hasSetInAppMessageClickedHandler = true;
89-
if (this.inAppMessageClickedResult != null) {
90-
this.inAppMessageClicked(this.inAppMessageClickedResult);
91-
this.inAppMessageClickedResult = null;
92-
}
93-
}
94-
9582
public void lifecycleInit() {
96-
this.setInAppMessageLifecycleHandler();
9783
OneSignal.getInAppMessages().addLifecycleListener(this);
84+
OneSignal.getInAppMessages().addClickListener(this);
9885
}
9986

100-
public void inAppMessageClicked(IInAppMessageClickResult action) {
101-
if (!this.hasSetInAppMessageClickedHandler) {
102-
this.inAppMessageClickedResult = action;
103-
return;
104-
}
105-
106-
invokeMethodOnUiThread("OneSignal#handleClickedInAppMessage", OneSignalSerializer.convertInAppMessageClickedActionToMap(action));
87+
@Override
88+
public void onClick(IInAppMessageClickEvent event) {
89+
invokeMethodOnUiThread("OneSignal#onClickInAppMessage", OneSignalSerializer.convertInAppMessageClickEventToMap(action));
10790
}
10891

109-
/* in app message lifecycle */
110-
public void setInAppMessageLifecycleHandler() {
111-
OneSignal.getInAppMessages().addInAppMessageLifecycleListener(this);
112-
}
113-
11492
@Override
11593
public void onWillDisplay(IInAppMessageWillDisplayEvent event) {
11694
invokeMethodOnUiThread("OneSignal#onWillDisplayInAppMessage",

android/src/main/java/com/onesignal/flutter/OneSignalSerializer.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,45 +101,53 @@ private static HashMap<String, Object> convertNotificationActionToMap(INotificat
101101
return hash;
102102
}
103103

104-
static HashMap<String, Object> convertInAppMessageClickedActionToMap(IInAppMessageClickResult result) {
104+
static HashMap<String, Object> convertInAppMessageClickEventToMap(IInAppMessageClickEvent event) {
105105
HashMap<String, Object> hash = new HashMap<>();
106106

107-
hash.put("click_name", result.getAction().getClickName());
108-
hash.put("click_url", result.getAction().getClickUrl());
109-
hash.put("first_click", result.getAction().isFirstClick());
110-
hash.put("closes_message", result.getAction().getClosesMessage());
107+
hash.put("message", convertInAppMessageToMap(event.getMessage()));
108+
hash.put("result", convertInAppMessageClickResultToMap(event.getResult()));
109+
110+
return hash;
111+
}
112+
113+
static HashMap<String, Object> convertInAppMessageClicResultToMap(IInAppMessageClickResult result) {
114+
HashMap<String, Object> hash = new HashMap<>();
115+
116+
hash.put("action_id", result.getActionId());
117+
hash.put("url", result.getUrl());
118+
hash.put("closingMessage", result.getClosingMessage());
111119

112120
return hash;
113121
}
114122

115123
static HashMap<String, Object> convertInAppMessageWillDisplayEventToMap(IInAppMessageWillDisplayEvent event) {
116124
HashMap<String, Object> hash = new HashMap<>();
117125

118-
hash.put("message", convertInAppMessageToMap(event.message));
126+
hash.put("message", convertInAppMessageToMap(event.getMessage()));
119127

120128
return hash;
121129
}
122130

123131
static HashMap<String, Object> convertInAppMessageDidDisplayEventToMap(IInAppMessageDidDisplayEvent event) {
124132
HashMap<String, Object> hash = new HashMap<>();
125133

126-
hash.put("message", convertInAppMessageToMap(event.message));
134+
hash.put("message", convertInAppMessageToMap(event.getMessage()));
127135

128136
return hash;
129137
}
130138

131139
static HashMap<String, Object> convertInAppMessageWillDismissEventToMap(IInAppMessageWillDismissEvent event) {
132140
HashMap<String, Object> hash = new HashMap<>();
133141

134-
hash.put("message", convertInAppMessageToMap(event.message));
142+
hash.put("message", convertInAppMessageToMap(event.getMessage()));
135143

136144
return hash;
137145
}
138146

139147
static HashMap<String, Object> convertInAppMessageDidDismissEventToMap(IInAppMessageDidDismissEvent event) {
140148
HashMap<String, Object> hash = new HashMap<>();
141149

142-
hash.put("message", convertInAppMessageToMap(event.message));
150+
hash.put("message", convertInAppMessageToMap(event.getMessage()));
143151

144152
return hash;
145153
}

example/lib/main.dart

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class _MyAppState extends State<MyApp>
1515
with
1616
OneSignalPushSubscriptionObserver,
1717
OneSignalPermissionObserver,
18-
OneSignalInAppMessageLifecycleListener {
18+
OneSignalInAppMessageLifecycleListener,
19+
OneSignalInAppMessageClickListener {
1920
String _debugLabelString = "";
2021
String? _emailAddress;
2122
String? _smsNumber;
@@ -76,15 +77,9 @@ class _MyAppState extends State<MyApp>
7677
});
7778
});
7879

79-
OneSignal.InAppMessages.setInAppMessageClickedHandler(
80-
(OSInAppMessageAction action) {
81-
this.setState(() {
82-
_debugLabelString =
83-
"In App Message Clicked: \n${action.jsonRepresentation().replaceAll("\\n", "\n")}";
84-
});
85-
});
80+
OneSignal.InAppMessages.addClickListener(this);
8681

87-
OneSignal.InAppMessages.addInAppMessageLifecycleListener(this);
82+
OneSignal.InAppMessages.addLifecycleListener(this);
8883

8984
// iOS-only method to open launch URLs in Safari when set to false
9085
OneSignal.shared.setLaunchURLsInApp(false);
@@ -111,6 +106,13 @@ class _MyAppState extends State<MyApp>
111106
print(state.jsonRepresentation());
112107
}
113108

109+
void onClickInAppMessage(OSInAppMessageClickEvent event) {
110+
this.setState(() {
111+
_debugLabelString =
112+
"In App Message Clicked: \n${event.result.jsonRepresentation().replaceAll("\\n", "\n")}";
113+
});
114+
}
115+
114116
void onWillDisplayInAppMessage(OSInAppMessageWillDisplayEvent event) {
115117
print("ON WILL DISPLAY IN APP MESSAGE ${event.message.messageId}");
116118
}

ios/Classes/OSFlutterCategories.m

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,24 @@ - (NSDictionary *)toJson {
124124
}
125125
@end
126126

127-
@implementation OSInAppMessageAction (Flutter)
127+
@implementation OSInAppMessageClickEvent (Flutter)
128128
- (NSDictionary *)toJson {
129129
NSMutableDictionary *json = [NSMutableDictionary new];
130130

131-
json[@"click_name"] = self.clickName;
132-
json[@"click_url"] = self.clickUrl.absoluteString;
133-
json[@"first_click"] = @(self.firstClick);
134-
json[@"closes_message"] = @(self.closesMessage);
131+
json[@"message"] = self.message.toJson;
132+
json[@"result"] = self.result.toJson;
133+
134+
return json;
135+
}
136+
@end
137+
138+
@implementation OSInAppMessageClickResult (Flutter)
139+
- (NSDictionary *)toJson {
140+
NSMutableDictionary *json = [NSMutableDictionary new];
141+
142+
json[@"action_id"] = self.actionId;
143+
json[@"url"] = self.url;
144+
json[@"closing_message"] = @(self.closingMessage);
135145

136146
return json;
137147
}

ios/Classes/OSFlutterInAppMessages.m

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ + (instancetype)sharedInstance {
3636
static dispatch_once_t onceToken;
3737
dispatch_once(&onceToken, ^{
3838
sharedInstance = [OSFlutterInAppMessages new];
39-
sharedInstance.hasSetInAppMessageClickedHandler = false;
4039
});
4140
return sharedInstance;
4241
}
@@ -65,8 +64,6 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result
6564
[self paused:call withResult:result];
6665
else if ([@"OneSignal#arePaused" isEqualToString:call.method])
6766
result(@([OneSignal.InAppMessages paused]));
68-
else if ([@"OneSignal#initInAppMessageClickedHandlerParams" isEqualToString:call.method])
69-
[self initInAppMessageClickedHandlerParams];
7067
else if ([@"OneSignal#lifecycleInit" isEqualToString:call.method])
7168
[self lifecycleInit:call withResult:result];
7269
else
@@ -104,31 +101,16 @@ - (void)paused:(FlutterMethodCall *)call withResult:(FlutterResult)result {
104101
}
105102

106103
- (void)lifecycleInit:(FlutterMethodCall *)call withResult:(FlutterResult)result {
107-
[OneSignal.InAppMessages setClickHandler:^(OSInAppMessageAction *action) {
108-
[OSFlutterInAppMessages.sharedInstance handleInAppMessageClicked:action];
109-
}];
104+
[OneSignal.InAppMessages addClickListener:OSFlutterInAppMessages.sharedInstance]
110105
[OneSignal.InAppMessages addLifecycleListener:OSFlutterInAppMessages.sharedInstance];
111106
}
112107

113108

114109

115110
#pragma mark In App Message Click
116-
- (void)initInAppMessageClickedHandlerParams {
117-
_hasSetInAppMessageClickedHandler = true;
118111

119-
if (self.inAppMessageClickedResult) {
120-
[self handleInAppMessageClicked:self.inAppMessageClickedResult];
121-
self.inAppMessageClickedResult = nil;
122-
}
123-
}
124-
125-
- (void)handleInAppMessageClicked:(OSInAppMessageAction *)action {
126-
if (!self.hasSetInAppMessageClickedHandler) {
127-
_inAppMessageClickedResult = action;
128-
return;
129-
}
130-
131-
[self.channel invokeMethod:@"OneSignal#handleClickedInAppMessage" arguments:action.toJson];
112+
- (void)onClickInAppMessage:(OSInAppMessageClickEvent * _Nonnull)event {
113+
[self.channel invokeMethod:@"OneSignal#onClickInAppMessage" arguments:event.toJson];
132114
}
133115

134116
#pragma mark OSInAppMessageLifecycleListener

lib/src/inappmessage.dart

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,52 @@
11
import 'package:onesignal_flutter/onesignal_flutter.dart';
22
import 'package:onesignal_flutter/src/utils.dart';
33

4+
/// When a click action is defined on an In App Message form the dashboard,
5+
/// the handler returns an OSInAppMessageClickEvent object so the Dart code can act accordingly
6+
/// This event includes the message and the result of the click
7+
class OSInAppMessageClickEvent extends JSONStringRepresentable {
8+
late OSInAppMessage message;
9+
10+
late OSInAppMessageClickResult result;
11+
12+
OSInAppMessageClickEvent(Map<String, dynamic> json) {
13+
this.message = OSInAppMessage(json["message"].cast<String, dynamic>());
14+
this.result =
15+
OSInAppMessageClickResult(json["result"].cast<String, dynamic>());
16+
}
17+
18+
String jsonRepresentation() {
19+
return convertToJsonString({
20+
'message': this.message,
21+
'result': this.result,
22+
});
23+
}
24+
}
25+
426
/// When a click action is defined on an In App Message form the dashboard,
527
/// the handler returns an OSInAppMessageAction object so the Dart code can act accordingly
628
/// This allows for custom action events within Dart
7-
class OSInAppMessageAction extends JSONStringRepresentable {
29+
class OSInAppMessageClickResult extends JSONStringRepresentable {
830
// Name of the action event defined for the IAM element
9-
String? clickName;
31+
String? actionId;
1032

1133
// URL given to the IAM element defined in the dashboard
12-
String? clickUrl;
13-
14-
// Determines if a first click has occurred or not on the IAM element
15-
bool firstClick = false;
34+
String? url;
1635

1736
// Whether or not the click action should dismiss the IAM
18-
bool closesMessage = false;
37+
bool closingMessage = false;
1938

20-
OSInAppMessageAction(Map<String, dynamic> json) {
21-
this.clickName = json["click_name"];
22-
this.clickUrl = json["click_url"];
23-
this.firstClick = json["first_click"] as bool;
24-
this.closesMessage = json["closes_message"] as bool;
39+
OSInAppMessageClickResult(Map<String, dynamic> json) {
40+
this.actionId = json["action_id"];
41+
this.url = json["url"];
42+
this.closingMessage = json["closingMessage"] as bool;
2543
}
2644

2745
String jsonRepresentation() {
2846
return convertToJsonString({
29-
'click_name': this.clickName,
30-
'click_url': this.clickUrl,
31-
'first_click': this.firstClick,
32-
'closes_message': this.closesMessage,
47+
'action_id': this.actionId,
48+
'url': this.url,
49+
'closingMessage': this.closingMessage,
3350
});
3451
}
3552
}
@@ -50,7 +67,7 @@ class OSInAppMessageWillDisplayEvent extends JSONStringRepresentable {
5067
late OSInAppMessage message;
5168

5269
OSInAppMessageWillDisplayEvent(Map<String, dynamic> json) {
53-
this.message = json["message"];
70+
this.message = OSInAppMessage(json["message"].cast<String, dynamic>());
5471
}
5572

5673
String jsonRepresentation() {
@@ -62,7 +79,7 @@ class OSInAppMessageDidDisplayEvent extends JSONStringRepresentable {
6279
late OSInAppMessage message;
6380

6481
OSInAppMessageDidDisplayEvent(Map<String, dynamic> json) {
65-
this.message = json["message"];
82+
this.message = OSInAppMessage(json["message"].cast<String, dynamic>());
6683
}
6784

6885
String jsonRepresentation() {
@@ -74,7 +91,7 @@ class OSInAppMessageWillDismissEvent extends JSONStringRepresentable {
7491
late OSInAppMessage message;
7592

7693
OSInAppMessageWillDismissEvent(Map<String, dynamic> json) {
77-
this.message = json["message"];
94+
this.message = OSInAppMessage(json["message"].cast<String, dynamic>());
7895
}
7996

8097
String jsonRepresentation() {
@@ -86,7 +103,7 @@ class OSInAppMessageDidDismissEvent extends JSONStringRepresentable {
86103
late OSInAppMessage message;
87104

88105
OSInAppMessageDidDismissEvent(Map<String, dynamic> json) {
89-
this.message = json["message"];
106+
this.message = OSInAppMessage(json["message"].cast<String, dynamic>());
90107
}
91108

92109
String jsonRepresentation() {

0 commit comments

Comments
 (0)