Recursos

Aqui estão os recursos que você pode configurar no Oracle Android SDK.

Timestamps Absolutos e Relativos

Flag de recurso: timestampType: TimestampMode.RELATIVE

Você pode ativar timestamps absolutos ou relativos para mensagens de chat. Os timestamps absolutos exibem a hora exata de cada mensagem. Os timestamps relativos só são exibidos na mensagem mais recente e expressam o tempo em termos de segundos, dias, horas, meses ou anos atrás em relação à mensagem anterior. A precisão fornecida por timestamps absolutos os torna ideais para tarefas de arquivamento, mas dentro do contexto limitado de uma sessão de chat, essa precisão é extraída da experiência do usuário porque os usuários devem comparar os timestamps para descobrir a passagem de tempo entre as mensagens. Os timestamps relativos permitem que os usuários rastreiem a conversa facilmente por meio de termos como Há Pouco e Há alguns momentos que podem ser imediatamente compreendidos. Os timestamps relativos melhoram a experiência do usuário de outra forma, além de também simplificar suas tarefas de desenvolvimento: como os timestamps relativos marcam as mensagens em termos de segundos, dias, horas, meses ou anos atrás, você não precisa convertê-las em fusos horários.

Configurar Timestamps Relativos

Para adicionar um timestamp relativo:
  • Ativar timestamps – enableTimestamp: true
  • Ativar timestamps relativos – timestampType: 'relative'
Quando você configura o timestamp (timestampType: 'relative'), um timestamp absoluto é exibido antes da primeira mensagem do dia como cabeçalho. Esse cabeçalho é exibido quando a conversa não foi limpa e mensagens mais antigas ainda estão disponíveis no histórico.
Esse timestamp é atualizado nos seguintes intervalos regulares (segundos, minutos etc.) até que uma nova mensagem seja recebida.
  • Nos primeiros 10s
  • Entre 10s e 60s
  • Cada minuto entre 1m e 60m
  • Cada hora entre 1hr e 24hr
  • Cada dia entre 1d e 30d
  • Cada mês entre 1m e 12m
  • Todo ano após o primeiro ano
Quando uma nova mensagem é carregada no chat, o timestamp relativo na mensagem anterior é removido e um novo timestamp aparece na nova mensagem exibindo a hora relativa à mensagem anterior. Nesse ponto, o timestamp relativo é atualizado até que a próxima mensagem chegue.

Layout dos Botões de Ação

Flag do recurso: actionsLayout

actionsLayout define a direção do layout para as ações local, global, de cartão e de formulário. Quando você define isso como LayoutOrientation.HORIZONTAL, esses botões são dispostos horizontalmente e serão encapsulados se o conteúdo transbordar.

BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<Server_URI>, false, getApplicationContext())
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .actionsLayout(actionsLayout)
        .build();

Filtragem de Anexo

(Obrigatório) <Digite uma descrição curta aqui.>

Flag do recurso: shareMenuItems

Use esse recurso para restringir ou filtrar os tipos de item disponíveis no pop-up do menu de compartilhamento, definir o limite de tamanho do arquivo para uploads (como 1024 no trecho de código a seguir) e personalizar os ícones e rótulos do menu.
Observação

Para poder configurar shareMenuItems, defina enableAttachment como true.
ArrayList<Object> customItems = new ArrayList<>();
        ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
        ArrayList<Object> customItems = new ArrayList<>(Arrays.asList(shareMenuCustomItem1,shareMenuCustomItem2,shareMenuCustomItem3,ShareMenuItem.CAMERA));
        BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(sharedPreferences.getString(getString(R.string.pref_name_chat_server_host), Settings.CHAT_SERVER_URL), false, getApplicationContext())
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .shareMenuItems(customItems)
        .enableAttachment(true)
        .build();
Se um objeto ShareMenuCustomItem não tiver um valor ou um null para o label, como tem shareMenuCustomItem3 = ShareMenuCustomItem('csv') no trecho de código anterior, uma string type sufixada com share_ se tornará o label. Para shareMenuCustomItem3, o label é share_csv.
Observação

Você pode permitir que os usuários façam upload de todos os tipos de arquivo, definindo o type de um objeto ShareMenuCustomItem como *.

public static void shareMenuItems(ArrayList<Object> shareMenuItems)

Você pode atualizar dinamicamente o pop-up de itens de menu de compartilhamento chamando a API Bots.shareMenuItems(customItems);, em que customItems é um ArrayList de Objects. Cada objeto pode ser do tipo ShareMenuItem ou um objeto ShareMenuCustomItem.
ArrayList<Object> customItems = new ArrayList<>();
        ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
        customItems.add(shareMenuCustomItem1);
        customItems.add(ShareMenuItem.CAMERA);
        customItems.add(ShareMenuItem.FILE);
        customItems.add(shareMenuCustomItem2);
        customItems.add(shareMenuCustomItem3);
        Bots.shareMenuItems(customItems);

public static void shareMenuItems()

Você pode obter a lista de itens de menu de compartilhamento chamando a API Bots.shareMenuItems();.
Bots.shareMenuItems()

Envio automático de um campo

Quando um campo tem a propriedade autoSubmit definida como true, o cliente envia um FormSubmissionMessagePayload com o mapa submittedField contendo os valores de campo válidos que foram informados até o momento. Todos os campos que ainda não foram definidos (independentemente de serem obrigatórios) ou campos que violam uma validação do cliente não são incluídos no mapa submittedField. Se o próprio campo enviado automaticamente contiver um valor que não seja válido, a mensagem de envio não será enviada e a mensagem de erro do cliente será exibida para esse campo específico. Quando um envio automático for bem-sucedido, o partialSubmitField na mensagem de envio do formulário será definido como id do campo autoSubmit.

Substituindo um formulário de entrada anterior

Quando o usuário final envia o formulário, porque um campo tem autosubmit definido como true, a habilidade pode enviar um novo EditFormMessagePayload. Essa mensagem deve substituir a mensagem anterior do formulário de entrada. Definindo a propriedade de extensão do canal replaceMessage como true, você ativa o SDK para substituir a mensagem anterior do form de entrada pela mensagem atual do form de entrada.

Métodos de Conexão e Desconexão

A habilidade pode ser conectada e desconectada usando os métodos public void disconnect() e public void connect(). O WebSocket é fechado após chamar o método direto:
Bots.disconnect();
Chamar o método a seguir restabelece a conexão WebSocket se a habilidade estiver em um estado desconectado:
Bots.connect();
Quando public void connect(Botsconfiguration botsconfiguration) é chamado com um novo objeto botsconfiguration, a conexão WebSocket existente é fechada e uma nova conexão é estabelecida usando o novo objeto botsconfiguration.
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .build();

        Bots.connect(botsConfiguration);

Respostas Padrão do Cliente

Flag de recurso: enableDefaultClientResponse: true (padrão: false)

Use enableDefaultClientResponse: true para fornecer respostas padrão do cliente acompanhadas por um indicador de digitação quando a resposta da habilidade tiver sido atrasada ou quando não houver resposta da habilidade. Se o usuário enviar a primeira mensagem/consulta, mas a habilidade não responder com o número de segundos definido pelo flag odaas_default_greeting_timeout, a habilidade poderá exibir uma mensagem de saudação configurada usando a string de tradução odaas_default_greeting_message. Em seguida, o cliente verifica novamente a resposta da habilidade. O cliente exibirá a resposta da habilidade se ela tiver sido recebida, mas se não tiver sido recebida, o cliente exibirá uma mensagem de espera (configurada com a string de tradução odaas_default_wait_message) em intervalos definidos pelo flag odaas_default_wait_message_interval. Quando a espera pela resposta da habilidade excede o limite definido pelo flag typingIndicatorTimeout, o cliente exibe uma resposta lamentável ao usuário e interrompe o indicador de digitação. Você pode configurar a resposta de desculpas usando a string de tradução odaas_default_sorry_message.

Delegação

Configuração de recurso: messageModifierDelegate

O recurso de delegação permite que você defina um delegado para receber callbacks antes de determinados eventos na conversa. Para definir um delegado, uma classe deve implementar a interface MessageModifierDelegate e informar sua instância à propriedade messageModifierDelegate.
private MessageDelegate implements MessageModifierDelegate {
    @Override
    public Message beforeSend(Message message) {
        // Handle before send delegate here
    }

    @Override
    public Message beforeDisplay(Message message) {
        if (message != null && message.getPayload() != null && message.getPayload().getType() == MessagePayload.MessageType.CARD) {
            ((CardMessagePayload)message.getPayload()).setLayout(CardLayout.VERTICAL);
        }
        return message;
    }

    @Override
    public Message beforeNotification(Message message) {
        // Handle before notification delegate here
    }
}
    @Override
    public void beforeEndConversation(CompletionHandler completionHandler) {
        // Handle before end conversation end delegate here
        // Trigger completionHandler.onSuccess() callback after successful execution of the task.
        // Trigger completionHandler.onFailure() callback when the task is unsucessful.
        }
        }

public Message beforeDisplay(Message message)

O delegado public Message beforeDisplay(Message message) permite que a mensagem de uma habilidade seja modificada antes de ser exibida na conversa. A mensagem modificada que é retornada pelo delegado é exibida na conversa. Se o método retornar null, a mensagem não será exibida.

public Message beforeDisplay(Message message)

O delegado public Message beforeDisplay(Message message) permite que uma mensagem de usuário seja modificada antes de ser enviada ao servidor de chat. A mensagem retornada pelo delegado é enviada à habilidade. Se ela retornar nulo, a mensagem não será enviada.

public Message beforeNotification(Message message)

O delegado public Message beforeNotification(Message message) permite que a mensagem de uma habilidade seja modificada antes de uma notificação ser acionada. Se retornar nulo, a notificação não será acionada.

Exibir o Histórico de Conversas

Você pode ativar ou exibir o histórico de conversas locais de um usuário depois que o SDK foi reinicializado, definindo displayPreviousMessages como true ou false na configuração de bots. Quando definido como false, as mensagens anteriores não são exibidas para o usuário, após a reinicialização do SDK.

Encerrar a Sessão de Chat

FeatureFlag: enableEndConversation: true

enableEndConversation: true adiciona um botão de fechamento à exibição de cabeçalho que permite aos usuários encerrar explicitamente a sessão de chat atual. Uma caixa de diálogo de prompt de confirmação é aberta quando os usuários clicam nesse botão de fechamento e, quando confirmam a ação de fechamento, o SDK envia uma mensagem de evento para a habilidade que marca o fim da sessão de chat. O SDK, em seguida, desconecta a habilidade da instância, recolhe o widget de chat e apaga o histórico de conversas do usuário atual. O SDK aciona um delegado em beforeEndConversation(CompletionHandler completionHandler) que pode ser usado para executar uma tarefa antes de enviar a solicitação de fechamento da sessão ao servidor. Ele também gera um evento OnChatEnd() no qual você pode se registrar.

A abertura do widget de chat inicia uma nova sessão de chat.

public static void endChat()

A conversa também pode ser encerrada dinamicamente chamando a API Bots.endChat().
Bots.endChat()

CompletionHandler

CompletionHandler é um listener de eventos implementado no SDK, que escuta a conclusão da tarefa que está sendo executada no representante beforeEndConversation(CompletionHandler completionHandler) no aplicativo host. Consulte o Javadoc incluído no SDK disponível na página de download do ODA e do OMC.

SDK sem Interface do Usuário

O SDK pode ser usado sem sua interface de usuário. Para usá-lo nesse modo, importe apenas o pacote com.oracle.bots.client.sdk.android.core-24.12.aar para o projeto, conforme descrito em Adicionar o SDK do Cliente Oracle Android ao Projeto.

O SDK mantém a conexão com o servidor e fornece APIs para enviar mensagens, receber mensagens e obter atualizações para o status da rede e para outros serviços. Você pode usar as APIs para interagir com o SDK e atualizar a interface do usuário.

Você pode enviar uma mensagem usando qualquer uma das APIs send*() disponíveis na classe Bots. Por exemplo, public static void sendMessage(String text) envia uma mensagem de texto para a habilidade ou o assistente digital.

public static void sendMessage(String text)

Envia uma mensagem de texto para a habilidade. Seu parâmetro text é a mensagem de texto.
Bots.sendMessage("I want to order a Pizza");
EventListener
Para fazer listening da alteração do status da conexão, a mensagem enviada à habilidade e recebida da habilidade e os eventos de status de upload do anexo, uma classe deve implementar a interface EventListener, que implementa a funcionalidade para:
  • void onStatusChange(ConnectionStatus connectionStatus) – Este método é chamado quando o status da conexão WebSocket é alterado. Seu parâmetro connectionStatus é o status atual da conexão. Consulte os Javadocs incluídos no SDK (disponíveis na página de download do ODA e OMC) para obter mais detalhes sobre a enumeração ConnectionStatus.
  • void onMessageReceived(Message message) – Este método é chamado quando uma nova mensagem é recebida da habilidade. Seu parâmetro message é a mensagem recebida da habilidade. Consulte os Javadocs incluídos no SDK (disponíveis na página de download do ODA e OMC) para obter mais detalhes sobre a classe Message.
  • void onMessageSent(Message message) - Este método é chamado quando uma mensagem é enviada à habilidade. Seu parâmetro de mensagem é a mensagem enviada à habilidade. Consulte os Javadocs incluídos no SDK (disponíveis na página de download do ODA e OMC) para obter mais detalhes sobre a classe Message.
  • void onAttachmentComplete() – Este método é chamado quando um upload de anexo é concluído.
public class BotsEventListener implements EventListener {
    @Override
    public void onStatusChange(ConnectionStatus connectionStatus) {
        // Handle the connection status change
    }
 
    @Override
    public void onMessageReceived(Message message) {
        // Handle the messages received from skill/DA
    }
 
 
    @Override
    public void onMessageSent(Message message) {
        // Handle the message sent to skill or Digital Assistant
    }
 
    @Override
    public void onAttachmentComplete() {
        // Handle the post attachment upload actions
        // Close the attachment upload progress popup if any etc.
    }
}
A instância do tipo EventListener deve ser passada para setEventListener(EventListener eventListener).
public static void setEventListener(EventListener eventListener)
Define o listener para receber a resposta retornada da habilidade para obter atualizações sobre a alteração do status da conexão e receber uma atualização quando o upload do anexo estiver concluído. Seu parâmetro eventListener é uma instância do tipo EventListener para receber atualizações.
Bots.setEventListener(new BotsEventListener());

Webview In-Widget

Flag do recurso: linkHandler

Você pode configurar o comportamento do link em mensagens de chat para permitir que os usuários acessem páginas web dentro do widget de chat. Em vez de ter que alternar da conversa para exibir uma página em uma guia ou em outra janela do browser, um usuário pode permanecer no chat porque o widget de chat abre o link em uma Webview.

Configurar o Webview In-Widget

Flag do recurso: webViewConfig

Você pode configurar o comportamento de vink da webview definindo a função linkHandler como WebviewLinkHandlerType.WEBVIEW. Você pode definir o tamanho e a exibição da própria webview usando um objeto de classe webViewConfig:
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
    .channelId(<CHANNEL_ID>)
    .userId(<USER_ID>)
    .linkHandler(WebviewLinkHandlerType.WEBVIEW)
    .webViewConfig(new WebViewConfig()
                                .webViewSize(WebviewSizeWindow.FULL)
                                .webViewTitleColor(<COLOR_VALUE>)
                                .webviewHeaderColor(<COLOR_VALUE>)
                                .clearButtonLabel(<BUTTON_TEXT>)
                                .clearButtonLabelColor(<COLOR_VALUE>)
                                .clearButtonIcon(<IMAGE_ID>))
    .build();
Como ilustrado neste trecho de código, você pode definir os atributos a seguir para a webview.
Atributo Definições
webViewSize Define o tamanho da tela da janela da webview in-widget com a enumeração WebviewSizeWindow, que tem dois valores: PARTIAL (WebviewSizeWindow.PARTIAL) e FULL (WebviewSizeWindow.FULL).
clearButtonLabel Define o texto usado para o botão limpar/fechar no canto superior direito da webview. O texto padrão é DONE.
clearButtonIcon Define um ícone para o botão Limpar, que aparece alinhado à esquerda dentro do botão.
clearButtonLabelColor Define a cor do texto do label do botão Limpar.
clearButtonColor Define a cor do plano de fundo do botão Limpar.
webviewHeaderColor Define a cor do plano de fundo do cabeçalho da webview.
webviewTitleColor Define a cor do título no cabeçalho. O título é o URL do link web que foi aberto.

Chat multilíngue

Flag do recurso: multiLangChat

O suporte ao idioma nativo do Android SDK permite que o widget de chat detecte o idioma de um usuário e permita que o usuário selecione o idioma da conversa em um menu drop-down no cabeçalho. Os usuários podem alternar entre os idiomas, mas apenas entre as conversas, não durante, porque a conversa é redefinida sempre que um usuário seleciona um novo idioma.

Ativar o menu Language

Você pode ativar um menu que permita aos usuários selecionar um idioma preferencial em um menu drop-down definindo a propriedade multiLangChat com um objeto contendo supportedLanguage ArrayList, que é composto de tags de idioma (lang) e labels de exibição opcionais (label). Fora desse array, você opcionalmente pode definir o idioma padrão com a propriedade primary, conforme ilustrado pelo (primary("en") no snippet a seguir.
ArrayList<SupportedLanguage> supportedLanguages = new ArrayList<>();
supportedLanguages.add(new SupportedLanguage("en"));
supportedLanguages.add(new SupportedLanguage("fr", "French"));
supportedLanguages.add(new SupportedLanguage("de", "German"));
MultiLangChat multiLangChat = new MultiLangChat().supportedLanguage(supportedLanguages).primary("en");
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
    .channelId(<CHANNEL_ID>)
    .userId(<USER_ID>)
    .multiLangChat(multiLangChat)
    .build();
Em um menu drop-down localizado no cabeçalho, o widget de chat exibe os idiomas suportados transmitidos. Além dos idiomas disponíveis, o menu também inclui uma opção Detectar Idioma. Quando um usuário seleciona um idioma nesse menu, a conversa atual é redefinida e uma nova conversa é iniciada com o idioma selecionado. O idioma selecionado pelo usuário persiste entre as sessões no mesmo browser; por isso, o idioma anterior do usuário é selecionado automaticamente quando o usuário visita de novo a habilidade por meio da página que contém o widget de chat.
Veja o que você deve ter em mente ao configurar o suporte a vários idiomas:
  • Defina no mínimo dois idiomas para permitir a exibição do menu drop-down.
  • Se você omitir a chave primary, o widget detectará automaticamente o idioma no perfil do usuário e selecionará a opção Detectar Idioma no menu.

Desativar Menu de Idioma

A partir da Versão 21.12, você também pode configurar e atualizar o idioma de chat sem precisar também configurar o menu suspenso de seleção de idioma informando primary na configuração inicial sem o supportedLanguage ArrayList. O valor informado na variável primary é definido como o idioma de chat da conversa.

Detecção de Idioma

Além dos idiomas informados, o widget de chat exibe uma opção Detectar Idioma no drop-down. A seleção dessa opção instrui a habilidade a detectar automaticamente o idioma da conversa da mensagem do usuário e, quando possível, responder no mesmo idioma.
Observação

Se você omitir a propriedade primary, o widget detectará automaticamente o idioma no perfil do usuário e ativará a opção Detectar Idioma no menu.

Você pode atualizar dinamicamente o idioma selecionado chamando a API setPrimaryChatLanguage(lang). Se o lang informado corresponder a um dos idiomas suportados, esse idioma será selecionado. Quando nenhuma correspondência for encontrada, Detectar Idioma será ativado. Você também pode ativar a opção Idioma Detectado chamando a API Bots.setPrimaryChatLanguage('und'), em que 'und' indica indeterminado.

Você pode atualizar o idioma de bate-papo dinamicamente usando a API setPrimaryChatLanguage(lang) mesmo quando o menu suspenso não tiver sido configurado.

Referência Rápida de Chat Multilingual

Para isso... ... Faça isto
Exibe o menu suspenso de seleção de idioma para usuários finais. Defina a propriedade multiLangChat com um objeto contendo supportedLanguage ArrayList.
Defina o idioma do bate-papo sem exibir o menu suspenso de seleção de idioma para os usuários finais. Defina primary somente.
Definir um idioma padrão. Informe primary com o Arraylist supportedLanguage. O valor primary deve ser um dos idiomas suportados incluídos no array.
Ativar detecção de idioma. Informe primary como und.
Atualize dinamicamente o idioma do chat. Chame a API setPrimaryChatLanguage(lang).

Opções do Menu Compartilhar

Por padrão, o menu de compartilhamento exibe opções para os seguintes tipos de arquivo:
  • arquivos de mídia visual (imagens e vídeos)
  • arquivos de áudio
  • arquivos gerais, como documentos, PDFs e planilhas
  • localização

Ao transmitir um ArrayList de Objetos para shareMenuItems shareMenuItems(Arraylist<Object>), você pode restringir ou filtrar o tipo de itens disponíveis no menu, personalizar os ícones e labels do menu e limitar o tamanho do arquivo de upload (como 1024 no trecho de código a seguir). Esses objetos podem ser um objeto de valores de enumeração shareMenuCustomItem ou ShareMenuItem que são mapeados para os itens de menu de compartilhamento: ShareMenuItem.CAMERA para o item de menu de câmera (se suportado pelo dispositivo), ShareMenuItem.VISUAL para compartilhar um item de imagem ou vídeo, ShareMenuItem.AUDIO para compartilhar um item de áudio e ShareMenuItem.FILE para compartilhar um item de arquivo. A transmissão de um valor vazio ou nulo exibe todos os itens de menu que podem ser transmitidos como valores de enumeração ShareMenuItem.

Se um objeto ShareMenuCustomItem não tiver um valor ou um nulo para o label, como tem shareMenuCustomItem3 = ShareMenuCustomItem('csv') no trecho de código a seguir, uma string de tipo sufixada com share_ se tornará o label. Para shareMenuCustomItem3, o label é share_csv. Você pode permitir que os usuários façam upload de todos os tipos de arquivo, definindo o tipo de um objeto ShareMenuCustomItem como *.
Observação

Esta configuração só se aplica quando a propriedade enableAttachment está definida como true.
ArrayList<Object> customItems = new ArrayList<>();
ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
ArrayList<Object> customItems = new ArrayList<>(Arrays.asList(shareMenuCustomItem1,shareMenuCustomItem2,shareMenuCustomItem3,ShareMenuItem.CAMERA));
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(sharedPreferences.getString(getString(R.string.pref_name_chat_server_host), Settings.CHAT_SERVER_URL), false, getApplicationContext())
         .channelId(<CHANNEL_ID>)
         .userId(<USER_ID>)
        .shareMenuItems(customItems)
        .enableAttachment(true)
        .build();

public static void shareMenuItems()

Você pode obter a lista de itens de menu de compartilhamento chamando a API Bots.shareMenuItems();.
Bots.shareMenuItems()

public static void shareMenuItems(ArrayList<Object> shareMenuItems)

Você pode atualizar dinamicamente o pop-up de itens de menu de compartilhamento chamando a API Bots.shareMenuItems(customItems);, em que customItems é uma ArrayList de Objetos. Cada objeto pode ser do tipo valores de enumeração ShareMenuItem ou um objeto ShareMenuCustomItem.
ArrayList<Object> customItems = new ArrayList<>();
ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
customItems.add(shareMenuCustomItem1);
customItems.add(ShareMenuItem.CAMERA);
customItems.add(ShareMenuItem.FILE);
customItems.add(shareMenuCustomItem2);
customItems.add(shareMenuCustomItem3);
Bots.shareMenuItems(customItems);

Reconhecimento de Fala

Flag do recurso: enableSpeechRecognition

A definição do flag do recurso enableSpeechRecognition como true permite que o botão do microfone seja exibido junto com o botão Enviar sempre que o campo de entrada do usuário estiver vazio.

A definição dessa propriedade como true também suporta a funcionalidade ativada pela propriedade enableSpeechRecognitionAutoSend, que quando também está definida como true, permite que a resposta de fala do usuário seja enviada ao servidor de chat automaticamente enquanto exibe a resposta como uma mensagem enviada na janela de chat. Você pode permitir que os usuários editem (ou excluam) primeiro suas mensagens ditadas antes de enviá-las manualmente, definindo enableSpeechRecognitionAutoSend como false.

public static void startRecording(IBotsSpeechListener listener)

Inicia a gravação da mensagem de voz do usuário. O parâmetro listener é uma instância de IBotsSpeechListener para receber a resposta retornada do servidor.

public static void stopRecording()

Interrompe a gravação da mensagem de voz do usuário.

public static boolean isRecording()

Verifica se a gravação de voz foi iniciada ou não. Retorna true se a gravação tiver sido iniciada. Caso contrário, retorna false.

IBotsSpeechListener

Uma classe deve implementar a interface IBotsSpeechListener que, em seguida, implementa a funcionalidade para os seguintes métodos:

void onError(String error)

Este método é chamado quando ocorrem erros ao estabelecer a conexão com o servidor ou quando nenhuma ou muitas entradas são fornecidas. Seu parâmetro error é a mensagem de erro.

void onSuccess(String statement)

Este método é chamado quando um resultado final é recebido do servidor. Seu parâmetro utterance é a declaração final recebida do servidor.

Observação

Este método passou por remoção gradual na Release 20.8.1.

void onSuccess(BotsSpeechResult botsSpeechResult)

Este método é chamado quando um resultado final é recebido do servidor. Seu parâmetro correspondente, botsSpeechResult, é a resposta final recebida do servidor.

void onPartialResult(String absoluta)

Este método é chamado quando um resultado parcial é recebido do servidor. Seu parâmetro utterance é a declaração parcial recebida do servidor.

void onClose(int code, String message)

Este método é chamado quando a conexão com o servidor é fechada.

Parâmetros:
  • code – O código do status
  • message – O motivo para fechar a conexão

void onOpen()

O método chamado quando a conexão com o servidor é aberta.

onActiveSpeechUpdate(byte[] speechData)

Esse método é chamado quando há uma atualização na mensagem de voz do usuário, que pode ser usada para atualizar o visualizador de fala. Seu parâmetro correspondente é o speechData, o array de bytes da voz gravada do usuário.
public class BotsSpeechListener implements IBotsSpeechListener {
    @Override
    public void onError(String error) {
            // Handle errors
    }
 
    @Override
    public void onSuccess(String utterance) {
        // This method was deprecated in release 20.8.1.
        // Handle final result
    }
 
 
    @Override
    public void onSuccess(BotsSpeechResult botsSpeechResult) {
        // Handle final result
    }  
 
    @Override
    public void onPartialResult(String utterance) {
        // Handle partial result
    }
 
    @Override
    public void onClose(int code, String message) {
        // Handle the close event of connection to server
    }
 
    @Override
    public void onOpen() {
        // Handle the open event of connection to server
    }
 
 
    @Override
    public void onActiveSpeechUpdate(byte[] speechData) {
        // Handle the speech update event
    }
}
 
 
Bots.startRecording(new BotsSpeechListener()); // Start voice recording
 
if (Bots.isRecording()) {
    Bots.stopRecording(); // Stop voice recording
}

Síntese de Fala

  • Flag do recurso: enableSpeechSynthesis
  • Configuração da funcionalidade: speechSynthesisVoicePreferences
O SDK foi integrado à síntese de fala para ler a mensagem da habilidade em voz alta quando uma nova mensagem é recebida da habilidade:
  • Os usuários podem silenciar ou desativar o silêncio da resposta de áudio da habilidade usando um botão que está localizado no cabeçalho da view de chat. Você habilita esse recurso definindo o flag do recurso enableSpeechSynthesis como true.
  • Você pode definir o idioma preferencial que lê as mensagens da habilidade em voz alta com a propriedade speechSynthesisVoicePreferences. Este parâmetro que define o idioma e a voz é uma lista de instâncias SpeechSynthesisSetting (descrita no Javadoc do SDK que você submete a download da página de download do ODA e do OMC). Esta propriedade ativa um fallback quando o dispositivo não suporta o idioma ou a voz preferenciais. Se o dispositivo não suportar a voz preferencial, será usada a voz padrão do idioma preferencial. Quando não há suporte nem para a voz nem para o idioma preferenciais, a voz e o idioma padrão são usados.

public static void initSpeechSynthesisService()

Inicializa o serviço de síntese de fala. Este método deve ser chamado no método onCreate() de uma Atividade para inicializar o serviço de síntese de fala. A inicialização do serviço de síntese de fala será feita quando a biblioteca de SDK for inicializada apenas se o flag de recurso enableSpeechSynthesis estiver definido como true.
public class ConversationActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bots.initSpeechSynthesisService();
    }
}

public static void startBotAudioResponse(String text)

Inicia a leitura da respostas da habilidade em voz alta. Seu parâmetro text é o texto da mensagem da habilidade que é lida em voz alta.
Bots.startBotAudioResponse("What kind of crust do you want?");
Observação

Este método foi descontinuado na Release 21.08.

public static void stopBotAudioResponse()

Interrompe a leitura da resposta da habilidade em voz alta.
Bots.stopBotAudioResponse()

public static boolean isSpeaking()

Verifica se a resposta da habilidade está sendo lida em voz alta ou não no momento.

Retorna true se a resposta da habilidade estiver sendo lida em voz alta no momento. Caso contrário, retorna false.
if (Bots.isSpeaking()) {
    Bots.stopBotAudioResponse();
}

public static void shutdownBotAudioResponse()

Libera os recursos usados pelo SDK.

Este método é chamado no método onDestroy() de ConversationActivity.
public class ConversationActivity extends AppCompatActivity {
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Bots.shutdownBotAudioResponse();
    }
}

Injeção de Serviço de Fala

Flag do recurso : ttsService

O flag do recurso speechSynthesisService permite que você injete qualquer serviço de conversão de texto em fala (TTS) - seu próprio serviço ou fornecido por um fornecedor de terceiros - no SDK. Para injetar um serviço TTS, primeiro defina o flag do recurso enableSpeechSynthesis como true e, em seguida, informe uma instância da interface SpeechSynthesisService para o flag speechSynthesisService.

A Interface SpeechSynthesisService

Você cria uma instância de uma classe que é uma implementação da interface SpeechSynthesisService. Ele implementa estes métodos:
  • initTextToSpeechService(@NonNull Application application, @NonNull BotsConfiguration botsConfiguration): Inicializa um novo serviço TTS.
    Parâmetro Descrição
    application O aplicativo. O valor não pode ser nulo.
    botsConfiguration O objeto BotsConfiguration usado para controlar os recursos da biblioteca. O valor não pode ser nulo.
  • speak(String phrase): Adiciona uma frase que deve ser falada para a fila de declarações. O parâmetro It's phrase é o texto a ser falado.
  • isSpeaking(): Verifica se a resposta de áudio está ou não sendo falada. Ele retornará false se não houver resposta de áudio em andamento sendo falada.
    Observação

    Este método foi descontinuado na Release 21.08.
  • stopTextToSpeech(): Interrompe qualquer síntese de fala em andamento.
    Observação

    Este método foi descontinuado na Release 21.08.
  • shutdownTextToSpeech(): Libera os recursos usados pelo mecanismo TextToSpeech.
  • getSpeechSynthesisVoicePreferences(): Retorna o array de preferências de voz que é usado para escolher a melhor correspondência para a voz disponível usada para síntese de fala.
  • setSpeechSynthesisVoicePreferences(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences): Define o array de preferências de voz que é usado para escolher a melhor correspondência de voz disponível para síntese de fala. O parâmetro speechSynthesisVoicePreferences é o array de preferência de voz para síntese de fala.
  • onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences): Define a voz de síntese de fala para a melhor correspondência de voz disponível.
    Observação

    Este método foi descontinuado na Release 21.08.
    Recomendamos que você chame esse método dentro do método setSpeechSynthesisVoicePreferences após definir as preferências de voz ArrayList. O parâmetro speechSynthesisVoicePreferences é o array de preferência de voz para síntese de fala.
  • onSpeechRecognitionLocaleChange(Locale speechLocale): esse método é chamado quando a linguagem de reconhecimento de fala é alterada. Ao substituir este método, você pode definir a linguagem de síntese de fala para a mesma linguagem que a linguagem de reconhecimento de fala. O parâmetro speechLocale é a localidade definida para reconhecimento de fala.
   private class TextToSpeechServiceInjection implements SpeechSynthesisService {

        @Override
        public void initTextToSpeechService(@NonNull Application application, @NonNull BotsConfiguration botsConfiguration) {
            // Initialisation of Text to Speech Service.
        }

        @Override
        public void speak(String phrase) {
            // Adds a phrase to the utterance queue to be spoken
        }

        @Override
        public boolean isSpeaking() {
            // Checks whether the bot audio response is being spoken or not.
            return false;
        }

        @Override
        public void stopTextToSpeech() {
            // Stops any ongoing speech synthesis
        }

        @Override
        public void shutdownTextToSpeech() {
            // Releases the resources used by the TextToSpeech engine.
        }

        @Override
        public ArrayList<SpeechSynthesisSetting> getSpeechSynthesisVoicePreferences() {
            // The voice preferences array which is used to choose the best match available voice for speech synthesis.
            return null;
        }

        @Override
        public void setSpeechSynthesisVoicePreferences(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences) {
            // Sets the voice preferences array which can be used to choose the best match available voice for speech synthesis.
        }

        @Override
        public SpeechSynthesisSetting onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences) {
            // Sets the speech synthesis voice to the best voice match available.
            return null;
        }

        @Override
        public void onSpeechRecognitionLocaleChange(Locale speechLocale) {
            // If the speech recognition language is changed, the speech synthesis language can also be changed to the same language.
        }
    }
Observação

SpeechSynthesisService#setSpeechSynthesisVoicePreferencesonSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting>) e SpeechSynthesisService#onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting>) foram substituídos por SpeechSynthesisService#setTTSVoice(ArrayList<SpeechSynthesisSetting>) e SpeechSynthesisService#getTTSVoice() nesta versão. Anteriormente, SpeechSynthesisService#setSpeechSynthesisVoicePreferencesonSpeechSynthesisVoicePreferencesChange definia o array de preferência de voz de síntese de fala e SpeechSynthesisService#onSpeechSynthesisVoicePreferencesChange definia a melhor voz disponível para síntese de fala e retornava a voz selecionada. Agora, a mesma funcionalidade é alcançada através dos novos métodos: SpeechSynthesisService#setTTSVoice(ArrayList<SpeechSynthesisSetting> TTSVoices), que define tanto o array de preferência de voz de síntese de fala quanto a melhor voz disponível para síntese de fala e SpeechSynthesisService#getTTSVoice(), que retorna a voz selecionada para síntese de fala.

Indicador de Digitação para Conversas do Agente do Usuário

Flag do recurso: enableSendTypingStatus

Quando ativado, o SDK envia um evento de digitação RESPONDING junto com o texto que está sendo digitado no momento pelo usuário para . Isso mostra um indicador de digitação no console do agente. Quando o usuário terminar de digitar, o SDK enviará um evento LISTENING para o Oracle B2C Service ou o Oracle Fusion Service. Isso oculta o indicador de digitação no console do agente.

Da mesma forma, quando o agente está digitando, o SDK recebe um evento RESPONDING do serviço. Ao receber este evento, o SDK mostra um indicador de digitação para o usuário. Quando o agente está ocioso, o SDK recebe o evento LISTENING do serviço. Ao receber este evento, o SDK oculta o indicador de digitação mostrado ao usuário.

A API sendUserTypingStatus permite o mesmo comportamento para o modo sem interface do usuário.
public void sendUserTypingStatus(TypingStatus status, String text)
  • Para mostrar o indicador de digitação no console do agente:
    Bots.sendUserTypingStatus("RESPONDING", "<Message_Being_Typed>");
  • Para ocultar o indicador de digitação no console do agente:
    Bots.sendUserTypingStatus("LISTENING", "");
  • Para controlar o indicador de digitação do lado do usuário, use o evento onReceiveMessage(Message message). Por exemplo :
    public void onReceiveMessage(Message message) {
         if (message != null) {
           MessagePayload messagePayload = message.getPayload();
           if (messagePayload instanceof StatusMessagePayload) {
             StatusMessagePayload statusMessagePayload = (StatusMessagePayload) messagePayload;
             String status = statusMessagePayload.getStatus();
    
             if (status.equalsIgnoreCase(String.valueOf(TypingStatus.RESPONDING))) {
               // show typing indicator
             } else if (status.equalsIgnoreCase(String.valueOf(TypingStatus.LISTENING))
               // hide typing indicator
             }
           }
         }
Há mais duas configurações que fornecem controle adicional:
  • typingStatusInterval - Por padrão, o SDK envia o evento de digitação RESPONDING a cada três segundos para o serviço. Use este sinalizador para limitar este evento. O valor mínimo que pode ser definido é três segundos.
  • enableAgentSneakPreview - O Oracle B2C Service suporta mostrar o texto do usuário à medida que ele é informado. Se esse flag for definido como true (o padrão é false), o SDK enviará o texto real. Para proteger a privacidade do usuário, o SDK envia ... em vez do texto real para o Oracle B2C Service quando o flag é definido como false.
    Observação

    Esse recurso deve ser ativado no SDK e na configuração de chat do Oracle B2C Service.

Atualizar o Avatar do Usuário

Você pode ativar a atualização dinâmica do avatar do usuário no runtime.

public void updatePersonAvatar

Define o avatar do usuário para todas as mensagens, incluindo mensagens anteriores.
ConversationActivity.setUserPerson(Object);

Expor Detalhes do Agente

Use essas APIs para modificar o nome do agente, a cor do texto, o avatar, as iniciais do nome do agente, a cor do texto e o plano de fundo do avatar.

público AgentDetails getAgentDetails()

Retorna um objeto contendo os detalhes do agente.
Bots.getAgentDetails(AgentDetails);
Consulte os Javadocs para obter mais detalhes sobre a classe AgentDetails.

public void setAgentDetails(AgentDetails)

Substitui os detalhes do agente recebidos do servidor.
Bots.setAgentDetails(AgentDetails);

público AgentDetails getAgentDetails()

Retorna um objeto contendo os detalhes do agente.
Bots.getAgentDetails(AgentDetails);
Consulte os Javadocs para obter mais detalhes sobre a classe AgentDetails.

Visualizador de Voz

Quando o suporte a voz está ativado (enableSpeechRecognition(true)), o rodapé do widget de chat exibe um visualizador de voz, um gráfico de visualizador dinâmico que indica o nível de frequência da entrada de voz. O visualizador responde à modulação da voz do usuário, indicando se o usuário está falando muito baixo ou muito alto. Este visualizador é criado usando o stream de bytes que são gravados enquanto o usuário está falando, que também é exposto no método IBotsSpeechListener#onActiveSpeechUpdate(byte[]) para uso no modo sem interface do usuário.

O widget de chat exibe um visualizador de voz quando os usuários clicam no ícone de voz. É um indicador de se o nível de áudio é suficientemente alto o suficiente para o SDK capturar a voz do usuário. A mensagem do usuário, como é reconhecida como texto, é exibida abaixo do visualizador.
Observação

O modo de voz é indicado quando o ícone de teclado aparece.

Quando enableSpeechRecognitionAutoSend(true), o texto reconhecido é enviado automaticamente para a habilidade depois que o usuário termina de ditar a mensagem. Em seguida, o modo é revertido para entrada de texto. Quando enableSpeechRecognitionAutoSend(false), o modo também é revertido para entrada de texto, mas nesse caso, os usuários podem modificar o texto reconhecido antes de enviar a mensagem para a habilidade.