From a941ba71389e08bf86b680495075da7b07b29fbb Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 29 May 2024 11:09:40 +0100 Subject: [PATCH 1/5] fix(messaging, android): stop app from crashing when flutterCallback is `null` --- .../FlutterFirebaseMessagingBackgroundExecutor.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java index 743f171c70e4..5d2d5820f1dc 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java @@ -176,6 +176,14 @@ public void startBackgroundIsolate(long callbackHandle, FlutterShellArgs shellAr // lookup will fail. FlutterCallbackInformation flutterCallback = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle); + + if(flutterCallback == null) { + Log.e(TAG, "Failed to find registered callback"); + return; + } + + // Essentially, the above fails because the flutterCallback is null + DartExecutor executor = backgroundFlutterEngine.getDartExecutor(); initializeMethodChannel(executor); From 0bea46f9d72ef74d0a1d28b26904d8e24c82d386 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 29 May 2024 11:09:58 +0100 Subject: [PATCH 2/5] chore: remove comment --- .../messaging/FlutterFirebaseMessagingBackgroundExecutor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java index 5d2d5820f1dc..15a2510818c3 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java @@ -182,8 +182,6 @@ public void startBackgroundIsolate(long callbackHandle, FlutterShellArgs shellAr return; } - // Essentially, the above fails because the flutterCallback is null - DartExecutor executor = backgroundFlutterEngine.getDartExecutor(); initializeMethodChannel(executor); From 604c5b650517a6e63a9d425b057f0357195ccef2 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 29 May 2024 12:00:27 +0100 Subject: [PATCH 3/5] fix(messaging, android): stop cash from occurring when context is `null` --- .../messaging/FlutterFirebaseMessagingBackgroundExecutor.java | 4 ++++ .../firebase/messaging/FlutterFirebaseMessagingPlugin.java | 1 + 2 files changed, 5 insertions(+) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java index 15a2510818c3..c65a9b728795 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java @@ -55,6 +55,10 @@ public class FlutterFirebaseMessagingBackgroundExecutor implements MethodCallHan */ public static void setCallbackDispatcher(long callbackHandle) { Context context = ContextHolder.getApplicationContext(); + if(context == null) { + Log.e(TAG, "Context is null, cannot continue."); + return; + } SharedPreferences prefs = context.getSharedPreferences(FlutterFirebaseMessagingUtils.SHARED_PREFERENCES_KEY, 0); prefs.edit().putLong(CALLBACK_HANDLE_KEY, callbackHandle).apply(); diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java index 4a08eb0237d3..63d1e0dfac0a 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingPlugin.java @@ -87,6 +87,7 @@ private void initInstance(BinaryMessenger messenger) { @Override public void onAttachedToEngine(FlutterPluginBinding binding) { + ContextHolder.setApplicationContext(binding.getApplicationContext()); initInstance(binding.getBinaryMessenger()); } From f3d63ad046fbb542d5303d90e13e60cfeb962406 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 29 May 2024 12:11:14 +0100 Subject: [PATCH 4/5] chore: format --- .../messaging/FlutterFirebaseMessagingBackgroundExecutor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java index c65a9b728795..742e5a577be4 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingBackgroundExecutor.java @@ -55,7 +55,7 @@ public class FlutterFirebaseMessagingBackgroundExecutor implements MethodCallHan */ public static void setCallbackDispatcher(long callbackHandle) { Context context = ContextHolder.getApplicationContext(); - if(context == null) { + if (context == null) { Log.e(TAG, "Context is null, cannot continue."); return; } @@ -181,7 +181,7 @@ public void startBackgroundIsolate(long callbackHandle, FlutterShellArgs shellAr FlutterCallbackInformation flutterCallback = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle); - if(flutterCallback == null) { + if (flutterCallback == null) { Log.e(TAG, "Failed to find registered callback"); return; } From 95436f2de009b96552ab4e5928f3f6b36d930d53 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 29 May 2024 12:33:15 +0100 Subject: [PATCH 5/5] fix: pass in context if applicationContext is `null` --- .../messaging/FlutterFirebaseMessagingReceiver.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingReceiver.java b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingReceiver.java index d9e65b910a44..ebaeca9ffe24 100644 --- a/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingReceiver.java +++ b/packages/firebase_messaging/firebase_messaging/android/src/main/java/io/flutter/plugins/firebase/messaging/FlutterFirebaseMessagingReceiver.java @@ -20,7 +20,12 @@ public class FlutterFirebaseMessagingReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.d(TAG, "broadcast received for message"); if (ContextHolder.getApplicationContext() == null) { - ContextHolder.setApplicationContext(context.getApplicationContext()); + Context aContext = context; + if (context.getApplicationContext() != null) { + aContext = context.getApplicationContext(); + } + + ContextHolder.setApplicationContext(aContext); } if (intent.getExtras() == null) {