From c611221dbfc03f2e7fd39ce3b352aa429e526a47 Mon Sep 17 00:00:00 2001 From: Nan Date: Wed, 19 Feb 2025 15:42:17 -0800 Subject: [PATCH] Support Android < 7.0 by dropping unsupported API * The OneSignal-defined `Continue.with` is only available on API 24 (Android 7.0) * We still aim to support Android 5 and 6, so don't use this wrapper helper and use the Continuation class directly. --- .../flutter/OneSignalNotifications.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java index 49bcbdfd..6f139aa7 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java @@ -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; @@ -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 notificationOnWillDisplayEventCache = new HashMap<>(); private final HashMap 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 { + + 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(); @@ -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) {