git clone https://github.com/Tencent-RTC/TUIKit_Android_Compose.git
atomic-x/├── src/main/│ ├── java/io/trtc/tuikit/atomicx/ # UI component source code (required for integration)│ ├── messagelist/ # Message list component│ ├── messageinput/ # Message input component│ ├── conversationlist/ # Conversation list component│ ├── contactlist/ # Contact list component│ ├── basecomponent/ # Base components│ └── ... # Other UI components│ # Resource files (required for integration)│ ├── res/ # Common resources│ ├── res-message-list/ # Message list component resources│ ├── res-message-input/ # Message input component resources│ ├── res-conversation-list/ # Conversation list component resources│ └── ... # Other component resourceschat/├── uikit/src/main/java/io/trtc/tuikit/chat/pages # Page components (reference implementations)│ ├── ChatPage.kt│ ├── ContactsPage.kt│ └── ConversationsPage.kt└── demo/ # Sample application (optional reference)

// settings.gradle.ktsinclude(":atomicx")project(":atomicx").projectDir = file("../TUIKit_Android_Compose/atomic-x")
// settings.gradleinclude ':atomicx'project(':atomicx').projectDir = new File(settingsDir, '../TUIKit_Android_Compose/atomic-x')
// app/build.gradle.ktsdependencies {implementation(project(":atomicx"))
// app/build.gradledependencies {api project(':atomicx')}
tools:replace="android:allowBackup" to the application node to override the component's setting with your own.// app/src/main/AndroidManifest.xml<applicationandroid:name=".BaseApplication"android:allowBackup="false"android:icon="@drawable/app_ic_launcher"android:label="@string/app_name"android:largeHeap="true"android:theme="@style/AppTheme"tools:replace="android:allowBackup">
# gradle/libs.versions.toml[versions]agp = "8.13.0"kotlin = "2.0.21"coreKtx = "1.10.1"junit = "4.13.2"junitVersion = "1.1.5"espressoCore = "3.5.1"appcompat = "1.7.1"material = "1.13.0"runner = "1.0.2"espressoCoreVersion = "3.0.2"appcompatV7 = "28.0.0"tuicore = "8.6.7021"lifecycleRuntimeKtx = "2.8.7"ui = "1.8.0"foundation = "1.8.0"composeBom = "2024.09.00"activityCompose = "1.10.1"activity = "1.8.0"constraintlayout = "2.2.1"[libraries]androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }junit = { group = "junit", name = "junit", version.ref = "junit" }androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }material = { group = "com.google.android.material", name = "material", version.ref = "material" }runner = { group = "com.android.support.test", name = "runner", version.ref = "runner" }espresso-core = { group = "com.android.support.test.espresso", name = "espresso-core", version.ref = "espressoCoreVersion" }appcompat-v7 = { group = "com.android.support", name = "appcompat-v7", version.ref = "appcompatV7" }androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" }androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" }androidx-compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "ui" }androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }tuicore = { module = "com.tencent.liteav.tuikit:tuicore", version.ref = "tuicore" }com-tencent-mmkv = { group = "com.tencent", name = "mmkv", version = "1.3.14" }[plugins]android-application = { id = "com.android.application", version.ref = "agp" }kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }android-library = { id = "com.android.library", version.ref = "agp" }kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
// app/build.gradle.ktsplugins {// Add Compose pluginalias(libs.plugins.kotlin.compose)}android {// Enable ComposebuildFeatures {compose = true}}
// app/build.gradleplugins {// Add Compose pluginid libs.plugins.kotlin.compose.get().pluginId}android {// Enable ComposebuildFeatures {compose true}}
-keep class com.tencent.** { *; }

chat/demo/app/src/main/java/io/trtc/tuikit/chat/login/LoginActivity.kt:// User loginLoginStore.shared.login(context, SDKAPPID, userID, userSig,object : CompletionHandler {override fun onSuccess() {// Login successful, you can navigate to the chat or conversation page}override fun onFailure(code: Int, desc: String) {// Login failed, display an error dialog}})

chat/uikit/src/main/java/io/trtc/tuikit/chat/pages/ConversationsPage.kt. The ConversationsPage mainly performs the following tasks:@Composablefun ConversationsPage(onConversationClick: (ConversationInfo) -> Unit = {},editContent: @Composable () -> Unit = {},) {val colors = LocalTheme.current.colorsColumn(modifier = Modifier.fillMaxSize().background(Colors.Transparent)) {PageHeader(stringResource(R.string.chat_uikit_chat)) {editContent()}Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {ConversationList(modifier = Modifier.navigationBarsPadding(), onConversationClick = onConversationClick)}}}

chat/uikit/src/main/java/io/trtc/tuikit/chat/pages/ChatPage.kt. The ChatPage mainly performs the following tasks:@Composablefun ChatPage(conversationID: String,locateMessage: MessageInfo? = null,onUserClick: (String) -> Unit,onChatHeaderClick: (String) -> Unit,onBackClick: () -> Unit,) {...val avatarUrl = conversationState.value?.avatarURLval displayName = conversationState.value?.titleval colors = LocalTheme.current.colorsScaffold(modifier = Modifier.background(color = colors.bgColorOperate).fillMaxSize().wrapContentHeight(), topBar = {Box(modifier = Modifier.background(color = colors.bgColorOperate).fillMaxWidth().statusBarsPadding()) {ChatHeader(avatarUrl = avatarUrl,name = displayName ?: "",onBackClick = onBackClick,onAvatarClick = {onChatHeaderClick(conversationID)})}},bottomBar = {Box(modifier = Modifier.fillMaxWidth().background(color = colors.bgColorOperate)) {MessageInput(modifier = Modifier.navigationBarsPadding(), conversationID = conversationID)}}) { padding ->Box(modifier = Modifier.padding(padding)) {MessageList(conversationID = conversationID, locateMessage = locateMessage) {onUserClick(it)}}}}

chat/uikit/src/main/java/io/trtc/tuikit/chat/pages/ContactsPage.kt. The ContactsPage mainly performs the following tasks:@Composablefun ContactsPage(onContactClick: (ContactInfo) -> Unit = {},onGroupClick: (ContactInfo) -> Unit = {},editContent: @Composable () -> Unit = {},) {val colors = LocalTheme.current.colorsColumn(modifier = Modifier.fillMaxSize().background(Colors.Transparent)) {PageHeader(stringResource(R.string.chat_uikit_contacts)) {editContent()}Box(modifier = Modifier.fillMaxSize().navigationBarsPadding(), contentAlignment = Alignment.Center) {ContactList(onGroupClick = onGroupClick, onContactClick = onContactClick)}}}
Page | Callback | Recommended Navigation Logic |
ConversationsPage | onConversationClick: (ConversationInfo) -> Unit | Triggered when a conversation in the list is clicked; recommended to navigate to the chat page (ChatPage). |
ContactsPage | onContactClick: (ContactInfo) -> Unit | Triggered when a contact cell is clicked; recommended to navigate to the user info page (C2CChatSetting). |
| onGroupClick: (ContactInfo) -> Unit | Triggered when a group cell is clicked; recommended to navigate to the group chat page (ChatPage). |
ChatPage | onUserClick: (String) -> Unit | Triggered when a user's avatar or nickname in a message is clicked; recommended to navigate to the user info page (C2CChatSetting). |
| onChatHeaderClick: (String) -> Unit | Triggered when the avatar in the navigation bar is clicked; recommended to navigate to the user info page (C2CChatSetting) or group info page (GroupChatSetting). |
| onBackClick: () -> Unit | Triggered when the back button is clicked; recommended to return to the previous page. |
// chat/demo/app/src/main/java/io/trtc/tuikit/chat/MainActivity.kt// Conversation list cell click navigationConversationsPage(onConversationClick = {activity?.startActivity(Intent(activity, ChatActivity::class.java).apply {putExtra("conversationID", it.conversationID)})})// Contact page navigationContactsPage(onGroupClick = {ChatSettingActivity.start(context, "", it.contactID, true)}, onContactClick = {ChatSettingActivity.start(context, it.contactID, "", true)})
// chat/demo/app/src/main/java/io/trtc/tuikit/chat/chat/ChatActivity.kt// Chat page navigationChatPage(conversationID = conversationID,locateMessage = message,onUserClick = {handleChatSettingNavigation(it)}, onChatHeaderClick = {val userID = getUserID(conversationID)val groupID = getGroupID(conversationID)handleChatSettingNavigation(userID, groupID)}, onBackClick = { finish() })
Feedback