Skip to content

Commit 68d1c53

Browse files
authored
Merge pull request #1007 from OneSignal/support_android_5_6
Don't crash with Android < 7.0 (when requesting permission)
2 parents 2cfde0f + c611221 commit 68d1c53

File tree

1 file changed

+35
-5
lines changed

1 file changed

+35
-5
lines changed

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

+35-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.onesignal.flutter;
22

3+
import androidx.annotation.NonNull;
4+
35
import com.onesignal.debug.internal.logging.Logging;
46
import com.onesignal.OneSignal;
5-
import com.onesignal.Continue;
6-
77

88
import com.onesignal.notifications.INotification;
99
import com.onesignal.notifications.INotificationClickEvent;
@@ -23,11 +23,43 @@
2323
import io.flutter.plugin.common.MethodChannel;
2424
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
2525
import io.flutter.plugin.common.MethodChannel.Result;
26+
import kotlin.coroutines.Continuation;
27+
import kotlin.coroutines.CoroutineContext;
28+
import kotlinx.coroutines.Dispatchers;
2629

2730
public class OneSignalNotifications extends FlutterMessengerResponder implements MethodCallHandler, INotificationClickListener, INotificationLifecycleListener, IPermissionObserver {
2831
private final HashMap<String, INotificationWillDisplayEvent> notificationOnWillDisplayEventCache = new HashMap<>();
2932
private final HashMap<String, INotificationWillDisplayEvent> preventedDefaultCache = new HashMap<>();
3033

34+
/**
35+
* A helper class to encapsulate invoking the suspending function [requestPermission] in Java.
36+
* To support API level < 24, the SDK cannot use the OneSignal-defined [Continue.with] helper method.
37+
*/
38+
private class RequestPermissionContinuation implements Continuation<Boolean> {
39+
40+
private final MethodChannel.Result result;
41+
42+
public RequestPermissionContinuation(MethodChannel.Result result) {
43+
this.result = result;
44+
}
45+
46+
@NonNull
47+
@Override
48+
public CoroutineContext getContext() {
49+
return (CoroutineContext) Dispatchers.getMain();
50+
}
51+
52+
@Override
53+
public void resumeWith(@NonNull Object o) {
54+
if (o instanceof kotlin.Result.Failure) {
55+
Throwable e = ((kotlin.Result.Failure) o).exception;
56+
replyError(result, "OneSignal", "requestPermission failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
57+
}
58+
else {
59+
replySuccess(result, o);
60+
}
61+
}
62+
}
3163

3264
static void registerWith(BinaryMessenger messenger) {
3365
OneSignalNotifications controller = new OneSignalNotifications();
@@ -72,9 +104,7 @@ private void requestPermission(MethodCall call, Result result) {
72104
return;
73105
}
74106

75-
OneSignal.getNotifications().requestPermission(fallback, Continue.with(permissionResult -> {
76-
replySuccess(result, permissionResult.getData());
77-
}));
107+
OneSignal.getNotifications().requestPermission(fallback, new RequestPermissionContinuation(result));
78108
}
79109

80110
private void removeNotification(MethodCall call, Result result) {

0 commit comments

Comments
 (0)