Pacote ai.atalia.chat, artefato ai.atalia:chat:0.4.0. Tudo é chamado pelo objeto Atalia. Os métodos suspend têm uma versão com AtaliaCallback para quem chama de Java ou fora de uma corrotina.
Atalia
Configuração
| Membro | Descrição |
|---|
configure(context: Context, channelToken: String, options: AtaliaOptions = AtaliaOptions()) | Inicia o SDK. Chame uma vez, no Application.onCreate. Chamar de novo troca o canal. |
SDK_VERSION: String | Versão do SDK ("0.4.0"). |
Chat
| Membro | Descrição |
|---|
open(context: Context) | Abre o chat numa activity do SDK: folha que sobe sobre o app ou tela cheia, conforme AtaliaOptions.presentation. |
openConversation(context: Context, conversationId: Long) | Abre direto numa conversa. Com o chat já aberto, só troca de conversa. |
Identificação
| Membro | Descrição |
|---|
suspend identify(jwt: String): AtaliaContact | Liga o visitante ao usuário logado. O JWT vem do seu backend. Lança AtaliaException. |
identify(jwt: String, callback: AtaliaCallback<AtaliaContact>) | O mesmo, com callback. |
suspend logout() | Encerra a sessão identificada; o aparelho volta a ser visitante anônimo. |
logout(callback: AtaliaCallback<Unit>?) | O mesmo, com callback (que pode ser null). |
Não lidas e estado
| Membro | Descrição |
|---|
unreadCount: StateFlow<Int> | Mensagens do atendente, da IA e do sistema ainda não lidas. |
isIdentified: StateFlow<Boolean> | A sessão pertence a um usuário identificado. |
isChatOpen: StateFlow<Boolean> | A tela do chat está aberta. |
suspend refreshUnread(): Int | Consulta as não lidas na Atalia e atualiza unreadCount. O SDK já consulta sozinho quando o app volta para a frente. |
refreshUnread(callback: AtaliaCallback<Int>) | O mesmo, com callback. |
Eventos
| Membro | Descrição |
|---|
events: SharedFlow<AtaliaEvent> | Eventos do chat, para coletar numa corrotina. |
addListener(listener: AtaliaListener) | Recebe os mesmos eventos por callback, na thread principal. |
removeListener(listener: AtaliaListener) | Para de receber. |
Kotlin
lifecycleScope.launch {
Atalia.events.collect { event ->
when (event) {
is AtaliaEvent.MessageReceived -> Log.d("Atalia", "mensagem ${event.messageId}")
is AtaliaEvent.Error -> Log.w("Atalia", "erro ${event.code}")
else -> Unit
}
}
}
Notificações push
| Membro | Descrição |
|---|
setPushToken(token: String) | Token do Firebase do aparelho. Pode chegar antes do configure: é aplicado quando ele vier. |
clearPushToken() | Tira o aparelho da Atalia. |
isAtaliaNotification(data: Map<String, String>?): Boolean | A notificação veio da Atalia? |
handleNotification(context: Context, data: Map<String, String>?, title: String?, body: String?): Boolean | Para o onMessageReceived. Atualiza as não lidas e mostra a notificação, a não ser que o chat esteja na tela. Devolve false quando não é da Atalia. |
handleNotificationTap(activity: Activity, intent: Intent?): Boolean | Para o onCreate e o onNewIntent da activity de entrada. Abre o chat na conversa da notificação. Devolve false quando não é da Atalia. |
Botão flutuante
| Membro | Descrição |
|---|
showLauncher(activity: Activity, options: AtaliaLauncherOptions = AtaliaLauncherOptions()): AtaliaLauncherView | Mostra o botão flutuante por cima da activity. Chamar de novo troca as opções. |
hideLauncher(activity: Activity) | Tira o botão. |
AtaliaOptions
Passadas no configure.
| Propriedade | Tipo | Padrão | Descrição |
|---|
baseUrl | String | "https://chat.atalia.ai" | Origem do chat. Troque só para homologação ou para o domínio próprio do canal. |
customDomain | Boolean | false | true quando baseUrl é o domínio próprio vinculado ao canal. |
closeButton | Boolean | true | Mostra o botão "Fechar". Desligue quando o chat for uma aba do app. |
debug | Boolean | false | Permite inspecionar o WebView pelo chrome://inspect. Nunca em produção. |
urlHandler | ((Context, Uri) -> Boolean)? | null | Decide como abrir os links tocados no chat. Devolva true se o app tratou; false abre pelo sistema. |
notificationIcon | Int? (@DrawableRes) | balão da Atalia | Ícone pequeno (monocromático) da notificação mostrada com o app aberto. Até a 0.2.0, o padrão era o ícone do app, que o sistema pode recusar. |
presentation | Presentation | SHEET | Como open mostra o chat: SHEET (folha que sobe sobre o app, com o fundo escurecido; arrastar a alça ou tocar fora fecha) ou FULL_SCREEN (tela cheia). |
AtaliaEvent
| Evento | Quando |
|---|
Ready | O chat terminou de carregar. |
Opened / Closed | A tela do chat abriu ou fechou. |
Identified(externalId: String, contactId: Long) | O visitante foi identificado. |
LoggedOut | A sessão identificada foi encerrada. |
ConversationStarted(conversationId: Long) | Uma conversa começou. |
ConversationClosed(conversationId: Long) | Uma conversa foi encerrada. |
MessageReceived(conversationId: Long, messageId: Long) | Chegou mensagem do atendente, da IA ou do sistema. Só os ids: o texto nunca sai do chat. |
UnreadChanged(count: Int) | O total de não lidas mudou. |
Error(code: String, command: String?) | Falha do chat (INIT_FAILED) ou de um comando (command = "identify", "open_conversation"...). |
Devolvido pelo identify.
| Propriedade | Tipo | Descrição |
|---|
externalId | String | O sub do JWT: o id do usuário no seu sistema. |
contactId | Long | O contato na Atalia. |
name | String? | Nome do contato, quando há. |
AtaliaException
Erro das chamadas do SDK. code é o mesmo código devolvido pela Atalia.
code | Quando |
|---|
NO_SECRET_CONFIGURED, INVALID_SIGNATURE, EXPIRED, INVALID_TOKEN, REPLAYED | identify recusado. Veja os códigos. |
NOT_CONFIGURED (AtaliaException.NOT_CONFIGURED) | O configure ainda não foi chamado. |
TIMEOUT (AtaliaException.TIMEOUT) | Com o chat aberto, ele não respondeu a tempo a um comando. |
SESSION_FAILED | A Atalia não criou a sessão do visitante. |
UNREAD_FAILED | A consulta de não lidas falhou. |
NETWORK_ERROR | Só nas versões com callback: falha de rede sem mensagem. Nas versões suspend, a falha de rede chega como IOException. |
AtaliaListener e AtaliaCallback
| Tipo | Membros |
|---|
fun interface AtaliaListener | onEvent(event: AtaliaEvent) |
interface AtaliaCallback<T> | onSuccess(value: T) e onError(error: AtaliaException), sempre na thread principal. |
AtaliaLauncherView e AtaliaLauncherOptions
AtaliaLauncherView(context: Context, attrs: AttributeSet? = null, options: AtaliaLauncherOptions = AtaliaLauncherOptions()): o botão flutuante como view, para posicionar você mesmo.
| Membro | Descrição |
|---|
options: AtaliaLauncherOptions | Trocar mostra o botão aberto de novo, e ele recolhe do jeito novo. |
remove() | Tira o botão da tela. |
As opções estão em Botão flutuante.
AtaliaChatView
O chat como view, para embutir numa tela sua (uma aba, por exemplo), em vez da tela cheia do open. Quem hospeda implementa AtaliaChatView.Host e repassa o ciclo de vida.
| Membro | Descrição |
|---|
host: AtaliaChatView.Host? | Quem atende os pedidos da view. |
load(conversationId: Long? = null) | Carrega o chat; com conversationId, direto nessa conversa. |
openConversation(conversationId: Long) | Troca de conversa com o chat aberto. |
onAppForeground() / onAppBackground() | Chame no onStart e no onStop de quem hospeda. Em segundo plano o chat avisa a Atalia que o cliente saiu, o que libera as notificações push. |
destroy() | Chame no onDestroy de quem hospeda. |
AtaliaChatView.Host | Descrição |
|---|
onCloseRequested() | O cliente tocou em "Fechar". |
showFileChooser(callback: ValueCallback<Array<Uri>>, params: WebChromeClient.FileChooserParams): Boolean | Abrir o seletor de arquivos. Devolva false se não puder (o anexo é cancelado). |
requestPermission(permission: String, onResult: (Boolean) -> Unit) | Pedir uma permissão (o microfone, para a nota de voz). |
onPrimaryColorChanged(color: String) | Opcional. A cor do canal chegou com a tela já aberta. |
Dados da notificação
A notificação da Atalia traz estes dados, todos em texto: atalia ("1"), v, channel_token, conversation_id, message_id e sender_type. No teste do painel, type vale "test" e não há conversa. O canal de notificação do Android é atalia_chat, e a tag de cada notificação é atalia-conv-<conversation_id>.