How to Create a Chatbot in Android with BrainShop API? (original) (raw)

Last Updated : 23 Jul, 2025

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.

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 `

<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 `

<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>

item\_bot\_messages.xml

<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>

`

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 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) : 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: