From d203af66f96e91b34dcbb9a2aad5c2c71abbdeb6 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Wed, 5 Mar 2025 17:18:21 -0500 Subject: [PATCH 1/2] example app, switch NSE to Kotlin --- Examples/OneSignalDemo/app/build.gradle | 1 + .../NotificationServiceExtension.java | 28 ---------------- .../NotificationServiceExtension.kt | 33 +++++++++++++++++++ 3 files changed, 34 insertions(+), 28 deletions(-) delete mode 100644 Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.java create mode 100644 Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.kt diff --git a/Examples/OneSignalDemo/app/build.gradle b/Examples/OneSignalDemo/app/build.gradle index b516efdad8..4586129d61 100644 --- a/Examples/OneSignalDemo/app/build.gradle +++ b/Examples/OneSignalDemo/app/build.gradle @@ -1,5 +1,6 @@ plugins { id 'com.android.application' + id 'kotlin-android' } android { diff --git a/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.java b/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.java deleted file mode 100644 index 6f1c603da5..0000000000 --- a/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.onesignal.sdktest.notification; - -import android.util.Log; - -import com.onesignal.notifications.IActionButton; -import com.onesignal.notifications.IDisplayableMutableNotification; -import com.onesignal.notifications.INotificationReceivedEvent; -import com.onesignal.notifications.INotificationServiceExtension; -import com.onesignal.sdktest.R; -import com.onesignal.sdktest.constant.Tag; - -public class NotificationServiceExtension implements INotificationServiceExtension { - - @Override - public void onNotificationReceived(INotificationReceivedEvent event) { - Log.v(Tag.LOG_TAG, "IRemoteNotificationReceivedHandler fired" + " with INotificationReceivedEvent: " + event.toString()); - - IDisplayableMutableNotification notification = event.getNotification(); - - if (notification.getActionButtons() != null) { - for (IActionButton button : notification.getActionButtons()) { - Log.v(Tag.LOG_TAG, "ActionButton: " + button.toString()); - } - } - - notification.setExtender(builder -> builder.setColor(event.getContext().getResources().getColor(R.color.colorPrimary))); - } -} diff --git a/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.kt b/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.kt new file mode 100644 index 0000000000..a20f32ff89 --- /dev/null +++ b/Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/notification/NotificationServiceExtension.kt @@ -0,0 +1,33 @@ +package com.onesignal.sdktest.notification + +import android.graphics.Color +import android.util.Log +import androidx.core.app.NotificationCompat +import com.onesignal.notifications.INotificationReceivedEvent +import com.onesignal.notifications.INotificationServiceExtension +import com.onesignal.sdktest.R +import com.onesignal.sdktest.constant.Tag + +class NotificationServiceExtension : INotificationServiceExtension { + override fun onNotificationReceived(event: INotificationReceivedEvent) { + Log.v( + Tag.LOG_TAG, + "IRemoteNotificationReceivedHandler fired with INotificationReceivedEvent: $event" + ) + + val notification = event.notification + + if (notification.actionButtons != null) { + for (button in notification.actionButtons!!) { + Log.v( + Tag.LOG_TAG, + "ActionButton: $button" + ) + } + } + + notification.setExtender { builder: NotificationCompat.Builder -> + builder.setColor(Color.GREEN) + } + } +} From e01d65d3b7a424f08146ca6247d9cfe5e667620b Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Wed, 5 Mar 2025 17:52:00 -0500 Subject: [PATCH 2/2] fix grouping when setColor is used in NSE This applies the color of the most recent notification added to the group to the summary notification. Without this logic the grouped notifications not only display the wrong color (the default is used) but also Android decides to display the small icon on the left of each notification as well. It seems the AOSP tries to be "smart" and if the icons are the same it just omits them on children. The logic is applied to both the SDK groupless / auto grouping logic as well as ones defined by push or overridden in the NSE. --- .../common/NotificationGenerationJob.kt | 4 ++++ .../display/impl/NotificationDisplayer.kt | 11 +++++++++++ .../impl/SummaryNotificationDisplayer.kt | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/common/NotificationGenerationJob.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/common/NotificationGenerationJob.kt index 71f3ccc1d2..8249f321e1 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/common/NotificationGenerationJob.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/common/NotificationGenerationJob.kt @@ -27,8 +27,10 @@ class NotificationGenerationJob( var overriddenTitleFromExtender: CharSequence? = null var overriddenSound: Uri? = null var overriddenFlags: Int? = null + var overriddenColor: Int? = null var orgFlags: Int? = null var orgSound: Uri? = null + var orgColor: Int? = null constructor(jsonPayload: JSONObject, time: ITime) : this( Notification(jsonPayload, time), @@ -73,8 +75,10 @@ class NotificationGenerationJob( ", overriddenTitleFromExtender=" + overriddenTitleFromExtender + ", overriddenSound=" + overriddenSound + ", overriddenFlags=" + overriddenFlags + + ", overriddenColor=" + overriddenColor + ", orgFlags=" + orgFlags + ", orgSound=" + orgSound + + ", orgColor=" + orgColor + ", notification=" + notification + '}' } diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/NotificationDisplayer.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/NotificationDisplayer.kt index fe24d9e765..84573131a3 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/NotificationDisplayer.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/NotificationDisplayer.kt @@ -202,6 +202,8 @@ internal class NotificationDisplayer( var mNotification = mNotificationField[notificationBuilder] as Notification notificationJob.orgFlags = mNotification.flags notificationJob.orgSound = mNotification.sound + notificationJob.orgColor = mNotification.color + notificationBuilder!!.extend(notificationJob.notification!!.notificationExtender!!) mNotification = mNotificationField[notificationBuilder] as Notification val mContentTextField = @@ -214,6 +216,15 @@ internal class NotificationDisplayer( val mContentTitle = mContentTitleField[notificationBuilder] as CharSequence? notificationJob.overriddenBodyFromExtender = mContentText notificationJob.overriddenTitleFromExtender = mContentTitle + + val mColor = + NotificationCompat.Builder::class.java.getDeclaredField("mColor") + mColor.isAccessible = true + val color = mColor[notificationBuilder] as Int? + if (color != notificationJob.orgColor) { + notificationJob.overriddenColor = color + } + if (!notificationJob.isRestoring) { notificationJob.overriddenFlags = mNotification.flags notificationJob.overriddenSound = mNotification.sound diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/SummaryNotificationDisplayer.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/SummaryNotificationDisplayer.kt index 807844e94d..9c96530169 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/SummaryNotificationDisplayer.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/display/impl/SummaryNotificationDisplayer.kt @@ -217,6 +217,13 @@ internal class SummaryNotificationDisplayer( for (line in summaryList) inboxStyle.addLine(line) inboxStyle.setBigContentTitle(summaryMessage) summaryBuilder.setStyle(inboxStyle) + + if (notificationJob.overriddenColor != null) { + summaryBuilder.setColor( + notificationJob.overriddenColor!!, + ) + } + summaryNotification = summaryBuilder.build() } else { // First notification with this group key, post like a normal notification. @@ -244,6 +251,13 @@ internal class SummaryNotificationDisplayer( } catch (t: Throwable) { // do nothing in this case...Android support lib 26 isn't in the project } + + if (notificationJob.overriddenColor != null) { + summaryBuilder.setColor( + notificationJob.overriddenColor!!, + ) + } + summaryNotification = summaryBuilder.build() _notificationDisplayBuilder.addXiaomiSettings(notifBuilder, summaryNotification) } @@ -282,6 +296,11 @@ internal class SummaryNotificationDisplayer( notificationJob.overriddenFlags!!, ) } + if (notificationJob.overriddenColor != null) { + summaryBuilder!!.setColor( + notificationJob.overriddenColor!!, + ) + } // The summary is designed to fit all notifications. // Default small and large icons are used instead of the payload options to enforce this.