From 77315e595515ef82883d91efb3603442ba81326d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D0=B5=D0=B2=D1=87=D1=83=D0=BA=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D1=96=D0=B9=20=D0=A1=D0=B5=D1=80=D0=B3=D1=96=D0=B9=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D1=87?= Date: Thu, 21 Aug 2025 18:35:26 +0300 Subject: [PATCH] allow specifying target Activity for notification taps --- .../FlutterLocalNotificationsPlugin.java | 14 +++++++++++++- .../src/platform_flutter_local_notifications.dart | 4 ++-- .../android/initialization_settings.dart | 11 ++++++++++- .../android/method_channel_mappers.dart | 5 ++++- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/flutter_local_notifications/android/src/main/java/com/dexterous/flutterlocalnotifications/FlutterLocalNotificationsPlugin.java b/flutter_local_notifications/android/src/main/java/com/dexterous/flutterlocalnotifications/FlutterLocalNotificationsPlugin.java index 56cd787b2..60ca43c31 100644 --- a/flutter_local_notifications/android/src/main/java/com/dexterous/flutterlocalnotifications/FlutterLocalNotificationsPlugin.java +++ b/flutter_local_notifications/android/src/main/java/com/dexterous/flutterlocalnotifications/FlutterLocalNotificationsPlugin.java @@ -132,6 +132,7 @@ public class FlutterLocalNotificationsPlugin private static final String CALLBACK_HANDLE = "callback_handle"; private static final String DRAWABLE = "drawable"; private static final String DEFAULT_ICON = "defaultIcon"; + private static final String FLUTTER_ACTIVITY = "flutterActivity"; private static final String SELECT_NOTIFICATION = "SELECT_NOTIFICATION"; private static final String SELECT_FOREGROUND_NOTIFICATION_ACTION = "SELECT_FOREGROUND_NOTIFICATION"; @@ -1001,6 +1002,14 @@ private static void setTimeoutAfter( } private static Intent getLaunchIntent(Context context) { + SharedPreferences sharedPreferences = + context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE); + String flutterActivity = sharedPreferences.getString(FLUTTER_ACTIVITY, null); + if (!StringUtils.isNullOrEmpty(flutterActivity)) { + Intent result = new Intent(); + result.setClassName(context, flutterActivity); + return result; + } String packageName = context.getPackageName(); PackageManager packageManager = context.getPackageManager(); return packageManager.getLaunchIntentForPackage(packageName); @@ -1707,6 +1716,7 @@ private void initialize(MethodCall call, Result result) { return; } + String flutterActivity = (String) arguments.get(FLUTTER_ACTIVITY); Long dispatcherHandle = LongUtils.parseLong(call.argument(DISPATCHER_HANDLE)); Long callbackHandle = LongUtils.parseLong(call.argument(CALLBACK_HANDLE)); if (dispatcherHandle != null && callbackHandle != null) { @@ -1716,7 +1726,9 @@ private void initialize(MethodCall call, Result result) { SharedPreferences sharedPreferences = applicationContext.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(DEFAULT_ICON, defaultIcon).apply(); + editor.putString(DEFAULT_ICON, defaultIcon) + .putString(FLUTTER_ACTIVITY, flutterActivity) + .apply(); result.success(true); } diff --git a/flutter_local_notifications/lib/src/platform_flutter_local_notifications.dart b/flutter_local_notifications/lib/src/platform_flutter_local_notifications.dart index bae3d29fc..3221371e6 100644 --- a/flutter_local_notifications/lib/src/platform_flutter_local_notifications.dart +++ b/flutter_local_notifications/lib/src/platform_flutter_local_notifications.dart @@ -147,7 +147,7 @@ class AndroidFlutterLocalNotificationsPlugin _onDidReceiveNotificationResponse = onDidReceiveNotificationResponse; _channel.setMethodCallHandler(_handleMethod); - final Map arguments = initializationSettings.toMap(); + final Map arguments = initializationSettings.toMap(); _evaluateBackgroundNotificationCallback( onDidReceiveBackgroundNotificationResponse, arguments); @@ -1051,7 +1051,7 @@ class MacOSFlutterLocalNotificationsPlugin void _evaluateBackgroundNotificationCallback( DidReceiveBackgroundNotificationResponseCallback? didReceiveBackgroundNotificationResponseCallback, - Map arguments, + Map arguments, ) { if (didReceiveBackgroundNotificationResponseCallback != null) { final CallbackHandle? callback = PluginUtilities.getCallbackHandle( diff --git a/flutter_local_notifications/lib/src/platform_specifics/android/initialization_settings.dart b/flutter_local_notifications/lib/src/platform_specifics/android/initialization_settings.dart index f451264d1..8e59e6189 100644 --- a/flutter_local_notifications/lib/src/platform_specifics/android/initialization_settings.dart +++ b/flutter_local_notifications/lib/src/platform_specifics/android/initialization_settings.dart @@ -1,8 +1,17 @@ /// Plugin initialization settings for Android. class AndroidInitializationSettings { /// Constructs an instance of [AndroidInitializationSettings]. - const AndroidInitializationSettings(this.defaultIcon); + const AndroidInitializationSettings( + this.defaultIcon, { + this.flutterActivity, + }); /// Specifies the default icon for notifications. final String defaultIcon; + + /// Specifies the fully qualified name of the custom Flutter `Activity` to be launched + /// when the notification is tapped. + /// + /// Example: `com.example.ui.HomeFlutterActivity` + final String? flutterActivity; } diff --git a/flutter_local_notifications/lib/src/platform_specifics/android/method_channel_mappers.dart b/flutter_local_notifications/lib/src/platform_specifics/android/method_channel_mappers.dart index bd4bbabb3..126f6de5c 100644 --- a/flutter_local_notifications/lib/src/platform_specifics/android/method_channel_mappers.dart +++ b/flutter_local_notifications/lib/src/platform_specifics/android/method_channel_mappers.dart @@ -15,7 +15,10 @@ import 'styles/messaging_style_information.dart'; // ignore_for_file: avoid_as, public_member_api_docs extension AndroidInitializationSettingsMapper on AndroidInitializationSettings { - Map toMap() => {'defaultIcon': defaultIcon}; + Map toMap() => { + 'defaultIcon': defaultIcon, + 'flutterActivity': flutterActivity + }; } extension MessageMapper on Message {