Skip to content

Commit

Permalink
Merge pull request #1007 from OneSignal/support_android_5_6
Browse files Browse the repository at this point in the history
Don't crash with Android < 7.0 (when requesting permission)
  • Loading branch information
nan-li authored Feb 24, 2025
2 parents 2cfde0f + c611221 commit 68d1c53
Showing 1 changed file with 35 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.onesignal.flutter;

import androidx.annotation.NonNull;

import com.onesignal.debug.internal.logging.Logging;
import com.onesignal.OneSignal;
import com.onesignal.Continue;


import com.onesignal.notifications.INotification;
import com.onesignal.notifications.INotificationClickEvent;
Expand All @@ -23,11 +23,43 @@
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import kotlin.coroutines.Continuation;
import kotlin.coroutines.CoroutineContext;
import kotlinx.coroutines.Dispatchers;

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

/**
* 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.
*/
private class RequestPermissionContinuation implements Continuation<Boolean> {

private final MethodChannel.Result result;

public RequestPermissionContinuation(MethodChannel.Result result) {
this.result = result;
}

@NonNull
@Override
public CoroutineContext getContext() {
return (CoroutineContext) Dispatchers.getMain();
}

@Override
public void resumeWith(@NonNull Object o) {
if (o instanceof kotlin.Result.Failure) {
Throwable e = ((kotlin.Result.Failure) o).exception;
replyError(result, "OneSignal", "requestPermission failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
}
else {
replySuccess(result, o);
}
}
}

static void registerWith(BinaryMessenger messenger) {
OneSignalNotifications controller = new OneSignalNotifications();
Expand Down Expand Up @@ -72,9 +104,7 @@ private void requestPermission(MethodCall call, Result result) {
return;
}

OneSignal.getNotifications().requestPermission(fallback, Continue.with(permissionResult -> {
replySuccess(result, permissionResult.getData());
}));
OneSignal.getNotifications().requestPermission(fallback, new RequestPermissionContinuation(result));
}

private void removeNotification(MethodCall call, Result result) {
Expand Down

0 comments on commit 68d1c53

Please sign in to comment.