Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 4

Demo

En la Parte Anterior llamada Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 3 creamos el código para los 5 primeros métodos del archivo MainActivity.kt o la actividad principal de la aplicación, aún hay otros métodos que vamos terminar de crear en ella en esta Parte 4, asimismo crearemos algunos otros elementos para la aplicación, bien vamos con este Post.

Partes

Antes de continuar te invito a leer los siguientes artículos:

Asimismo te invito a escuchar el Podcast: “Donde buscar ayuda sobre Programación”:

Spotify SoundCloud

Bien ahora continuemos con el Post: Creando un Bot (Android) para una tienda de Postres (Dialogflow V2 + Kotlin 1.3.72) – Parte 4. 

Vamos a crear el método agregarTexto() que nos servirá para agregar los textos de los mensajes que se llevan acabo entre el cliente y el Bot.

Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código

private fun agregarTexto(mensaje: String, type: Int) {

    // Coloco el FramLayout dentro de la variable layoutFrm
    val layoutFrm: FrameLayout

    // Según sea el rol, le cargamos el FrameLayout y llamamos a un método respectivo
    // Los métodos agregarTextoUsuario() y agregarTextoBot() los crearé más adelante
    when (type) {
        USUARIO -> layoutFrm = agregarTextoUsuario()
        BOT -> layoutFrm = agregarTextoBot()
        else -> layoutFrm = agregarTextoBot()
    }

    // Si el usuario hace clic en la caja de texto
    layoutFrm.isFocusableInTouchMode = true

    // Pasamos un LinearLayout
    linear_chat.addView(layoutFrm)

    // Mostramos los textos de los mensajes en un TextView
    val textview = layoutFrm.findViewById<TextView>(R.id.msg_chat)
    textview.setText(mensaje)


    // Si el usuario sale del modo escritura, ocultamos el teclado del dispositivo
    // El método 'ocultarTeclado()' lo crearemos más adelante 
    configTeclado.ocultarTeclado(this)

    // Enfocamos el TextView Automáticamente
    layoutFrm.requestFocus()

    // Volvemos a cambiar el enfoque para editar el texto y continuar escribiendo
    cajadetexto.requestFocus()

    // Si es un cliente el que envía un mensaje al Bot, cargamos el método 'TexToSpeech'
    // 'TexToSpeech' junto a otras métodos procesa los mensajes de voz que seran enviados al Bot 
    if(type!= USUARIO) asistente_voz?.speak(mensaje,TextToSpeech.QUEUE_FLUSH,null)

}

En el método anterior llamamos a los métodos agregarTextoUsuario() y agregarTextoBot(), cada uno de estos métodos lo que hace es colocar los mensajes dentro de diferentes layouts, en el layout mensaje_usuario.xml se colocan los mensajes del usuario y el layout mensaje_bot.xml se colocan los mensajes del bot.

// Colocamos los mensajes del Usuario en el layout 'mensaje_usuario' 
fun agregarTextoUsuario(): FrameLayout {    
    val inflater = LayoutInflater.from(this@MainActivity)
    return inflater.inflate(R.layout.mensaje_usuario, null) as FrameLayout
}

// Colocamos los mensajes del Bot en el layout 'mensaje_bot' 
fun agregarTextoBot(): FrameLayout {    
    val inflater = LayoutInflater.from(this@MainActivity)
    return inflater.inflate(R.layout.mensaje_bot, null) as FrameLayout 
}

Ahora vamos a crear un método llamado validar(), con este método vamos a verificar si el usuario envió un audio que sea entendible para el bot o si no escribió un mensaje.

Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código

// Hacemos uso del método 'DetectIntentResponse' de Dialogflow para devolver algunos mensajes al usuario
fun validar(response: DetectIntentResponse?) {
    try {
        if (response != null) {

            // fulfillmentText retorna un String (Texto) al usuario en la pantalla
            // fulfillmentMessagesList (Objeto) retorna una lista de objetos
            var respuestaBot: String = ""

            if(response.queryResult.fulfillmentText==" ")
                respuestaBot = response.queryResult.fulfillmentMessagesList[0].text.textList[0].toString()
            else
                respuestaBot = response.queryResult.fulfillmentText

            // Pasamos el método agregarTexto()
            agregarTexto(respuestaBot, BOT)

        } else {
            // Mostramos un mensaje si el audio que envio el usuario no se entiende
            agregarTexto(getString(R.string.audio_no_se_entiende), BOT)
        }
    }catch (e:Exception){
        // Mostramos al usuario el texto 'Por Favor, ingresa un mensaje'
        agregarTexto(getString(R.string.ingresa_mensaje), BOT)
    }
}

En la función nativa de Android onActivityResult() manejamos y obtenemos el resultado de nuestra actividad. Puedes ver en el código he colocado comentarios para explicar que hace cada línea del código

override fun onActivityResult(codigoSolicitud: Int, codigoResultado: Int, datos: Intent?) {
    super.onActivityResult(codigoSolicitud, codigoResultado, datos)

    // Obtenemos el resultado de nuestra actividad principal
    // Si la variable codigoResultado esta ok y la variable datos no es null
    when(codigoSolicitud){
        ENTRADA_DE_VOZ->{
            if(codigoResultado == Activity.RESULT_OK
                && datos != null){

                // getStringArrayListExtra recupera datos extendidos del Intent 
                val resultado = datos.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)

                // El usuario puede agregar otro mensaje
                cajadetexto.text = Editable.Factory.getInstance().newEditable(resultado[0])

                // El usuario puede hacer uso del micrófono
                enviarMensaje(microfono)
            }
        }
    }
}

Por último hacemos uso del método nativo onDestroy() de Android para detener el asistente de voz una vez que la aplicación sea cerrada.

override fun onDestroy() {
    super.onDestroy()

    // Si la aplicación es cerrada, detenemos el asistente de voz 
    if(asistente_voz !=null){
        asistente_voz?.stop()
        asistente_voz?.shutdown()
    }
}

Genial hasta aquí terminamos la cuarta parte de este tutorial en donde hemos creado 6 métodos útiles en la Actividad Principal (MainActivity.kt) para que la aplicación funcione sin problemas.

Ten Paciencia, lo que quiero es que entiendas todo el proceso para Crear este Proyecto y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje. 

Nota (s)

  • En la siguiente Parte crearemos los archivos solicitarTarea.kt y configTeclado.kt, ambos se complementan con el código del archivo MainActivity.kt
  • El código expuesto en este capitulo del tutorial pueden cambiar, esto no depende de mi, si no de la empresa que dan soporte a Android Studio, y Kotlin que suelen cambiar sus tecnologías en futuras versiones.
  • No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo. 

Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.