Android SDK (Kotlin)
Official Android SDK for embedding chat in Android apps. Written in Kotlin with Coroutines.
Requirements
Section titled “Requirements”- Android 7.0+ (API level 24+)
- Kotlin 1.8+
Installation
Section titled “Installation”Add to your build.gradle.kts:
dependencies { implementation("com.uchara:sdk-android:1.0.0")}Or build.gradle (Groovy):
dependencies { implementation 'com.uchara:sdk-android:1.0.0'}Visitor SDK
Section titled “Visitor SDK”import com.uchara.sdk.*import kotlinx.coroutines.launch
class ChatActivity : AppCompatActivity() { private lateinit var visitor: VisitorSDK
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
visitor = VisitorSDK( VisitorConfig( apiURL = "https://api.uchara.com", widgetToken = "wgt_your_token" ) )
// Initialize session lifecycleScope.launch { visitor.initialize().onSuccess { session -> Log.d("Chat", "Session: ${session.contactId}") loadConversation() }.onFailure { error -> Log.e("Chat", "Error: $error") } }
// Listen for real-time events visitor.onEvent = { event -> when (event) { is WSEvent.MessageNew -> Log.d("Chat", "New message: ${event.message.content}") is WSEvent.Typing -> Log.d("Chat", "Agent is typing…") else -> {} } } }
private suspend fun loadConversation() { visitor.getActiveConversation().onSuccess { conv -> if (conv != null) loadMessages(conv.id) else startNewConversation() } }
private suspend fun startNewConversation() { visitor.startConversation( StartConversationRequest(message = "Hello!") ).onSuccess { conv -> Log.d("Chat", "Conversation started: ${conv.id}") } }
private suspend fun sendMessage(text: String) { val convId = visitor.getCurrentConversationId() ?: return visitor.sendMessage( convId, SendMessageRequest(content = text) ).onSuccess { message -> Log.d("Chat", "Message sent: ${message.id}") } }
override fun onDestroy() { super.onDestroy() visitor.disconnect() }}Jetpack Compose
Section titled “Jetpack Compose”@Composablefun ChatScreen() { val visitor = remember { VisitorSDK( VisitorConfig( apiURL = "https://api.uchara.com", widgetToken = "wgt_your_token" ) ) }
var messages by remember { mutableStateOf<List<Message>>(emptyList()) } var input by remember { mutableStateOf("") }
LaunchedEffect(Unit) { visitor.initialize() visitor.onEvent = { event -> if (event is WSEvent.MessageNew) { messages = messages + event.message } } }
Column(Modifier.fillMaxSize()) { LazyColumn(Modifier.weight(1f)) { items(messages) { message -> MessageItem(message) } } Row(Modifier.padding(8.dp)) { TextField( value = input, onValueChange = { input = it }, modifier = Modifier.weight(1f) ) Button(onClick = { /* send */ }) { Text("Send") } } }}