Skip to content

Commit 0c81d09

Browse files
authored
Merge pull request #568 from OneSignal/feat/add_set_language_callback
[Feature] Add callbacks to `setLanguage`
2 parents 55526ea + ab6b8d0 commit 0c81d09

File tree

4 files changed

+87
-2
lines changed

4 files changed

+87
-2
lines changed

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ private void setLanguage(MethodCall call, final Result result) {
329329
if (language != null && language.length() == 0)
330330
language = null;
331331

332-
OneSignal.setLanguage(language);
332+
OneSignal.setLanguage(language, new OSFlutterSetLanguageHandler(messenger, channel, result, "setLanguage"));
333333
}
334334

335335
private void setExternalUserId(MethodCall call, final Result result) {
@@ -603,6 +603,47 @@ public void onFailure(JSONObject response) {
603603
}
604604
}
605605

606+
static class OSFlutterSetLanguageHandler extends OSFlutterHandler
607+
implements OneSignal.OSSetLanguageCompletionHandler {
608+
609+
OSFlutterSetLanguageHandler(BinaryMessenger messenger, MethodChannel channel, Result res, String methodName) {
610+
super(messenger, channel, res, methodName);
611+
}
612+
613+
@Override
614+
public void onSuccess(String results) {
615+
if (this.replySubmitted.getAndSet(true)) {
616+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "OneSignal " + methodName + " handler called twice, ignoring! response: " + results);
617+
return;
618+
}
619+
620+
if (results == null) { // The results currently is always null.
621+
results = "Successfully set language.";
622+
}
623+
624+
HashMap<String, Object> responseMap = new HashMap<>();
625+
responseMap.put("success", true);
626+
responseMap.put("message", results);
627+
replySuccess(result, responseMap);
628+
}
629+
630+
@Override
631+
public void onFailure(OneSignal.OSLanguageError error) {
632+
if (this.replySubmitted.getAndSet(true)) {
633+
return;
634+
}
635+
636+
String errorMessage = error.getMessage();
637+
if (errorMessage == null) {
638+
errorMessage = "Failed to set language.";
639+
}
640+
641+
replyError(result, "OneSignal",
642+
"Encountered an error when " + methodName + ": " + errorMessage,
643+
null);
644+
}
645+
}
646+
606647
static class OSFlutterHandler extends FlutterRegistrarResponder {
607648
protected final Result result;
608649
protected final String methodName;

example/lib/main.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class _MyAppState extends State<MyApp> {
1616
String? _emailAddress;
1717
String? _smsNumber;
1818
String? _externalUserId;
19+
String? _language;
1920
bool _enableConsentButton = false;
2021

2122
// CHANGE THIS parameter to true if you want to test GDPR privacy consent
@@ -184,6 +185,18 @@ class _MyAppState extends State<MyApp> {
184185
});
185186
}
186187

188+
void _handleSetLanguage() {
189+
if (_language == null) return;
190+
191+
print("Setting language");
192+
193+
OneSignal.shared.setLanguage(_language!).then((response) {
194+
print("Successfully set language with response: $response");
195+
}).catchError((error) {
196+
print("Failed to set language with error: $error");
197+
});
198+
}
199+
187200
void _handleLogoutEmail() {
188201
print("Logging out of email");
189202

@@ -510,6 +523,30 @@ class _MyAppState extends State<MyApp> {
510523
new OneSignalButton(
511524
"Remove External User ID", _handleRemoveExternalUserId, !_enableConsentButton)
512525
]),
526+
new TableRow(children: [
527+
new TextField(
528+
textAlign: TextAlign.center,
529+
decoration: InputDecoration(
530+
hintText: "Language",
531+
labelStyle: TextStyle(
532+
color: Color.fromARGB(255, 212, 86, 83),
533+
)),
534+
onChanged: (text) {
535+
this.setState(() {
536+
_language = text == "" ? null : text;
537+
});
538+
},
539+
)
540+
]),
541+
new TableRow(children: [
542+
Container(
543+
height: 8.0,
544+
)
545+
]),
546+
new TableRow(children: [
547+
new OneSignalButton(
548+
"Set Language", _handleSetLanguage, !_enableConsentButton)
549+
]),
513550
new TableRow(children: [
514551
new Container(
515552
child: new Text(_debugLabelString),

ios/Classes/OneSignalPlugin.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,12 @@ - (void)setLanguage:(FlutterMethodCall *)call withResult:(FlutterResult)result {
338338
language = nil;
339339
}
340340

341-
[OneSignal setLanguage:language];
341+
[OneSignal setLanguage:language withSuccess:^(NSDictionary *results) {
342+
result(results);
343+
} withFailure:^(NSError *error) {
344+
[OneSignal onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Set language Failure with error: %@", error]];
345+
result(error.flutterError);
346+
}];
342347
}
343348

344349
- (void)initNotificationOpenedHandlerParams {

lib/onesignal_flutter.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ class OneSignal {
379379
return results.cast<String, dynamic>();
380380
}
381381

382+
/// Sets the user's language.
383+
/// Applies also to the email and/or SMS player if those are logged in on the device.
382384
Future<Map<String, dynamic>> setLanguage(String language) async {
383385
Map<dynamic, dynamic> results =
384386
await (_channel.invokeMethod("OneSignal#setLanguage", {'language' : language}));

0 commit comments

Comments
 (0)