diff --git a/src/android/org/kde/knotifications/KNotification.java b/src/android/org/kde/knotifications/KNotification.java --- a/src/android/org/kde/knotifications/KNotification.java +++ b/src/android/org/kde/knotifications/KNotification.java @@ -33,6 +33,9 @@ public String title; public Object icon; public ArrayList actions = new ArrayList(); + public String channelId; + public String channelName; + public String channelDescription; public void setIconFromData(byte[] data, int length) { diff --git a/src/android/org/kde/knotifications/NotifyByAndroid.java b/src/android/org/kde/knotifications/NotifyByAndroid.java --- a/src/android/org/kde/knotifications/NotifyByAndroid.java +++ b/src/android/org/kde/knotifications/NotifyByAndroid.java @@ -19,6 +19,7 @@ import android.app.Activity; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -28,6 +29,7 @@ import android.graphics.drawable.Icon; import android.os.Build; import android.util.Log; +import java.util.HashSet; /** Java side of the Android notfication backend. */ public class NotifyByAndroid extends BroadcastReceiver @@ -42,6 +44,7 @@ private android.content.Context m_ctx; private NotificationManager m_notificationManager; private int m_uniquePendingIntentId = 0; + private HashSet m_channels = new HashSet(); public NotifyByAndroid(android.content.Context context) { @@ -59,7 +62,24 @@ { Log.i(TAG, notification.text); - Notification.Builder builder = new Notification.Builder(m_ctx); + // notification channel + if (!m_channels.contains(notification.channelId)) { + m_channels.add(notification.channelId); + + if (Build.VERSION.SDK_INT >= 26) { + NotificationChannel channel = new NotificationChannel(notification.channelId, notification.channelName, NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription(notification.channelDescription); + m_notificationManager.createNotificationChannel(channel); + } + } + + Notification.Builder builder; + if (Build.VERSION.SDK_INT >= 26) { + builder = new Notification.Builder(m_ctx, notification.channelId); + } else { + builder = new Notification.Builder(m_ctx); + } + if (Build.VERSION.SDK_INT >= 23) { builder.setSmallIcon((Icon)notification.icon); } else { diff --git a/src/notifybyandroid.h b/src/notifybyandroid.h --- a/src/notifybyandroid.h +++ b/src/notifybyandroid.h @@ -41,7 +41,7 @@ void notificationActionInvoked(int id, int action); private: - void notifyDeferred(KNotification *notification, const KNotifyConfig *config); + void notifyDeferred(KNotification *notification); QAndroidJniObject m_backend; QHash> m_notifications; diff --git a/src/notifybyandroid.cpp b/src/notifybyandroid.cpp --- a/src/notifybyandroid.cpp +++ b/src/notifybyandroid.cpp @@ -17,6 +17,7 @@ #include "notifybyandroid.h" #include "knotification.h" +#include "knotifyconfig.h" #include "debug_p.h" #include @@ -92,21 +93,26 @@ void NotifyByAndroid::notify(KNotification *notification, KNotifyConfig *config) { + Q_UNUSED(config); // HACK work around that notification->id() is only populated after returning from here - QMetaObject::invokeMethod(this, [this, notification, config](){ notifyDeferred(notification, config); }, Qt::QueuedConnection); + // note that config will be invalid at that point, so we can't pass that along + QMetaObject::invokeMethod(this, [this, notification](){ notifyDeferred(notification); }, Qt::QueuedConnection); } -void NotifyByAndroid::notifyDeferred(KNotification* notification, const KNotifyConfig* config) +void NotifyByAndroid::notifyDeferred(KNotification* notification) { - Q_UNUSED(config); - + KNotifyConfig config(notification->appName(), notification->contexts(), notification->eventId()); QAndroidJniEnvironment env; QAndroidJniObject n("org/kde/knotifications/KNotification", "()V"); n.setField("id", notification->id()); n.setField("text", QAndroidJniObject::fromString(notification->text()).object()); n.setField("title", QAndroidJniObject::fromString(notification->title()).object()); + n.setField("channelId", QAndroidJniObject::fromString(notification->eventId()).object()); + n.setField("channelName", QAndroidJniObject::fromString(config.readEntry(QLatin1String("Name"))).object()); + n.setField("channelDescription", QAndroidJniObject::fromString(config.readEntry(QLatin1String("Comment"))).object()); + // icon QPixmap pixmap; if (!notification->iconName().isEmpty()) {