Open In App

How to Create a Chatbot in Android with BrainShop API?

Last Updated : 26 Mar, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

We have seen many apps and websites in which we will get to see a chatbot where we can chat along with the chatbot and can easily get solutions for our questions answered from the chatbot. In this article, we will take a look at building a chatbot in Android. 

What we are going to build in this article? 

We will be building a simple application in which we will be building a simple chatbot where we can ask a question to our bot and the bot will answer our questions. Below is the video in which we will get to see what we are going to build in this article. Note that we are going to implement this project using both Java & Kotlin.  

Steps to Implement Chatbot in Android

Step 1: Create a New Project

To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio.

Step 2: Add the dependency for API call

Navigate to the Gradle Scripts > build.gradle.kts file and add the below dependency to it in the dependencies section.  

dependencies {
...
implementation ("com.android.volley:volley:1.2.1")
}

After adding this dependency sync your project.


Step 3: Adding permissions to the internet in the AndroidManifest.xml file

Navigate to the app > manifests > AndroidManifest.xml and add the below code to it. 

<uses-permission android:name="android.permission.INTERNET" />


Step 4: Working with the activity_main.xml file

Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file. 

activity_main.xml:

XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        tools:listitem="@layout/item_user_messages"
        app:layout_constraintBottom_toTopOf="@+id/messageLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/messageLayout"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="horizontal"
        android:gravity="center"
        android:weightSum="5"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <EditText
            android:id="@+id/messageEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            style="@style/Widget.Material3.TextInputEditText.OutlinedBox"
            android:hint="Write your message here..."
            android:layout_weight="4"
            android:importantForAutofill="no"
            android:inputType="textShortMessage" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/sendButton"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:importantForAccessibility="no"
            android:src="@android:drawable/sym_action_chat"
            app:tint="@color/white"
            app:backgroundTint="@color/colorPrimary" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>


Step 5: Creating a Model class for storing our messages

Navigate to the app > java > {package-name}, Right-click on it, New > Java/Kotlin class and name it as Model and add the below code to it. Comments are added inside the code to understand the code in more detail.

Modal File:

Model.java
package org.geeksforgeeks.demo;

public class Model {
    private String message;
    private String sender;

    // Default Constructor (Required for Firebase)
    public Model() {
        this.message = "";
        this.sender = "";
    }

    // Parameterized Constructor
    public Model(String message, String sender) {
        this.message = message;
        this.sender = sender;
    }

    // Getter and Setter for message
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    // Getter and Setter for sender
    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }
}
Model.kt
package org.geeksforgeeks.demo

class Model (
    var message: String = "",
    var sender: String = ""
)


Step 6: Creating a layout file for user & bot messages

Icons used in this file are present in the drawable folder. Navigate to the app > res > layout > Right-click on it > New > layout resource file and name the file as item_user_messages and item_bot_messages and add the below code to it. 

item_user_messages.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="26dp"
        android:layout_gravity="end"
        android:elevation="8dp"
        app:cardCornerRadius="8dp">

        <!--text view for displaying user message-->
        <TextView
            android:id="@+id/idTVUser"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="16dp"
            android:text="User message"
            android:textSize="18sp"
            android:textColor="@color/black"
            app:drawableEndCompat="@drawable/person"
            app:drawableTint="@color/black"
            android:drawablePadding="16dp"/>

    </androidx.cardview.widget.CardView>

</LinearLayout>
item_bot_messages.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_margin="26dp"
        android:elevation="8dp"
        app:cardCornerRadius="8dp">

        <!--below widget is for
                displaying message of bot-->
        <TextView
            android:id="@+id/idTVBot"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:drawablePadding="16dp"
            android:padding="16dp"
            android:text="Bot message"
            android:textColor="@color/black"
            android:textSize="18sp"
            app:drawableStartCompat="@drawable/settings"
            app:drawableTint="@color/black" />

    </androidx.cardview.widget.CardView>

</LinearLayout>


Step 7: Working with the Adapter class

For setting data to our items of Chat RecyclerView we have to create an Adapter class. Navigate to the app > java > {package-name}, Right-click on it, New > Java/Kotlin class and name your class as Adapter and add the below code to it. Comments are added inside the code to understand the code in more detail. 

Adapter File:

Adapter.java
package org.geeksforgeeks.demo;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private final ArrayList<Model> list;

    // Constructor
    public Adapter(ArrayList<Model> list) {
        this.list = list;
    }

    @Override
    public int getItemViewType(int position) {
        // Determine the type of view
        if (list.get(position).getSender().equals("user")) {
            
            // User message
            return 0; 
        } 
        else if (list.get(position).getSender().equals("bot")) {
            
            // Bot message
            return 1; 
        } 
        else {
            return -1;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == 0) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_user_messages, parent, false);
            return new UserViewHolder(view);
        } else {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_bot_messages, parent, false);
            return new BotViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        Model model = list.get(position);

        if (holder instanceof UserViewHolder) {
            ((UserViewHolder) holder).userTV.setText(model.getMessage());
        } else if (holder instanceof BotViewHolder) {
            ((BotViewHolder) holder).botTV.setText(model.getMessage());
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    // ViewHolder for User messages
    static class UserViewHolder extends RecyclerView.ViewHolder {
        TextView userTV;

        public UserViewHolder(@NonNull View itemView) {
            super(itemView);
            userTV = itemView.findViewById(R.id.idTVUser);
        }
    }

    // ViewHolder for Bot messages
    static class BotViewHolder extends RecyclerView.ViewHolder {
        TextView botTV;

        public BotViewHolder(@NonNull View itemView) {
            super(itemView);
            botTV = itemView.findViewById(R.id.idTVBot);
        }
    }
}
Adapter.kt
package org.geeksforgeeks.demo

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView


class Adapter(private val list: ArrayList<Model>) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        
        val view: View
        
        // below code is to switch our
        // layout type along with view holder.
        when (viewType) {
            0 -> {
                
                // below line we are inflating user message layout.
                view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_user_messages, parent, false)
                return UserViewHolder(view)
            }

            else -> {
                
                // below line we are inflating bot message layout.
                view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_bot_messages, parent, false)
                return BotViewHolder(view)
            }
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        
        // this method is use to set data
        // to our layout file.
        val modal: Model = list[position]
        when (modal.sender) {
            "user" -> (holder as UserViewHolder).userTV.text = modal.message
            "bot" -> (holder as BotViewHolder).botTV.text = modal.message
        }
    }

    override fun getItemCount(): Int = list.size


    override fun getItemViewType(position: Int): Int {
        
        // below line of code is to set position.
        return when (list[position].sender) {
            "user" -> 0
            "bot" -> 1
            else -> -1
        }
    }

    class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var userTV: TextView = itemView.findViewById(R.id.idTVUser)
    }

    class BotViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var botTV: TextView = itemView.findViewById(R.id.idTVBot)
    }
}


Step 8: Generating API key for using the chatbot service

Go to Brainshop.ai generate your simple account with your username and password. Simply create your account on this website. After creating a new account you will get to see the below screen. After creating your account you have to request a new password from the request password option and enter your email address. After adding your email address you have to add the password to your account. Now we are good to go to generate our API key. 


Follow the above steps to Generate a new brain for your chatbot. After generating your bot now we will get the API URL for this brain. Navigate to the settings tab inside your created brain you will get to see your bot details as shown below.

Note: Now we will be using this API URL only inside the MainActivity file. 


Step 9: Working with the MainActivity file

Go to the MainActivity file and refer to the following code. Below is the code for the MainActivity file. Comments are added inside the code to understand the code in more detail.

MainActivity File:

MainActivity.java
package org.geeksforgeeks.demo;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private FloatingActionButton button;
    private EditText editText;

    // Creating a variable for Volley request queue.
    private RequestQueue requestQueue;

    // Creating variables for the list and adapter.
    private ArrayList<Model> list;
    private Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        button = findViewById(R.id.sendButton);
        editText = findViewById(R.id.messageEditText);

        // Initializing the request queue.
        requestQueue = Volley.newRequestQueue(this);
        requestQueue.getCache().clear();

        // Creating a new array list.
        list = new ArrayList<>();

        // Adding click listener for send button.
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
                // Checking if user entered a message.
                if (editText.getText().toString().isEmpty()) {
                    Toast.makeText(MainActivity.this, "Please enter your message..", Toast.LENGTH_SHORT).show();
                    return;
                }

                // Sending message to bot.
                sendMessage(editText.getText().toString());

                // Clearing edit text.
                editText.setText("");
            }
        });

        // Initializing adapter.
        adapter = new Adapter(list);

        // Setting up layout manager.
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);

        // Setting adapter to RecyclerView.
        recyclerView.setAdapter(adapter);
    }

    @SuppressLint("NotifyDataSetChanged")
    private void sendMessage(String userMsg) {
        
        // Adding user message to list.
        list.add(new Model(userMsg, USER_KEY));
        adapter.notifyDataSetChanged();

        // URL for API call.
        String url = "Enter your API URL here" + userMsg;

        // Creating request queue.
        RequestQueue queue = Volley.newRequestQueue(this);

        // Creating a JSON object request.
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                Request.Method.GET, url, null,
                response -> {
                    try {
                        
                        // Extracting response from JSON.
                        String botResponse = response.getString("cnt");
                        list.add(new Model(botResponse, BOT_KEY));

                        // Notifying adapter.
                        adapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();

                        // Handling error response from bot.
                        list.add(new Model("No response", BOT_KEY));
                        adapter.notifyDataSetChanged();
                    }
                },
                error -> {
                    
                    // Handling errors.
                    list.add(new Model("Sorry, no response found", BOT_KEY));
                    Toast.makeText(MainActivity.this, "No response from the bot..", Toast.LENGTH_SHORT).show();
                });

        // Adding request to queue.
        queue.add(jsonObjectRequest);
    }

    // Constants for user and bot.
    private static final String USER_KEY = "user";
    private static final String BOT_KEY = "bot";
}
MainActivity.kt
package org.geeksforgeeks.demo

import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.android.material.floatingactionbutton.FloatingActionButton
import org.json.JSONException

class MainActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView
    private lateinit var button: FloatingActionButton
    private lateinit var editText: EditText

    // creating a variable for our volley request queue.
    private lateinit var requestQueue: RequestQueue

    // creating a variable for array list and adapter class.
    private lateinit var list: ArrayList<Model>
    private lateinit var adapter: Adapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView = findViewById(R.id.recyclerView)
        button = findViewById(R.id.sendButton)
        editText = findViewById(R.id.messageEditText)

        // below line is to initialize our request queue.
        requestQueue = Volley.newRequestQueue(this)
        requestQueue.cache.clear()

        // creating a new array list
        list = ArrayList()

        // adding on click listener for send message button.
        button.setOnClickListener(View.OnClickListener { 
        
            // checking if the message entered
            // by user is empty or not.
            if (editText.getText().toString().isEmpty()) {
                
                // if the edit text is empty
                // display a toast message.
                Toast.makeText(this, "Please enter your message..", Toast.LENGTH_SHORT)
                    .show()
                return@OnClickListener
            }

            // calling a method to send message
            // to our bot to get response.
            sendMessage(editText.getText().toString())

            // below line we are setting text
            // in our edit text as empty
            editText.setText("")
        })

        // on below line we are initializing our
        // adapter class and passing our array list to it.
        adapter = Adapter(list)

        // below line we are creating a variable
        // for our linear layout manager.
        val linearLayoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)

        // below line is to set layout
        // manager to our recycler view.
        recyclerView.setLayoutManager(linearLayoutManager)

        // below line we are setting
        // adapter to our recycler view.
        recyclerView.setAdapter(adapter)
    }

    @SuppressLint("NotifyDataSetChanged")
    private fun sendMessage(userMsg: String) {
    
        // below line is to pass message to our
        // array list which is entered by the user.
        list.add(Model(userMsg, USER_KEY))
        adapter.notifyDataSetChanged()

        // url for our api call
        val url = "Enter you API URL here$userMsg"

        // creating a variable for our request queue.
        val queue = Volley.newRequestQueue(this)

        // on below line we are making a json object
        // request for a get request and passing our url .
        val jsonObjectRequest = JsonObjectRequest(
            Request.Method.GET, url, null,
            { response ->
                try {
                
                    // in on response method we are extracting data
                    // from json response and adding this response to our array list.
                    val botResponse = response.getString("cnt")
                    list.add(Model(botResponse, BOT_KEY))
                    
                    // notifying our adapter as data changed.
                    adapter.notifyDataSetChanged()
                } catch (e: JSONException) {
                    e.printStackTrace()
                    
                    // handling error response from bot.
                    list.add(Model("No response", BOT_KEY))
                    adapter.notifyDataSetChanged()
                }
            }, { 
                // error handling.
                list.add(Model("Sorry no response found", BOT_KEY))
                Toast.makeText(this, "No response from the bot..", Toast.LENGTH_SHORT).show()
            })


        // at last adding json object request to our queue.
        queue.add(jsonObjectRequest)
    }

    companion object {
        const val USER_KEY = "user"
        const val BOT_KEY = "bot"
    }
}

Check out the project on the below link: Github Link

Output: 



Next Article

Similar Reads