The siren-android-inbox
sdk is a comprehensive and customizable android UI kit for displaying and managing notifications. This documentation provides comprehensive information on how to install, configure, and use the sdk effectively.
You will need your sdk token for initializing your library.
- Add the JitPack repository to your build file
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Add the dependency
dependencies {
implementation 'com.github.KeyValueSoftwareSystems:siren-android-inbox:1.0.1'
}
Initialize SirenSDK
in MainActivity
by passing the context, token, recipientId and errorCallback
import com.keyvalue.siren.androidsdk.helper.client.SirenSDK
class MainActivity {
...
val sirenSDK =
SirenSDK.getInstance(
context = applicationContext,
token = "USER_TOKEN",
recipientId = "RECIPIENT_ID",
object : ErrorCallback {
override fun onError(jsonObject: JSONObject) {
}
},
)
...
}
This composable function consists of a notification icon along with a badge to display the number of unviewed notifications.
import com.keyvalue.siren.androidsdk.helper.customization.SirenInboxIconProps
sirenSDK.SirenInboxIcon(
SirenInboxIconProps(
theme = customTheme,
darkMode = true,
customStyles = customStyles,
notificationIcon = CustomIcon(),
),
object : SirenInboxIconCallback {
override fun onError(jsonObject: JSONObject) {
}
override fun onClick() {
}
},
)
Below are optional parameters available for the icon composable function:
Parameter | Description | Type | Default value |
---|---|---|---|
theme | Data class defining the theme configuration | Theme | null |
customStyles | Data class defining the customizable styles | CustomStyles | null |
notificationIcon | Option to use custom notification icon | @Composable (() -> Unit)? | null |
darkMode | Toggle to enable dark mode | Boolean | false |
disabled | Toggle to disable click on icon | Boolean | false |
hideBadge | Toggle to hide the badge displayed on the notification icon | Boolean | false |
Inbox is a paginated list view for displaying notifications.
import com.keyvalue.siren.androidsdk.helper.customization.SirenInboxProps
import com.keyvalue.siren.androidsdk.data.model.AllNotificationResponseData
sirenSDK.SirenInbox(
SirenInboxProps(
theme = customTheme,
title = "Notifications",
hideHeader = false,
darkMode = true,
),
object : SirenInboxCallback {
override fun onCardClick(notificationItem: AllNotificationResponseData) {
}
override fun onError(jsonObject: JSONObject) {
}
},
)
Given below are the list of parameters of the Siren inbox composable function:
Parameter | Description | Type | Default value |
---|---|---|---|
theme | Data class defining the theme configuration | Theme | null |
customStyles | Data class defining the customizable styles | Theme | null |
title | Title of the notification inbox | String | "Notifications" |
hideHeader | Toggle to hide the header section | Boolean | false |
hideClearAll | Toggle to hide the clear all button | Boolean | false |
darkMode | Toggle to enable dark mode | Boolean | false |
cardProps | Props for customizing the notification cards | CardProps | null |
listEmptyComponent | Custom composable function for empty notification list | (@Composable () -> Unit) | null |
customHeader | Custom header composable function | (@Composable () -> Unit) | null |
customFooter | Custom footer composable function | (@Composable () -> Unit) | null |
customNotificationCard | Custom click handler for notification cards | (@Composable (AllNotificationResponseData) -> Unit) | null |
customLoader | Custom composable function to display the initial loading state | (@Composable () -> Unit) | null |
customErrorWindow | Custom error window | (@Composable () -> Unit) | null |
itemsPerFetch | Number of notifications fetch per api request (have a max cap of 50) | Int | 20 |
data class CardProps(
val hideAvatar: Boolean? = false,
)
Here are the available theme options:
import androidx.compose.ui.graphics.Color
data class Theme(
val dark: ThemeProps? = null,
val light: ThemeProps? = null,
)
data class ThemeProps(
val colors: ThemeColors? = null,
val badgeStyle: BadgeThemeProps? = null,
val windowHeader: WindowHeaderThemeProps? = null,
val windowContainer: WindowContainerThemeProps? = null,
val notificationCard: NotificationCardThemeProps? = null,
)
data class ThemeColors(
val primaryColor: Color? = null,
val textColor: Color? = null,
val neutralColor: Color? = null,
val borderColor: Color? = null,
val highlightedCardColor: Color? = null,
val dateColor: Color? = null,
val deleteIcon: Color? = null,
val timerIcon: Color? = null,
val clearAllIcon: Color? = null,
val infiniteLoader: Color? = null,
)
data class BadgeThemeProps(
val color: Color? = null,
val textColor: Color? = null,
)
data class WindowHeaderThemeProps(
val background: Color? = null,
val titleColor: Color? = null,
val headerActionColor: Color? = null,
val borderColor: Color? = null,
)
data class WindowContainerThemeProps(
val background: Color? = null,
)
data class NotificationCardThemeProps(
val borderColor: Color? = null,
val background: Color? = null,
val titleColor: Color? = null,
val descriptionColor: Color? = null,
)
Here are the custom style options:
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.graphics.Shape
data class CustomStyles(
val notificationIcon: NotificationIconStyle? = null,
val window: WindowStyle? = null,
val windowHeader: WindowHeaderStyle? = null,
val windowContainer: WindowContainerStyle? = null,
val notificationCard: NotificationCardStyle? = null,
val badgeStyle: BadgeStyle? = null,
val deleteIcon: DeleteIconStyle? = null,
val dateIcon: DateIconStyle? = null,
val clearAllIcon: ClearAllIconStyle? = null,
)
data class NotificationIconStyle(
val size: Dp? = null,
)
data class WindowStyle(
val width: Dp? = null,
val height: Dp? = null,
)
data class WindowHeaderStyle(
val height: Dp? = null,
val titleFontWeight: FontWeight? = null,
val titleSize: TextUnit? = null,
val closeIconSize: Dp? = null,
val titlePadding: Dp? = null,
)
data class WindowContainerStyle(
val padding: Dp? = null,
)
data class NotificationCardStyle(
val padding: Dp? = null,
val borderWidth: Dp? = null,
val avatarSize: Dp? = null,
val titleFontWeight: FontWeight? = null,
val titleSize: TextUnit? = null,
val descriptionSize: TextUnit? = null,
val dateSize: TextUnit? = null,
)
data class BadgeStyle(
val size: Dp? = null,
val textSize: TextUnit? = null,
val borderShape: Shape? = null,
val top: Int? = null,
val right: Int? = null,
)
data class DeleteIconStyle(
val size: Dp? = null,
)
data class DateIconStyle(
val size: Dp? = null,
)
data class ClearAllIconStyle(
val size: Dp? = null,
)
Utility functions for modifying notifications:
Functions | Parameters | Type | Description |
---|---|---|---|
markNotificationsAsReadByDate | startDate | ISO date string | Sets the read status of notifications to true until the given date |
markAsRead | id | string | Set read status of a notification to true |
deleteNotification | id | string | Delete a notification by id |
deleteNotificationsByDate | startDate | ISO date string | Delete all notifications until given date |
markNotificationsAsViewed | startDate | ISO date string | Sets the viewed status of notifications to true until the given date |
updateToken | userToken, recipientId | string | To change the tokens |
Sample code:
import com.keyvalue.siren.androidsdk.helper.client.SirenSDK
import com.keyvalue.siren.androidsdk.helper.client.callbacks.ErrorCallback
import com.keyvalue.siren.androidsdk.data.model.MarkAsReadByIdResponseData
import com.keyvalue.siren.androidsdk.helper.client.callbacks.MarkAsReadByIdCallback
...
val sirenSDK =
SirenSDK.getInstance(
this,
"userToken",
"recipientId",
object : ErrorCallback {
override fun onError(jsonObject: JSONObject) {
}
},
)
fun markAsRead() {
sirenSDK.markAsRead(
notificationId = "notificationId",
callback = object : MarkAsReadByIdCallback {
override fun onSuccess(responseData: MarkAsReadByIdResponseData?) {
// onSuccess
}
override fun onError(jsonObject: JSONObject) {
// onError
}
}
)
}
Given below are all possible error codes thrown by sdk.
Error code | Description |
---|---|
TIMED_OUT | Request timed out |
INVALID_TOKEN | The token passed is invalid |
INVALID_RECIPIENT_ID | The recipient id passed is invalid |
TOKEN_VERIFICATION_FAILED | Verification of the given tokens has failed |
GENERIC_API_ERROR | Occurrence of an unexpected api error |
Here's a basic example to help you get started
package com.keyvalue.sirensampleapp
// Add all necessary imports
...
import com.keyvalue.siren.androidsdk.data.model.AllNotificationResponseData
import com.keyvalue.siren.androidsdk.data.model.DataStatus
import com.keyvalue.siren.androidsdk.helper.client.SirenSDK
import com.keyvalue.siren.androidsdk.helper.client.callbacks.ErrorCallback
import com.keyvalue.siren.androidsdk.helper.client.callbacks.SirenAllNotificationUpdateCallback
import com.keyvalue.siren.androidsdk.helper.client.callbacks.SirenInboxCallback
import com.keyvalue.siren.androidsdk.helper.client.callbacks.SirenInboxIconCallback
import com.keyvalue.siren.androidsdk.helper.customization.SirenInboxIconProps
import com.keyvalue.siren.androidsdk.helper.customization.SirenInboxProps
// replace with userToken and recipientId
val sirenSDK =
SirenSDK.getInstance(
this,
"userToken",
"recipientId",
object : ErrorCallback {
override fun onError(jsonObject: JSONObject) {
}
},
)
sirenSDK.SirenInboxIcon(
SirenInboxIconProps(
darkMode = true,
notificationIcon = {
Icon(
imageVector = Icons.Default.Notifications,
tint = Color(236, 155, 112, 255),
modifier = Modifier.size(100.dp),
)
},
),
object : SirenInboxIconCallback {
override fun onError(jsonObject: JSONObject) {
// onError
}
override fun onClick() {
// onClick
}
},
)
sirenSDK.SirenInbox(
SirenInboxProps(),
object : SirenInboxCallback {
override fun onCardClick(notificationItem: AllNotificationResponseData) {
// onClick
}
override fun onError(jsonObject: JSONObject) {
// onError
}
},
)
fun deleteNotification() {
sirenSDK.deleteNotification(
notificationId = "notificationId",
callback = object : SirenAllNotificationUpdateCallback {
override fun onSuccess(dataStatus: DataStatus?) {
// onSuccess
}
override fun onError(jsonObject: JSONObject) {
// onError
}
}
)
}
fun updateToken() {
sirenSDK.updateToken(
userToken = "userToken",
recipientId = "recipientId"
)
}