Skip to content

Android SDK (Kotlin)

Official Android SDK for embedding chat in Android apps. Written in Kotlin with Coroutines.

  • Android 7.0+ (API level 24+)
  • Kotlin 1.8+

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'
}
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()
}
}
@Composable
fun 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") }
}
}
}