diff --git a/example/lib/main.dart b/example/lib/main.dart index c438a51..bc6ea6d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -61,7 +61,7 @@ class MyAppState extends State { ); MoxplatformPlugin.notifications.getEventStream().listen((event) { - print('NotificationEvent(type: ${event.type}, jid: ${event.jid}, payload: ${event.payload})'); + print('NotificationEvent(type: ${event.type}, jid: ${event.jid}, payload: ${event.payload}, extras: ${event.extra})'); }); } @@ -191,6 +191,11 @@ class MyHomePage extends StatelessWidget { messages: messages, channelId: channelId, jid: 'testjid', + extra: { + 'jid': 'testjid', + 'avatarPath': 'lol', + 'rio': 'cute', + }, ), ); }, diff --git a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Api.java b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Api.java index 2e62642..30f3bac 100644 --- a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Api.java +++ b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Api.java @@ -387,6 +387,17 @@ public class Api { this.messages = setterArg; } + /** Additional data to include. */ + private @Nullable Map extra; + + public @Nullable Map getExtra() { + return extra; + } + + public void setExtra(@Nullable Map setterArg) { + this.extra = setterArg; + } + /** Constructor is non-public to enforce null safety; use Builder. */ MessagingNotification() {} @@ -427,6 +438,13 @@ public class Api { return this; } + private @Nullable Map extra; + + public @NonNull Builder setExtra(@Nullable Map setterArg) { + this.extra = setterArg; + return this; + } + public @NonNull MessagingNotification build() { MessagingNotification pigeonReturn = new MessagingNotification(); pigeonReturn.setTitle(title); @@ -434,18 +452,20 @@ public class Api { pigeonReturn.setChannelId(channelId); pigeonReturn.setJid(jid); pigeonReturn.setMessages(messages); + pigeonReturn.setExtra(extra); return pigeonReturn; } } @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList(5); + ArrayList toListResult = new ArrayList(6); toListResult.add(title); toListResult.add(id); toListResult.add(channelId); toListResult.add(jid); toListResult.add(messages); + toListResult.add(extra); return toListResult; } @@ -461,6 +481,8 @@ public class Api { pigeonResult.setJid((String) jid); Object messages = list.get(4); pigeonResult.setMessages((List) messages); + Object extra = list.get(5); + pigeonResult.setExtra((Map) extra); return pigeonResult; } } @@ -660,6 +682,17 @@ public class Api { this.payload = setterArg; } + /** Extra data. Only set when type == NotificationType.reply. */ + private @Nullable Map extra; + + public @Nullable Map getExtra() { + return extra; + } + + public void setExtra(@Nullable Map setterArg) { + this.extra = setterArg; + } + /** Constructor is non-public to enforce null safety; use Builder. */ NotificationEvent() {} @@ -686,21 +719,30 @@ public class Api { return this; } + private @Nullable Map extra; + + public @NonNull Builder setExtra(@Nullable Map setterArg) { + this.extra = setterArg; + return this; + } + public @NonNull NotificationEvent build() { NotificationEvent pigeonReturn = new NotificationEvent(); pigeonReturn.setJid(jid); pigeonReturn.setType(type); pigeonReturn.setPayload(payload); + pigeonReturn.setExtra(extra); return pigeonReturn; } } @NonNull ArrayList toList() { - ArrayList toListResult = new ArrayList(3); + ArrayList toListResult = new ArrayList(4); toListResult.add(jid); toListResult.add(type == null ? null : type.index); toListResult.add(payload); + toListResult.add(extra); return toListResult; } @@ -712,6 +754,8 @@ public class Api { pigeonResult.setType(type == null ? null : NotificationEventType.values()[(int) type]); Object payload = list.get(2); pigeonResult.setPayload((String) payload); + Object extra = list.get(3); + pigeonResult.setExtra((Map) extra); return pigeonResult; } } diff --git a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/NotificationReceiver.kt b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/NotificationReceiver.kt index b2b6db3..3ddeb9f 100644 --- a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/NotificationReceiver.kt +++ b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/NotificationReceiver.kt @@ -148,11 +148,19 @@ class NotificationReceiver : BroadcastReceiver() { } private fun handleTap(context: Context, intent: Intent) { + val extras = mutableMapOf() + intent.extras?.keySet()!!.forEach { + if (it.startsWith("payload_")) { + extras[it.substring(8)] = intent.extras!!.getString(it) + } + } + MoxplatformAndroidPlugin.notificationSink?.success( NotificationEvent().apply { jid = intent.getStringExtra(NOTIFICATION_EXTRA_JID_KEY)!! type = Api.NotificationEventType.OPEN payload = null + extra = extras }.toList() ) diff --git a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Notifications.kt b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Notifications.kt index 3b89ca1..eafa1b9 100644 --- a/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Notifications.kt +++ b/packages/moxplatform_android/android/src/main/java/me/polynom/moxplatform_android/Notifications.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.Intent import android.graphics.BitmapFactory import android.graphics.Color +import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.Person @@ -117,6 +118,10 @@ fun showMessagingNotification(context: Context, notification: Api.MessagingNotif action = TAP_ACTION putExtra(NOTIFICATION_EXTRA_JID_KEY, notification.jid) putExtra(NOTIFICATION_EXTRA_ID_KEY, notification.id) + + notification.extra?.forEach { + putExtra("payload_${it.key}", it.value) + } } val tapPendingIntent = PendingIntent.getBroadcast( context, diff --git a/packages/moxplatform_platform_interface/lib/src/api.g.dart b/packages/moxplatform_platform_interface/lib/src/api.g.dart index 36fd541..fd4b2d0 100644 --- a/packages/moxplatform_platform_interface/lib/src/api.g.dart +++ b/packages/moxplatform_platform_interface/lib/src/api.g.dart @@ -106,6 +106,7 @@ class MessagingNotification { required this.channelId, required this.jid, required this.messages, + this.extra, }); /// The title of the conversation. @@ -123,6 +124,9 @@ class MessagingNotification { /// Messages to show. List messages; + /// Additional data to include. + Map? extra; + Object encode() { return [ title, @@ -130,6 +134,7 @@ class MessagingNotification { channelId, jid, messages, + extra, ]; } @@ -141,6 +146,7 @@ class MessagingNotification { channelId: result[2]! as String, jid: result[3]! as String, messages: (result[4] as List?)!.cast(), + extra: (result[5] as Map?)?.cast(), ); } } @@ -196,6 +202,7 @@ class NotificationEvent { required this.jid, required this.type, this.payload, + this.extra, }); /// The JID the notification was for. @@ -209,11 +216,15 @@ class NotificationEvent { /// Otherwise: undefined. String? payload; + /// Extra data. Only set when type == NotificationType.reply. + Map? extra; + Object encode() { return [ jid, type.index, payload, + extra, ]; } @@ -223,6 +234,7 @@ class NotificationEvent { jid: result[0]! as String, type: NotificationEventType.values[result[1]! as int], payload: result[2] as String?, + extra: (result[3] as Map?)?.cast(), ); } } diff --git a/pigeons/api.dart b/pigeons/api.dart index a156cef..33ae13b 100644 --- a/pigeons/api.dart +++ b/pigeons/api.dart @@ -54,7 +54,7 @@ class NotificationMessage { } class MessagingNotification { - const MessagingNotification(this.title, this.id, this.jid, this.messages, this.channelId); + const MessagingNotification(this.title, this.id, this.jid, this.messages, this.channelId, this.extra); /// The title of the conversation. final String title; @@ -70,6 +70,9 @@ class MessagingNotification { /// Messages to show. final List messages; + + /// Additional data to include. + final Map? extra; } enum NotificationIcon { @@ -120,6 +123,9 @@ class NotificationEvent { /// - type == NotificationType.reply: The reply message text. /// Otherwise: undefined. final String? payload; + + /// Extra data. Only set when type == NotificationType.reply. + final Map? extra; } class NotificationI18nData {