Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
67d0556
[PIVOT] Group messages within 15 minutes
Aug 10, 2022
fdf3818
[PIVOT] Mark messages as READ only if chat is visible
Jul 6, 2023
4368015
[BRICK-970] Hide "text" part of Sendbird messages containing only `ae…
SimonCierniewski Jul 19, 2023
8da7079
[PIVOT] [BRICK-1006] disable the user's ability to delete a coach mes…
SimonCierniewski Aug 1, 2023
cacd150
[PIVOT] [BRICK-836] users can tap on deep links on coaching tab to la…
SimonCierniewski Aug 1, 2023
fcd470f
[PIVOT] [BRICK-1048] Hide the user ID that is displayed if replying (#5)
SimonCierniewski Aug 18, 2023
c0be246
Gradle update to 8.0.2 (#6)
SimonCierniewski Aug 18, 2023
3ed067f
[BRICK-1196] add mixpanel event property to coaching-send-message eve…
SimonCierniewski Aug 31, 2023
354c1bf
[BRICK-1256] Block Sendbird from closing our MainActivity (#9)
SimonCierniewski Sep 13, 2023
c345f18
[BRICK-1709] add mixpanel event when a user taps on a deeplink within…
SimonCierniewski Nov 27, 2023
4cc9cdb
[BRICK-1849] Update Sendbird UIKit to v3.10.1 (#13)
SimonCierniewski Nov 28, 2023
d5e2b9e
Update UIKIT to v3.13.0 (Feb 1, 2024) (#14)
SimonCierniewski Feb 28, 2024
8cc05d0
[BRICK-2492] Spanish translations (#15)
SimonCierniewski Mar 5, 2024
37297b8
[BRICK-2571] Upgrade compileSdkVersion and targetSdkVersion to latest…
SimonCierniewski Mar 14, 2024
d34f8bc
Updated UIKit to v3.21.0 (Sep 12, 2024) with Chat SDK `v4.19.0` (#17)
SimonCierniewski Sep 26, 2024
5512a37
Fixed: java.lang.IllegalStateException: Default FirebaseApp is not in…
SimonCierniewski Sep 26, 2024
ced0864
Merge branch 'main' of github.com:sendbird/sendbird-uikit-android int…
Jan 29, 2025
188d12d
Update README
Jan 29, 2025
2178458
Merge pull request #19 from carrotsense/update-to-v3.22.0
SimonCierniewski Feb 18, 2025
efcffb5
Update UIKit to v3.24.0 (Jul 31, 2025)
Aug 9, 2025
2042a4d
Merge pull request #20 from carrotsense/update-to-v3.24.0
SimonCierniewski Aug 18, 2025
26b49c7
Hide image title to fix edge to edge (#21)
SimonCierniewski Aug 18, 2025
7c73568
Played with versions and dependencies to get a working build
kevinwangcarrot Dec 10, 2025
42ae535
Sendbird change
kevinwangcarrot Dec 11, 2025
4eb77a7
Removed deprecated import kotlinx.android.parcel.Parcelize, Reverted …
kevinwangcarrot Dec 15, 2025
5033cf6
Lint fixes
kevinwangcarrot Dec 16, 2025
65cd905
Updated gradle version
kevinwangcarrot Dec 17, 2025
8aedf17
Reverted version change
kevinwangcarrot Dec 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,30 @@
# Changelog
### v3.24.0 (Jul 31, 2025) with Chat SDK `v4.28.2`
- Support MarkAsUnread in UIKit Android View
- Added new configuration option `enableMarkAsUnread` to enable/disable the feature
- Added new interfaces for using markAsUnread feature to `ChannelFragment` and `ChannelViewModel`
- Added `NewLineView` to indicate the start of unread messages.
- New `markAsUnread` menu item in `ChannelFragment`
- Fixed an issue where messages with same `createdAt` timestamps disappeared from `ChannelFragment`
### v3.23.3 (Jul 17, 2025) with Chat SDK `v4.27.3`
- Added support for setting `isAppearanceLightStatusBars` in edge-to-edge mode.
- Added `useAppearanceLightStatusBars` to `EdgeToEdgeConfig`.
### v3.23.2 (Jun 27, 2025) with Chat SDK `v4.27.3`
- Release with [the latest chat SDK](https://github.com/sendbird/sendbird-chat-sdk-android/releases/tag/4.27.3) to avoid potential issues
### v3.23.1 (Jun 24, 2025) with Chat SDK `v4.27.2`
- Release with [the latest chat SDK](https://github.com/sendbird/sendbird-chat-sdk-android/releases/tag/4.27.2) to avoid potential issues
### v3.23.0 (Apr 1, 2025) with Chat SDK `v4.24.1`
- Added a new interface to set the status bar color in edge-to-edge mode.
- Added `void setEdgeToEdgeConfig(EdgeToEdgeConfig)`
- Added `EdgeToEdgeConfig getEdgeToEdgeConfig()`
- Added `EdgeToEdgeConfig` which defines a configuration for UI styling in edge-to-edge mode
- Fixed an issue where some UIKit components were unresponsive when both the status bar and navigation bar were hidden in edge-to-edge mode.
- Fixed an issue where images, GIFs, and videos could not be downloaded while the network was offline.
### v3.22.2 (Feb 28, 2025) with Chat SDK `v4.24.0`
* Replaced `newIntent` methods, which had a channelUrl parameter, with one that does not include it. in `OpenChannelListActivity`
### v3.22.1 (Feb 20, 2025) with Chat SDK `v4.23.1`
* Fixed suggested replies not disappearing after sending a message.
* Fixed the mention list not showing up when typing a nickname.
### v3.22.0 (Dec 16, 2024) with Chat SDK `v4.21.1`
* Templated-related code has been moved to a separate module.
### v3.21.1 (Nov 12, 2024) with Chat SDK `v4.20.0`
Expand Down
122 changes: 14 additions & 108 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,116 +1,22 @@
# Sendbird UIKit for Android
![Platform](https://img.shields.io/badge/platform-ANDROID-orange.svg)
![Languages](https://img.shields.io/badge/language-JAVA-orange.svg)

## Introduction

We are introducing a new version of the Sendbird UIKit. Version 3 features a new modular architecture with more granular components that give you enhanced flexibility to customize your web and mobile apps. Check out our [migration guides](/changelogs/MIGRATIONGUIDE_V3.md) and download [our samples](https://github.com/sendbird/sendbird-uikit-android/tree/main/uikit-samples)

Sendbird UIKit for Android is a development kit with an user interface that enables an easy and fast integration of standard chat features into new or existing client apps. This repository houses the UIKit source code in addition to two samples as explained below.

- **uikit** is where you can find the open source code. Check out [UIKit Open Source Guidelines](https://github.com/sendbird/sendbird-uikit-android-sources/blob/main/OPENSOURCE_GUIDELINES.md) for more information regarding our stance on open source.
- **uikit-samples** consists of four use cases of UIKit.
You can navigate to each use case through the four menus that appear when you run it.
* Basic Usage - A sample that contains the basic usage of UIKit. Please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/README.md) for details.
* Customizations - Examples that have applied customization to UIKit. Please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/README.md) for details.
* AI Chatbot: You can chat with the AI Chatbot running on the Sendbird platform.
It is disabled by default, To enable it, please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/README.md) for details.
* Sendbird Notification: You can try out Sendbird's Notification product in this sample.
It is disabled by default. To enable it, please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/README.md) for details.
Caution: This sample is not related to push notifications. It is a demonstration of Sendbird's Notification product.

### More about Sendbird UIKIT for Android

Find out more about Sendbird UIKit for Android at [UIKit for Android doc](https://sendbird.com/docs/uikit/v3/android/overview). If you need any help in resolving any issues or have questions, visit [our community](https://community.sendbird.com).

<br />

## Before getting started

This section shows you the prerequisites you need for testing Sendbird UIKit for Android sample apps.

### Requirements

The minimum requirements for UIKit for Android are:

- Android 5.0 (API level 21) or higher
- Java 8 or higher
- Support androidx only
- Android Gradle plugin 4.0.1 or higher
- Sendbird Chat SDK for Android 4.0.3 and later

### Try the sample app using your data

If you would like to try the sample app specifically fit to your usage, you can do so by replacing the default sample app ID with yours, which you can obtain by [creating your Sendbird application from the dashboard](https://sendbird.com/docs/chat/v4/android/quickstart/send-first-message#3-install-and-configure-the-chat-sdk-4-step-1-create-a-sendbird-application-from-your-dashboard). Furthermore, you could also add data of your choice on the dashboard to test. This will allow you to experience the sample app with data from your Sendbird application.
# PIVOT

<br />
## Sendbird UIKit version: v3.24.0 (Jul 31, 2025) with Chat SDK v4.28.2

## Getting started
## Updating Sendbird library
Pull the origin repository.
Don't use rebase because it messes up git history by overriding original PRs/commit.

This section explains the steps you need to take before testing the sample apps.
`git fetch sendbird`

### Create a project
`git pull sendbird main`

Go to your `Android Studio` and create a project for UIKit for Android in the **Project window** as follows:
Next, to store a history of updates:
1. update `Sendbird UIKit version: $UIKIT_VERSION` in this README
2. create PR like: `Update UIKit to v3.10.1 (Nov 9, 2023)`

1. In the **Welcome to Android Studio** window, click **Start a new Android Studio project**.
2. In the **Select a Project Template** window, select **Empty Activity**, and click **Next**.
3. Enter your project name in the **Name** field in the **Configure your project** window.
4. Select your language as either **Java** or **Kotlin** from the **Language** drop-down menu.
5. Enable `Use androidx.*artifacts`.
6. Select minimum API level as 21 or higher.

### Install UIKit for Android

UIKit for Android is installed via `Gradle`. Begin by opening the project's top-level `build.gradle` file and adding code blocks as below:

> Note: Add the code blocks in your root `build.gradle` file, not your module `build.gradle` file.

```gradle
allprojects {
repositories {
maven { url "https://jitpack.io" }
maven { url "https://repo.sendbird.com/public/maven" }
}
}
```

If using Gradle 6.8 or higher, add the following to your `settings.gradle` file:

```gradle
dependencyResolutionManagement {
repositories {
maven { url "https://jitpack.io" }
maven { url "https://repo.sendbird.com/public/maven" }
}
}
```



Then, open the `build.gradle` file at the application level. For `Java` and `Kotlin`, add code blocks and dependencies as below:

> Note: View binding should be enabled in your `build.gradle` file.

```gradle
apply plugin: 'com.android.application'

android {
buildFeatures {
viewBinding true
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
implementation 'com.sendbird.sdk:uikit:LATEST_VERSION'
}
```

After saving your `build.gradle` file, click the **Sync** button to apply all the changes.
# Sendbird UIKit for Android
https://github.com/sendbird/sendbird-uikit-android/blob/main/CHANGELOG.md

<br />
# Sendbird SDK for Android
https://github.com/sendbird/sendbird-chat-sdk-android/blob/main/CHANGELOG.md
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.7.20'
ext.kotlin_version = '1.9.22'
ext.paparazzi_version = '1.3.1'

dependencies {
Expand All @@ -14,8 +14,8 @@ buildscript {
}
}
plugins {
id 'com.android.application' version '8.4.1' apply false
id 'com.android.library' version '8.4.1' apply false
id 'com.android.application' version '8.6.0' apply false
id 'com.android.library' version '8.6.0' apply false
id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false
id 'com.google.gms.google-services' version '4.3.15' apply false
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ android.nonTransitiveRClass=false
android.nonFinalResIds=false
android.enableR8.fullMode=false

UIKIT_VERSION = 3.22.0
UIKIT_VERSION = 3.24.0
UIKIT_VERSION_CODE = 1
6 changes: 3 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Mon May 02 15:36:41 KST 2022
#Wed Dec 17 10:53:20 EST 2025
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
2 changes: 2 additions & 0 deletions uikit-samples/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ android {
viewBinding true
buildConfig = true
}

namespace 'com.sendbird.uikit'
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.sendbird.uikit.samples.R
import com.sendbird.uikit.samples.common.SampleSettingsFragment
import com.sendbird.uikit.samples.common.consts.StringSet
import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme
import com.sendbird.uikit.samples.common.extensions.setInsetMargin
import com.sendbird.uikit.samples.common.preferences.PreferenceUtils
import com.sendbird.uikit.samples.common.widgets.CustomTabView
import com.sendbird.uikit.samples.databinding.ActivityGroupChannelMainBinding
Expand All @@ -35,6 +36,7 @@ class GroupChannelMainActivity : AppCompatActivity() {
setTheme(SendbirdUIKit.getDefaultThemeMode().resId)
binding = ActivityGroupChannelMainBinding.inflate(layoutInflater).apply {
setContentView(root)
root.setInsetMargin(window)
viewPager.adapter = MainAdapter(this@GroupChannelMainActivity)
val isDarkMode = PreferenceUtils.themeMode.isUsingDarkTheme()
val backgroundRedId = if (isDarkMode) R.color.background_600 else R.color.background_50
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import com.sendbird.uikit.samples.basic.openchannel.livestream.LiveStreamListFra
import com.sendbird.uikit.samples.common.SampleSettingsFragment
import com.sendbird.uikit.samples.common.consts.StringSet
import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme
import com.sendbird.uikit.samples.common.extensions.setInsetMargin
import com.sendbird.uikit.samples.common.preferences.PreferenceUtils
import com.sendbird.uikit.samples.common.widgets.CustomTabView
import com.sendbird.uikit.samples.databinding.ActivityOpenChannelMainBinding
Expand All @@ -46,6 +47,7 @@ class OpenChannelMainActivity : AppCompatActivity() {
)
)
setSupportActionBar(titleBar)
root.setInsetMargin(window)
viewPager.adapter = MainAdapter(this@OpenChannelMainActivity)
val backgroundRedId = if (isDarkMode) R.color.background_600 else R.color.background_50
tabLayout.setBackgroundResource(backgroundRedId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ import com.sendbird.uikit.fragments.OpenChannelFragment
import com.sendbird.uikit.samples.R
import com.sendbird.uikit.samples.common.consts.StringSet
import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme
import com.sendbird.uikit.samples.common.extensions.setInsetMargin
import com.sendbird.uikit.samples.common.extensions.toggleVisibility
import com.sendbird.uikit.samples.common.preferences.PreferenceUtils
import com.sendbird.uikit.samples.databinding.ActivityLiveStreamBinding
import com.sendbird.uikit.utils.ContextUtils
import org.json.JSONException
import org.json.JSONObject
import java.util.Locale
import java.lang.ref.WeakReference
import java.util.Locale

/**
* Displays an open channel screen used for live stream.
Expand Down Expand Up @@ -71,6 +72,7 @@ class LiveStreamActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = ActivityLiveStreamBinding.inflate(layoutInflater).apply {
setContentView(root)
root.setInsetMargin(window)
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
sbFragmentContainer.setBackgroundResource(android.R.color.transparent)
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
import com.sendbird.uikit.samples.R
import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme
import com.sendbird.uikit.samples.common.extensions.setInsetMargin
import com.sendbird.uikit.samples.common.preferences.PreferenceUtils

abstract class ThemeHomeActivity : AppCompatActivity() {
Expand All @@ -18,6 +19,7 @@ abstract class ThemeHomeActivity : AppCompatActivity() {
setTheme(if (PreferenceUtils.themeMode.isUsingDarkTheme()) R.style.AppTheme_Dark else R.style.AppTheme)
setContentView(binding.root)
applyTheme()
binding.root.setInsetMargin(window)
}

override fun onResume() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@ package com.sendbird.uikit.samples.common.extensions
import android.content.Context
import android.os.Build
import android.view.View
import android.view.Window
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat

@Suppress("DEPRECATION")
internal fun TextView.setAppearance(context: Context, res: Int) {
Expand All @@ -22,3 +26,20 @@ internal fun TextView.setTextColorResource(@ColorRes id: Int) {
internal fun View.toggleVisibility() {
visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE
}

internal fun View.setInsetMargin(window: Window) {
// For custom edge-to-edge system bar color
// val edgeToEdgeConfig = EdgeToEdgeConfig(
// statusBarColorLight = context.getColorResource(R.color.primary_300),
// statusBarColorDark = context.getColorResource(R.color.primary_100)
// )
// SendbirdUIKit.setEdgeToEdgeConfig(edgeToEdgeConfig)

ViewCompat.setOnApplyWindowInsetsListener(this) { v, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime())
v.setPadding(insets.left, insets.top, insets.right, insets.bottom)
WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = true
WindowInsetsCompat.CONSUMED
}
}

2 changes: 1 addition & 1 deletion uikit-samples/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/primary_main</item>
<item name="colorPrimaryDark">@color/primary_extra_dark</item>
Expand Down
2 changes: 1 addition & 1 deletion uikit-samples/src/main/res/values/styles_dark.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<resources>

<!-- Base application theme. -->
<style name="AppTheme.Dark">
<style name="AppTheme.Dark" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/primary_light</item>
<item name="colorPrimaryDark">@color/background_500</item>
Expand Down
14 changes: 7 additions & 7 deletions uikit/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ plugins {
id 'org.jetbrains.kotlin.android'
id 'kotlinx-serialization'
id 'kotlin-parcelize'
id 'org.jetbrains.dokka' version "$kotlin_version"
id 'org.jetbrains.dokka' version "1.9.20"
}


version = UIKIT_VERSION
android {
namespace 'com.sendbird.uikit'
compileSdk 34
compileSdk 35

version = UIKIT_VERSION
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
targetSdkVersion 35
versionCode Integer.parseInt(UIKIT_VERSION_CODE)
versionName UIKIT_VERSION

Expand Down Expand Up @@ -50,8 +50,8 @@ android {
}

compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
Expand All @@ -70,7 +70,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

// Sendbird
api 'com.sendbird.sdk:sendbird-chat:4.21.1'
api 'com.sendbird.sdk:sendbird-chat:4.28.2'
implementation "com.sendbird.sdk:message-template:1.0.0"

implementation 'com.github.bumptech.glide:glide:4.16.0'
Expand All @@ -83,7 +83,7 @@ dependencies {
implementation "androidx.viewpager2:viewpager2:1.1.0"
implementation 'com.google.android.material:material:1.5.0'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"

implementation "androidx.core:core-ktx:1.13.1"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2"
}
Expand Down
9 changes: 7 additions & 2 deletions uikit/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,13 @@
xmlns:tools="http://schemas.android.com/tools">

<!-- Required to maintain app compatibility. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" tools:ignore="ScopedStorage" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Expand Down
Loading