diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java index 6e4bf7c45..ec36bcfd0 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java @@ -140,6 +140,15 @@ public class IterableConfig { @Nullable final IterableAPIMobileFrameworkInfo mobileFrameworkInfo; + /** + * Custom notification channel name for push notifications. + * If set, this name will be used for all Iterable notification channels instead of + * deriving the channel name from the sound file name. This prevents non-human-readable + * sound file names from appearing as channel names in the device notification settings. + */ + @Nullable + final String notificationChannelName; + /** * Base URL for Webview content loading. Specifically used to enable CORS for external resources. * If null or empty, defaults to empty string (original behavior with about:blank origin). @@ -148,6 +157,15 @@ public class IterableConfig { @Nullable final String webViewBaseUrl; + /** + * Get the configured notification channel name + * @return Custom notification channel name, or null if not configured + */ + @Nullable + public String getNotificationChannelName() { + return notificationChannelName; + } + /** * Get the configured WebView base URL * @return Base URL for WebView content, or null if not configured @@ -182,6 +200,7 @@ private IterableConfig(Builder builder) { iterableUnknownUserHandler = builder.iterableUnknownUserHandler; decryptionFailureHandler = builder.decryptionFailureHandler; mobileFrameworkInfo = builder.mobileFrameworkInfo; + notificationChannelName = builder.notificationChannelName; webViewBaseUrl = builder.webViewBaseUrl; } @@ -210,6 +229,7 @@ public static class Builder { private int eventThresholdLimit = 100; private IterableIdentityResolution identityResolution = new IterableIdentityResolution(); private IterableUnknownUserHandler iterableUnknownUserHandler; + private String notificationChannelName; private String webViewBaseUrl; public Builder() {} @@ -453,6 +473,18 @@ public Builder setMobileFrameworkInfo(@NonNull IterableAPIMobileFrameworkInfo mo return this; } + /** + * Set a custom notification channel name for push notifications. + * If set, this name will be used for all Iterable notification channels instead of + * deriving the channel name from the sound file name. + * @param notificationChannelName Custom channel name for notifications + */ + @NonNull + public Builder setNotificationChannelName(@Nullable String notificationChannelName) { + this.notificationChannelName = notificationChannelName; + return this; + } + /** * Set the base URL for WebView content loading. Used to enable CORS for external resources. * If not set or null, defaults to empty string (original behavior with about:blank origin). diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableNotificationHelper.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableNotificationHelper.java index fdcae7024..c470d4a8f 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableNotificationHelper.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableNotificationHelper.java @@ -158,9 +158,21 @@ public IterableNotificationBuilder createNotification(Context context, Bundle ex soundUri = getSoundUri(context, soundName, soundUrl); - String channelName = (soundUri == Settings.System.DEFAULT_NOTIFICATION_URI) - ? getChannelName(context) - : soundName; + // Use custom channel name from config if available, otherwise fall back to sound name + String customChannelName = null; + IterableConfig config = IterableApi.getInstance().config; + if (config != null) { + customChannelName = config.getNotificationChannelName(); + } + + String channelName; + if (customChannelName != null && !customChannelName.isEmpty()) { + channelName = customChannelName; + } else if (soundUri == Settings.System.DEFAULT_NOTIFICATION_URI) { + channelName = getChannelName(context); + } else { + channelName = soundName; + } String channelId = (soundUri == Settings.System.DEFAULT_NOTIFICATION_URI) ? context.getPackageName() diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/IterableConfigTest.kt b/iterableapi/src/test/java/com/iterable/iterableapi/IterableConfigTest.kt index b017c66a6..588e1616f 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/IterableConfigTest.kt +++ b/iterableapi/src/test/java/com/iterable/iterableapi/IterableConfigTest.kt @@ -51,4 +51,19 @@ class IterableConfigTest { val config: IterableConfig = configBuilder.build() assertFalse(config.keychainEncryption) } + + @Test + fun defaultNotificationChannelName() { + val configBuilder: IterableConfig.Builder = IterableConfig.Builder() + val config: IterableConfig = configBuilder.build() + assertThat(config.notificationChannelName, `is`(nullValue())) + } + + @Test + fun setNotificationChannelName() { + val configBuilder: IterableConfig.Builder = IterableConfig.Builder() + .setNotificationChannelName("My App Notifications") + val config: IterableConfig = configBuilder.build() + assertThat(config.notificationChannelName, `is`("My App Notifications")) + } } \ No newline at end of file