Skip to content

Commit 5ea93cb

Browse files
committed
Add single response handler.
* Some calls might end being called twice from the native side. Even if we already cover this from the native side, add safe check to avoid more than one call to the same flutter response
1 parent c419222 commit 5ea93cb

File tree

1 file changed

+94
-121
lines changed

1 file changed

+94
-121
lines changed

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

Lines changed: 94 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
import com.onesignal.OSSubscriptionStateChanges;
1818
import com.onesignal.OneSignal;
1919
import com.onesignal.OneSignal.EmailUpdateError;
20-
import com.onesignal.OneSignal.EmailUpdateHandler;
2120

2221
import org.json.JSONException;
2322
import org.json.JSONObject;
2423

2524
import java.util.HashMap;
2625
import java.util.Map;
26+
import java.util.concurrent.atomic.AtomicBoolean;
2727

2828
import io.flutter.plugin.common.MethodCall;
2929
import io.flutter.plugin.common.MethodChannel;
@@ -231,28 +231,7 @@ private void getDeviceState(Result reply) {
231231

232232
private void postNotification(MethodCall call, final Result reply) {
233233
JSONObject json = new JSONObject((Map<String, Object>) call.arguments);
234-
OneSignal.postNotification(json, new OneSignal.PostNotificationResponseHandler() {
235-
@Override
236-
public void onSuccess(JSONObject response) {
237-
try {
238-
replySuccess(reply, OneSignalSerializer.convertJSONObjectToHashMap(response));
239-
} catch (JSONException e) {
240-
replyError(reply, "OneSignal", "Encountered an error attempting to deserialize server response: " + e.getMessage(), null);
241-
}
242-
}
243-
244-
@Override
245-
public void onFailure(final JSONObject response) {
246-
try {
247-
replyError(reply, "OneSignal",
248-
"Encountered an error attempting to post notification: " + response.toString(),
249-
OneSignalSerializer.convertJSONObjectToHashMap(response));
250-
} catch (JSONException e) {
251-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
252-
"Encountered an error attempting to deserialize server response: " + e.getMessage());
253-
}
254-
}
255-
});
234+
OneSignal.postNotification(json, new OSFlutterResultHandler(flutterRegistrar, channel, reply, "postNotification"));
256235
}
257236

258237
private void promptLocation(Result reply) {
@@ -269,80 +248,22 @@ private void setEmail(MethodCall call, final Result reply) {
269248
String email = call.argument("email");
270249
String emailAuthHashToken = call.argument("emailAuthHashToken");
271250

272-
OneSignal.setEmail(email, emailAuthHashToken, new EmailUpdateHandler() {
273-
@Override
274-
public void onSuccess() {
275-
replySuccess(reply, null);
276-
}
277-
278-
@Override
279-
public void onFailure(EmailUpdateError error) {
280-
replyError(reply, "OneSignal",
281-
"Encountered an error setting email: " + error.getMessage(),
282-
null);
283-
}
284-
});
251+
OneSignal.setEmail(email, emailAuthHashToken, new OSFlutterEmailHandle(flutterRegistrar, channel, reply, "setEmail"));
285252
}
286253

287254
private void logoutEmail(final Result reply) {
288-
OneSignal.logoutEmail(new EmailUpdateHandler() {
289-
@Override
290-
public void onSuccess() {
291-
replySuccess(reply, null);
292-
}
293-
294-
@Override
295-
public void onFailure(EmailUpdateError error) {
296-
replyError(reply, "OneSignal",
297-
"Encountered an error loggoing out of email: " + error.getMessage(),
298-
null);
299-
}
300-
});
255+
OneSignal.logoutEmail(new OSFlutterEmailHandle(flutterRegistrar, channel, reply, "logoutEmail"));
301256
}
302257

303258
private void setSMSNumber(MethodCall call, final Result reply) {
304259
String smsNumber = call.argument("smsNumber");
305260
String smsAuthHashToken = call.argument("smsAuthHashToken");
306261

307-
OneSignal.setSMSNumber(smsNumber, smsAuthHashToken, new OneSignal.OSSMSUpdateHandler() {
308-
@Override
309-
public void onSuccess(JSONObject result) {
310-
try {
311-
replySuccess(reply, OneSignalSerializer.convertJSONObjectToHashMap(result));
312-
} catch (JSONException e) {
313-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
314-
"Encountered an error attempting to deserialize server response for setSMSNumber: " + e.getMessage());
315-
}
316-
}
317-
318-
@Override
319-
public void onFailure(OneSignal.OSSMSUpdateError error) {
320-
replyError(reply, "OneSignal",
321-
"Encountered an error setting SMS Number: " + error.getMessage(),
322-
null);
323-
}
324-
});
262+
OneSignal.setSMSNumber(smsNumber, smsAuthHashToken, new OSFlutterResultHandler(flutterRegistrar, channel, reply, "setSMSNumber"));
325263
}
326264

327265
private void logoutSMSNumber(final Result reply) {
328-
OneSignal.logoutSMSNumber(new OneSignal.OSSMSUpdateHandler() {
329-
@Override
330-
public void onSuccess(JSONObject result) {
331-
try {
332-
replySuccess(reply, OneSignalSerializer.convertJSONObjectToHashMap(result));
333-
} catch (JSONException e) {
334-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
335-
"Encountered an error attempting to deserialize server response for logoutSMSNumber: " + e.getMessage());
336-
}
337-
}
338-
339-
@Override
340-
public void onFailure(OneSignal.OSSMSUpdateError error) {
341-
replyError(reply, "OneSignal",
342-
"Encountered an error logging out SMS number: " + error.getMessage(),
343-
null);
344-
}
345-
});
266+
OneSignal.logoutSMSNumber(new OSFlutterResultHandler(flutterRegistrar, channel, reply, "logoutSMSNumber"));
346267
}
347268

348269
private void setLanguage(MethodCall call, final Result result) {
@@ -361,45 +282,11 @@ private void setExternalUserId(MethodCall call, final Result result) {
361282
if (authHashToken != null && authHashToken.length() == 0)
362283
authHashToken = null;
363284

364-
OneSignal.setExternalUserId(externalUserId, authHashToken, new OneSignal.OSExternalUserIdUpdateCompletionHandler() {
365-
@Override
366-
public void onSuccess(JSONObject results) {
367-
try {
368-
replySuccess(result, OneSignalSerializer.convertJSONObjectToHashMap(results));
369-
} catch (JSONException e) {
370-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
371-
"Encountered an error attempting to deserialize server response for setExternalUserId: " + e.getMessage());
372-
}
373-
}
374-
375-
@Override
376-
public void onFailure(OneSignal.ExternalIdError error) {
377-
replyError(result, "OneSignal",
378-
"Encountered an error setting external id: " + error.getMessage(),
379-
null);
380-
}
381-
});
285+
OneSignal.setExternalUserId(externalUserId, authHashToken, new OSFlutterResultHandler(flutterRegistrar, channel, result, "setExternalUserId"));
382286
}
383287

384288
private void removeExternalUserId(final Result result) {
385-
OneSignal.removeExternalUserId(new OneSignal.OSExternalUserIdUpdateCompletionHandler() {
386-
@Override
387-
public void onSuccess(JSONObject results) {
388-
try {
389-
replySuccess(result, OneSignalSerializer.convertJSONObjectToHashMap(results));
390-
} catch (JSONException e) {
391-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
392-
"Encountered an error attempting to deserialize server response for removeExternalUserId: " + e.getMessage());
393-
}
394-
}
395-
396-
@Override
397-
public void onFailure(OneSignal.ExternalIdError error) {
398-
replyError(result, "OneSignal",
399-
"Encountered an error removing external id: " + error.getMessage(),
400-
null);
401-
}
402-
});
289+
OneSignal.removeExternalUserId(new OSFlutterResultHandler(flutterRegistrar, channel, result, "removeExternalUserId"));
403290
}
404291

405292
private void initNotificationOpenedHandlerParams() {
@@ -509,4 +396,90 @@ public void notificationWillShowInForeground(OSNotificationReceivedEvent notific
509396
}
510397
}
511398

399+
static class OSFlutterEmailHandle extends FlutterRegistrarResponder
400+
implements OneSignal.EmailUpdateHandler {
401+
private final Result result;
402+
private final String methodName;
403+
private final AtomicBoolean replySubmitted = new AtomicBoolean(false);
404+
405+
OSFlutterEmailHandle(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
406+
this.flutterRegistrar = flutterRegistrar;
407+
this.channel = channel;
408+
this.result = res;
409+
this.methodName = methodName;
410+
}
411+
412+
@Override
413+
public void onSuccess() {
414+
if (this.replySubmitted.getAndSet(true))
415+
return;
416+
417+
replySuccess(result, null);
418+
}
419+
420+
@Override
421+
public void onFailure(EmailUpdateError error) {
422+
if (this.replySubmitted.getAndSet(true))
423+
return;
424+
425+
replyError(result, "OneSignal",
426+
"Encountered an error when " + methodName + ": " + error.getMessage(),
427+
null);
428+
}
429+
}
430+
431+
static class OSFlutterResultHandler extends FlutterRegistrarResponder
432+
implements OneSignal.OSExternalUserIdUpdateCompletionHandler, OneSignal.OSSMSUpdateHandler, OneSignal.PostNotificationResponseHandler {
433+
private final Result result;
434+
private final String methodName;
435+
private final AtomicBoolean replySubmitted = new AtomicBoolean(false);
436+
437+
OSFlutterResultHandler(PluginRegistry.Registrar flutterRegistrar, MethodChannel channel, Result res, String methodName) {
438+
this.flutterRegistrar = flutterRegistrar;
439+
this.channel = channel;
440+
this.result = res;
441+
this.methodName = methodName;
442+
}
443+
444+
@Override
445+
public void onSuccess(JSONObject results) {
446+
if (this.replySubmitted.getAndSet(true))
447+
return;
448+
449+
try {
450+
replySuccess(result, OneSignalSerializer.convertJSONObjectToHashMap(results));
451+
} catch (JSONException e) {
452+
replyError(result, "OneSignal", "Encountered an error attempting to deserialize server response for " + methodName + ": " + e.getMessage(), null);
453+
}
454+
}
455+
456+
@Override
457+
public void onFailure(OneSignal.OSSMSUpdateError error) {
458+
if (this.replySubmitted.getAndSet(true))
459+
return;
460+
461+
replyError(result, "OneSignal", "Encountered an error when " + methodName + " (" + error.getType() + "): " + error.getMessage(), null);
462+
}
463+
464+
@Override
465+
public void onFailure(OneSignal.ExternalIdError error) {
466+
if (this.replySubmitted.getAndSet(true))
467+
return;
468+
469+
replyError(result, "OneSignal", "Encountered an error when " + methodName + " (" + error.getType() + "): " + error.getMessage(), null);
470+
}
471+
472+
@Override
473+
public void onFailure(JSONObject response) {
474+
if (this.replySubmitted.getAndSet(true))
475+
return;
476+
477+
try {
478+
replyError(result, "OneSignal", "Encountered an error attempting to " + methodName + " " + response.toString(), OneSignalSerializer.convertJSONObjectToHashMap(response));
479+
} catch (JSONException jsonException) {
480+
replyError(result, "OneSignal", "Encountered an error attempting to deserialize server response " + methodName + " " + jsonException.getMessage(), null);
481+
}
482+
}
483+
}
484+
512485
}

0 commit comments

Comments
 (0)