diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ec0742a..a8a50ee3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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`
diff --git a/README.md b/README.md
index c1f930b1..45afb365 100644
--- a/README.md
+++ b/README.md
@@ -1,116 +1,22 @@
-# Sendbird UIKit for Android
-
-
-
-## 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).
-
-
-
-## 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
-
+## 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
-
+# Sendbird SDK for Android
+https://github.com/sendbird/sendbird-chat-sdk-android/blob/main/CHANGELOG.md
diff --git a/build.gradle b/build.gradle
index f0348b4e..b4d44b99 100644
--- a/build.gradle
+++ b/build.gradle
@@ -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 {
@@ -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
}
diff --git a/gradle.properties b/gradle.properties
index 3eb54b42..38c822aa 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -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
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a09cf491..0a87b180 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -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
diff --git a/uikit-samples/build.gradle b/uikit-samples/build.gradle
index 5b989d53..a570e2d1 100644
--- a/uikit-samples/build.gradle
+++ b/uikit-samples/build.gradle
@@ -31,6 +31,8 @@ android {
viewBinding true
buildConfig = true
}
+
+ namespace 'com.sendbird.uikit'
}
dependencies {
diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt
index 05e9267c..9c4b4cbe 100644
--- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt
+++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt
@@ -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
@@ -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
diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt
index 64db2fe3..0f6634eb 100644
--- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt
+++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt
@@ -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
@@ -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)
diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt
index d8a187ce..c6ef98dd 100644
--- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt
+++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt
@@ -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.
@@ -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 {
diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt
index 50a9466e..8099ea52 100644
--- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt
+++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt
@@ -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() {
@@ -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() {
diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt
index 2d16835a..97c09d81 100644
--- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt
+++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt
@@ -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) {
@@ -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
+ }
+}
+
diff --git a/uikit-samples/src/main/res/values/styles.xml b/uikit-samples/src/main/res/values/styles.xml
index 1b399821..9178c0fc 100644
--- a/uikit-samples/src/main/res/values/styles.xml
+++ b/uikit-samples/src/main/res/values/styles.xml
@@ -1,7 +1,7 @@
-
+
+
+
+