0% found this document useful (0 votes)
36 views57 pages

Talk Buddy

Download as docx, pdf, or txt
Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1/ 57

talk Buddy

Singin.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
android:clipToPadding="false"
android:overScrollMode="never"
android:padding="@dimen/_24sdp"
android:scrollbars="none"
tools:context=".activities.SignInActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_40sdp"
android:text="@string/Talkbuddy"
android:textColor="@color/primary"
android:textSize="@dimen/_18ssp"
android:textStyle="bold"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_40sdp"
android:text="@string/login"
android:textColor="@color/secondory_text"
android:textSize="@dimen/_12ssp"
android:textStyle="bold"/>

<EditText
android:id="@+id/SINumber"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_40sdp"
android:background="@drawable/background_input"
android:hint="@string/phonenumber"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:inputType="phone"
android:padding="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>

<EditText
android:id="@+id/SIPassword"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_40sdp"
android:background="@drawable/background_input"
android:hint="@string/password"
talk Buddy

android:imeOptions="actionNext"
android:importantForAutofill="no"
android:inputType="textPassword"
android:padding="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_20sdp"
android:animateLayoutChanges="true">

<com.google.android.material.button.MaterialButton
android:id="@+id/SignInButton"
android:layout_width="match_parent"
android:layout_height="@dimen/_50sdp"
android:text="Sign In"
android:textColor="@color/white"
android:textSize="@dimen/_13ssp"
android:textStyle="bold"
app:cornerRadius="@dimen/_8sdp"
/>

<ProgressBar
android:id="@+id/progressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"
android:visibility="invisible"/>

</FrameLayout>

<TextView
android:id="@+id/TextCreateNewAccount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Create_New_account"
android:textSize="@dimen/_13ssp"
android:textStyle="bold"
android:textColor="@color/primary"
android:layout_marginTop="@dimen/_30sdp"/>
</LinearLayout>
</ScrollView>
JAVA.
package com.example.talkbuddy.activities;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Toast;

import com.example.talkbuddy.R;
import com.example.talkbuddy.databinding.ActivitySignInBinding;
import com.example.talkbuddy.utilities.Constants;
talk Buddy

import com.example.talkbuddy.utilities.PreferencesManager;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;

import java.util.HashMap;

public class SignInActivity extends AppCompatActivity {

private ActivitySignInBinding binding;//for get all id access of all


avctivities
private PreferencesManager preferencesManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preferencesManager=new PreferencesManager(getApplicationContext());

binding=ActivitySignInBinding.inflate(getLayoutInflater());//inflater use
for take layout from view
setContentView(binding.getRoot());

//check user login ore not


if(preferencesManager.getBoolean(Constants.KEY_IS_SIGNED_IN)){
Intent intent =new
Intent(getApplicationContext(),MainActivity.class);
startActivity(intent);
finish();
}
setListeners();
}

private void setListeners(){

binding.TextCreateNewAccount.setOnClickListener(view ->
startActivity(new
Intent(getApplicationContext(),SignUpActivity.class)));
binding.SignInButton.setOnClickListener(view -> {
if(isValidSignInDetails())
SignIn();

});
}

private void SignIn(){


Loading(true);
FirebaseFirestore database= FirebaseFirestore.getInstance();
database.collection(Constants.KEY_COLLECTION_USERS)
.whereEqualTo(Constants.KEY_PHONENUMBER,binding.SINumber.ge
tText().toString())
.whereEqualTo(Constants.KEY_PASSWORD,binding.SIPassword.get
Text().toString())
.get()
.addOnCompleteListener(task -> {
if(task.isSuccessful() && task.getResult()!=null &&
task.getResult().getDocuments().size()>0){
DocumentSnapshot
documentSnapshot=task.getResult().getDocuments().get(0);

preferencesManager.putBoolean(Constants.KEY_IS_SIGNED_IN,true);
talk Buddy

preferencesManager.putString(Constants.KEY_USER_ID,documentSnapshot.getId()
);

preferencesManager.putString(Constants.KEY_NAME,documentSnapshot.getString(
Constants.KEY_NAME));

preferencesManager.putString(Constants.KEY_IMAGE,documentSnapshot.getString
(Constants.KEY_IMAGE));
Intent i_login=new
Intent(getApplicationContext(),MainActivity.class);
i_login.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i_login);
}else {
Loading(false);
ShowToast("Invalid Mobile number and password");
}

});
}

private void Loading(boolean isLoading){


if(isLoading){
binding.SignInButton.setVisibility(View.INVISIBLE);
binding.progressBar.setVisibility(View.VISIBLE);
}else {
binding.SignInButton.setVisibility(View.VISIBLE);
binding.progressBar.setVisibility(View.INVISIBLE);

}
private void ShowToast(String message){
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}

//validation for sign in


private Boolean isValidSignInDetails(){
if(binding.SINumber.getText().toString().trim().isEmpty()){
ShowToast("Enter Mobile Number");
return false;
} else if (!
Patterns.PHONE.matcher(binding.SINumber.getText().toString()).matches()) {
ShowToast("Enter valid Mobile Number");
return false;
} else if
(binding.SIPassword.getText().toString().trim().isEmpty()) {
ShowToast("Enter Password");
return false;
}else {
return true;
}

}
Output.
talk Buddy
talk Buddy

Sing Up
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
android:clipToPadding="false"
android:overScrollMode="never"
android:padding="@dimen/_24sdp"
android:scrollbars="none"
tools:context=".activities.SignUpActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_40sdp"
android:text="@string/Create_New_account"
android:textColor="@color/primary"
android:textSize="@dimen/_18ssp"
android:textStyle="bold"/>

<FrameLayout
android:id="@+id/FrameImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_20sdp">

<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/ProfileImage"
android:background="@drawable/background_image"
android:scaleType="centerCrop"
app:riv_oval="true"
android:layout_width="@dimen/_80sdp"
android:layout_height="@dimen/_80sdp"/>
<TextView
android:id="@+id/TextAddImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/addimage"
android:layout_gravity="center"
android:textSize="@dimen/_10ssp"/>
</FrameLayout>

<EditText
android:id="@+id/InputName"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_20sdp"
android:background="@drawable/background_input"
android:hint="@string/name"
talk Buddy

android:imeOptions="actionNext"
android:importantForAutofill="no"
android:inputType="text"
android:paddingStart="@dimen/_16sdp"
android:paddingEnd="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>

<EditText
android:id="@+id/SUInputNumber"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_20sdp"
android:background="@drawable/background_input"
android:hint="@string/phonenumber"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:inputType="phone"
android:paddingStart="@dimen/_16sdp"
android:paddingEnd="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>

<EditText
android:id="@+id/SUPassword"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_20sdp"
android:background="@drawable/background_input"
android:hint="@string/password"
android:imeOptions="actionNext"
android:importantForAutofill="no"
android:inputType="textPassword"
android:padding="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>
<EditText
android:id="@+id/SUConfirmPassword"
android:layout_width="match_parent"
android:layout_height="@dimen/_45sdp"
android:layout_marginTop="@dimen/_20sdp"
android:background="@drawable/background_input"
android:hint="@string/confirmpassword"
android:imeOptions="actionDone"
android:importantForAutofill="no"
android:inputType="textPassword"
android:padding="@dimen/_16sdp"
android:textColor="@color/primary"
android:textSize="@dimen/_13ssp"/>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_16sdp"
android:animateLayoutChanges="true">

<com.google.android.material.button.MaterialButton
android:id="@+id/SignUpButton"
android:layout_width="match_parent"
android:layout_height="@dimen/_50sdp"
talk Buddy

android:text="Sign Up"
android:textColor="@color/white"
android:textSize="@dimen/_13ssp"
android:textStyle="bold"
app:cornerRadius="@dimen/_8sdp" />

<ProgressBar
android:id="@+id/ProgressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"
android:visibility="invisible"/>
</FrameLayout>

<TextView
android:id="@+id/TextSignIn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/SignIn"
android:textSize="@dimen/_15ssp"
android:textStyle="bold"
android:textColor="@color/primary"
android:layout_marginTop="@dimen/_10sdp" />

</LinearLayout>
</ScrollView>

JAVA.
package com.example.talkbuddy.activities;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Patterns;
import android.view.View;
import android.widget.Toast;

import com.example.talkbuddy.databinding.ActivitySignUpBinding;
import com.example.talkbuddy.utilities.Constants;
import com.example.talkbuddy.utilities.PreferencesManager;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;
talk Buddy

import com.google.firebase.ktx.Firebase;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;

public class SignUpActivity extends AppCompatActivity {

private ActivitySignUpBinding binding;


public String EncodedImage;
private PreferencesManager preferencesManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Access all id's using binding
binding=ActivitySignUpBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
//call preference manager constructor()
preferencesManager=new PreferencesManager(this);
setListeners();
}

private void setListeners(){


//Buttton for go to sign in
binding.TextSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i_signUp_page= new
Intent(getApplicationContext(),SignInActivity.class);

i_signUp_page.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//for clear activity


stack after activity change
startActivity(i_signUp_page);
}
});
//Buttton for go to sign up after data add
binding.SignUpButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
if(IsValidSignUpDetails()){//if all data is valid then do
signup else show toast
SignUp();
}
}
});

//button for set profilepic


binding.ProfileImage.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
Intent i_set_image=new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

i_set_image.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
PickImage.launch(i_set_image);
}
talk Buddy

});
}

public void ShowToast(String message){


Toast.makeText(SignUpActivity.this, message,
Toast.LENGTH_SHORT).show();
}

private void SignUp(){


Loading(true);
FirebaseFirestore firebaseFireStore=
FirebaseFirestore.getInstance();
HashMap<String,Object> user= new HashMap<>();
//put data in database

user.put(Constants.KEY_NAME,binding.InputName.getText().toString());

user.put(Constants.KEY_PHONENUMBER,binding.SUInputNumber.getText().toString
());

user.put(Constants.KEY_PASSWORD,binding.SUPassword.getText().toString());
user.put(Constants.KEY_IMAGE,EncodedImage);

firebaseFireStore.collection(Constants.KEY_COLLECTION_USERS)//create
collection name
.add(user)
.addOnSuccessListener(documentReference -> {
Loading(false);

preferencesManager.putBoolean(Constants.KEY_IS_SIGNED_IN,true);
preferencesManager.putString(Constants.KEY_USER_ID,
documentReference.getId());

preferencesManager.putString(Constants.KEY_NAME,binding.InputName.getText()
.toString());

preferencesManager.putString(Constants.KEY_IMAGE,EncodedImage);
Intent intent=new
Intent(getApplicationContext(),SignInActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
Intent.FLAG_ACTIVITY_CLEAR_TASK);
ShowToast("You can Login");
startActivity(intent);//if signup then go to
mainactivity
finish();

})
.addOnFailureListener(exception ->{

Loading(false);
ShowToast(exception.getMessage());
});

//convert image to bitmap and add in bytearray


private String EncodeImage(Bitmap bitmap){
int PreviewWidth=150;
int PreviewHeight = bitmap.getHeight() *
PreviewWidth/bitmap.getWidth();
talk Buddy

Bitmap
PreviewBitmap=Bitmap.createScaledBitmap(bitmap,PreviewWidth,PreviewHeight,f
alse);
ByteArrayOutputStream byteArrayOutputStream=new
ByteArrayOutputStream();

PreviewBitmap.compress(Bitmap.CompressFormat.JPEG,50,byteArrayOutputStream)
;
byte[] byteArray=byteArrayOutputStream.toByteArray();
return Base64.encodeToString(byteArray,Base64.DEFAULT);

//get image from gallery and et on profilepic


private final ActivityResultLauncher<Intent>
PickImage=registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if(result.getResultCode()==RESULT_OK)
{
if(result.getData()!=null){
Uri imageUri=result.getData().getData();
try {

InputStream
inputStream=getContentResolver().openInputStream(imageUri);
Bitmap bitmap=
BitmapFactory.decodeStream(inputStream);
binding.ProfileImage.setImageBitmap(bitmap);
binding.TextAddImage.setVisibility(View.GONE);
EncodedImage=EncodeImage(bitmap);

}catch (FileNotFoundException e){


e.printStackTrace();
}
}
}
}

);
private boolean IsValidSignUpDetails(){//validation for all fields
if(EncodedImage==null) {
ShowToast("Select Profile Image");
return false;
} else if (binding.InputName.getText().toString().trim().isEmpty())
{
ShowToast("Enter Name");
return false;
}else if
(binding.SUInputNumber.getText().toString().trim().isEmpty()) {
ShowToast("Enter Number");
return false;
}else if (!
Patterns.PHONE.matcher(binding.SUInputNumber.getText().toString()).matches(
)) {
ShowToast("Enter Valid Mobile Number");
return false;
}else if(binding.SUPassword.getText().toString().trim().isEmpty()){
ShowToast("Enter Password");
return false;
talk Buddy

}else
if(binding.SUConfirmPassword.getText().toString().trim().isEmpty()) {
ShowToast("Confirm Your Password");
return false;
}else if(!
binding.SUPassword.getText().toString().equals(binding.SUConfirmPassword.ge
tText().toString())) {
ShowToast("Password must be same");
return false;
}
else
return true;
}

private void Loading(Boolean IsLoading){//lpading show while data store


in database
if(IsLoading){
binding.SignUpButton.setVisibility(View.INVISIBLE);
binding.ProgressBar.setVisibility(View.VISIBLE);
}
else {
binding.ProgressBar.setVisibility(View.INVISIBLE);
binding.SignUpButton.setVisibility(View.VISIBLE);
}
}
}
Output.
talk Buddy
talk Buddy

User Activity.
<?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"
android:animateLayoutChanges="true"
android:background="@color/primary"
tools:context=".activities.UsersActivity">

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ImageBack"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_marginTop="@dimen/_12sdp"
android:layout_marginStart="@dimen/_16sdp"
android:layout_marginLeft="@dimen/_16sdp"
android:background="@drawable/background_icon"
android:padding="@dimen/_6sdp"
android:src="@drawable/ic_back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:tint="@color/white"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/SelctUSer"
android:textColor="@color/white"
android:textSize="@dimen/_14ssp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/ImageBack"
app:layout_constraintEnd_toEndOf="parent "
app:layout_constraintStart_toStartOf="parent "
app:layout_constraintTop_toTopOf="@id/ImageBack"/>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/background_container_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ImageBack">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/UserRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
android:overScrollMode="never"
android:padding="@dimen/_20sdp"
android:visibility="gone"

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

<ProgressBar
talk Buddy

android:id="@+id/progressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"/>

<TextView
android:id="@+id/TextErrorMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginStart="@dimen/_24sdp"
android:layout_marginEnd="@dimen/_24sdp"
android:layout_gravity="center"
android:textColor="@color/primary"
android:textSize="@dimen/_12ssp"
android:visibility="gone"/>

</FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
JAVA.
package com.example.talkbuddy.activities;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import com.example.talkbuddy.adapters.UsersAdapter;
import com.example.talkbuddy.databinding.ActivityUsersBinding;
import com.example.talkbuddy.listeners.UserListener;
import com.example.talkbuddy.models.User;
import com.example.talkbuddy.utilities.Constants;
import com.example.talkbuddy.utilities.PreferencesManager;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;

import java.util.ArrayList;
import java.util.List;

public class UsersActivity extends BaseActivity implements UserListener {

private ActivityUsersBinding binding;


private PreferencesManager preferencesManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding=ActivityUsersBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
preferencesManager=new PreferencesManager(getApplicationContext());
setListeners();
getUsers();
}

private void setListeners(){


binding.ImageBack.setOnClickListener(view -> onBackPressed());
}
private void getUsers(){
Loading(true);
talk Buddy

FirebaseFirestore database=FirebaseFirestore.getInstance();
database.collection(Constants.KEY_COLLECTION_USERS)
.get()
.addOnCompleteListener(task -> {
Loading(false);
String
currentUserId=preferencesManager.getString(Constants.KEY_USER_ID);
if(task.isSuccessful() && task.getResult()!=null ){
List<User> users=new ArrayList<>();
for(QueryDocumentSnapshot
queryDocumentSnapshot:task.getResult()) {
if
(currentUserId.equals(queryDocumentSnapshot.getId())) {
continue;
}
User user = new User();
user.name =
queryDocumentSnapshot.getString(Constants.KEY_NAME);
user.mobileNumber =
queryDocumentSnapshot.getString(Constants.KEY_PHONENUMBER);
user.image =
queryDocumentSnapshot.getString(Constants.KEY_IMAGE);
user.token =
queryDocumentSnapshot.getString(Constants.KEY_FCM_TOKEN);
user.id=queryDocumentSnapshot.getId();
users.add(user);
}
if(users.size()>0){
UsersAdapter usersAdapter=new
UsersAdapter(users,this);

binding.UserRecyclerView.setAdapter(usersAdapter);

binding.UserRecyclerView.setVisibility(View.VISIBLE);
}
else {
ShowErrorMessage();
}
}else {
ShowErrorMessage();
}
});
}

private void ShowErrorMessage(){


binding.TextErrorMessage.setText(String.format("%s","User Not
Available"));
binding.TextErrorMessage.setVisibility(View.VISIBLE);
}
private void Loading(boolean isLoading){
if(isLoading){
binding.progressBar.setVisibility(View.VISIBLE);
}else {
binding.progressBar.setVisibility(View.INVISIBLE);

}
}

public void onUserClicked(User user){


Intent intent = new
Intent(getApplicationContext(),ChatActivity.class);
talk Buddy

intent.putExtra(Constants.KEY_USER,user);
startActivity(intent);
finish();
}

}
Output:
talk Buddy
talk Buddy

Chat Activity.
<?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"
android:animateLayoutChanges="true"
android:background="@color/primary"
tools:context=".activities.ChatActivity">

<View
android:id="@+id/ViewBackground"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="@dimen/_16sdp"
android:background="@drawable/background_content_top"
app:layout_constraintBottom_toTopOf="@id/SendMesage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
tools:layout_editor_absoluteX="42dp"
android:backgroundTint="@color/white"/>

<View
android:id="@+id/HeaderBackground"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/primary"
app:layout_constraintBottom_toTopOf="@id/ViewSupporter"
app:layout_constraintTop_toTopOf="parent"/>

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ImageBack"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:padding="@dimen/_5sdp"
android:src="@drawable/ic_back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tint="@color/white"/>

<Spinner
android:id="@+id/spinner_language"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_marginTop="24dp"
android:layout_marginEnd="@dimen/_10sdp"
android:padding="@dimen/_4sdp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/language"
android:visibility="invisible"
/>
talk Buddy

<TextView
android:id="@+id/TextName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/_14ssp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/ImageBack"
app:layout_constraintEnd_toStartOf="@id/spinner_language"
app:layout_constraintStart_toEndOf="@id/ImageBack"
app:layout_constraintTop_toTopOf="@id/ImageBack"/>

<View
android:id="@+id/ViewSupporter"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/primary"
android:layout_marginTop="@dimen/_12sdp"
app:layout_constraintTop_toBottomOf="@id/ImageBack"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/ChatRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:orientation="vertical"
android:overScrollMode="never"
android:padding="@dimen/_20sdp"
app:stackFromEnd="true"
android:visibility="gone"

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="@id/ViewBackground"
app:layout_constraintTop_toBottomOf="@id/ViewSupporter"
/>

<ProgressBar
android:id="@+id/progressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
app:layout_constraintBottom_toBottomOf="@id/ViewBackground"
app:layout_constraintEnd_toEndOf="@id/ViewBackground"
app:layout_constraintStart_toStartOf="@id/ViewBackground"
app:layout_constraintTop_toTopOf="@id/ViewBackground"/>

<FrameLayout
android:id="@+id/SendMesage"
android:layout_width="@dimen/_40sdp"
android:layout_height="@dimen/_40sdp"
android:layout_marginEnd="@dimen/_16sdp"
android:layout_marginRight="@dimen/_16sdp"
android:layout_marginBottom="@dimen/_12sdp"
talk Buddy

android:background="@drawable/background_chat_input"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent">

<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/_4sdp"
android:layout_marginLeft="@dimen/_4sdp"
android:padding="@dimen/_8sdp"
android:src="@drawable/ic_send"
app:tint="@color/white" />
</FrameLayout>

<EditText
android:id="@+id/InputMessage"
android:layout_width="0dp"
android:layout_height="@dimen/_40sdp"
android:layout_marginStart="@dimen/_16sdp"
android:layout_marginLeft="@dimen/_16sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:layout_marginRight="@dimen/_8sdp"
android:layout_marginBottom="@dimen/_12sdp"
android:background="@drawable/background_chat_input"
android:hint="@string/TypeMessage"
android:imeOptions="actionDone"
android:importantForAutofill="no"
android:inputType="text"
android:paddingStart="@dimen/_16sdp"
android:paddingEnd="@dimen/_16sdp"
android:textColor="@color/white"
android:textColorHint="@color/secondory_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/SendMesage"
app:layout_constraintStart_toStartOf="parent"/>

<TextView
android:id="@+id/UserAvailability"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:padding="@dimen/_2sdp"
android:text="Online"
android:gravity="center"
android:textColor="@color/primary"
android:textSize="@dimen/_10ssp"
android:textStyle="bold"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/ViewSupporter"
/>

<TextView
android:id="@+id/idTranslatedTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="421dp"
talk Buddy

tools:ignore="MissingConstraints" />

<!-- <TextView-->
<!-- android:id="@+id/textiew"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="TextView"-->
<!-- tools:layout_editor_absoluteX="354dp"-->
<!-- tools:layout_editor_absoluteY="33dp" />-->

</androidx.constraintlayout.widget.ConstraintLayout>
JAVA.
package com.example.talkbuddy.activities;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.nfc.Tag;
import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognizerIntent;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.talkbuddy.R;
import com.example.talkbuddy.adapters.ChatAdapter;
import com.example.talkbuddy.databinding.ActivityChatBinding;
import com.example.talkbuddy.models.ChatMessage;
import com.example.talkbuddy.models.User;
import com.example.talkbuddy.network.ApiClient;
import com.example.talkbuddy.network.ApiService;
import com.example.talkbuddy.utilities.Constants;
import com.example.talkbuddy.utilities.PreferencesManager;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentChange;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.firestore.core.QueryListener;
import com.google.mlkit.common.model.DownloadConditions;
import com.google.mlkit.nl.translate.TranslateLanguage;
import com.google.mlkit.nl.translate.Translation;
import com.google.mlkit.nl.translate.Translator;
import com.google.mlkit.nl.translate.TranslatorOptions;

import org.checkerframework.checker.nullness.qual.NonNull;
talk Buddy

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ChatActivity extends BaseActivity {


String TAG="ChatActivity";

private ActivityChatBinding binding;


private User reciverUser;
private List<ChatMessage> chatmessage;
private ChatAdapter chatAdapter;
private PreferencesManager preferencesManager;
private FirebaseFirestore database;
private Spinner fromSpinner;
private String conversionId = null;

private Boolean isReceiverAvailable = false;


private static final int REQUEST_PERMISSION_CODE = 1;

private TextView translateTV;


String[] fromLanguage = {"English", "Afrikaans", "Arabic", "Belarusin",
"Bulgarian", "Bengali", "Catalan","Gujarati", "Czech", "Welsh", "Hindi",
"urdu"};
public String fromLanguageCode, toLanguageCode=null;

int count=0;
String trans;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityChatBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
loadReceiverDetails();
setListeners();
init();
SendReceivedMessage();
fromSpinner = findViewById(R.id.spinner_language);

translateTV = findViewById(R.id.idTranslatedTV);

fromSpinner.setVisibility(View.VISIBLE);
fromSpinner.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View
view, int i, long l) {
fromLanguageCode = getLanguageCode(fromLanguage[i]);
count=i;
talk Buddy

translateTV.setText(fromLanguage[i]);
chatAdapter.notifyDataSetChanged();
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {
fromSpinner.setVisibility(View.VISIBLE);

}
});

ArrayAdapter fromAdapter = new ArrayAdapter(this,


R.layout.spinner_item, fromLanguage);

fromAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdow
n_item);
fromSpinner.setAdapter(fromAdapter);

private void init() {


preferencesManager = new
PreferencesManager(getApplicationContext());
chatmessage = new ArrayList<>();
chatAdapter = new ChatAdapter(chatmessage,
getBitmapFromEncodedString(reciverUser.image),
preferencesManager.getString(Constants.KEY_USER_ID));
binding.ChatRecyclerView.setAdapter(chatAdapter);
database = FirebaseFirestore.getInstance();
}

private void sendMessage() {


HashMap<String, Object> message = new HashMap<>();
message.put(Constants.KEY_SENDER_ID,
preferencesManager.getString(Constants.KEY_USER_ID));
message.put(Constants.KEY_RECEIVER_ID, reciverUser.id);
message.put(Constants.KEY_TIME, new Date());

translateTV.setText("");

/* if (fromLanguageCode!=TranslateLanguage.ENGLISH){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
message.put(Constants.KEY_MESSAGE,trans);

database.collection(Constants.KEY_CHAT_COLLECTION).add(message);
}
},1000);
}
else{

message.put(Constants.KEY_MESSAGE,binding.InputMessage.getText().toString()
);

database.collection(Constants.KEY_CHAT_COLLECTION).add(message);
}*/
talk Buddy

message.put(Constants.KEY_MESSAGE,binding.InputMessage.getText().toString()
);
Log.d("CHD", "sendMessage: "+message);
database.collection(Constants.KEY_CHAT_COLLECTION).add(message);

if (conversionId != null) {
String passsource=binding.InputMessage.getText().toString();
TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(Locale.getDefault().getLangu
age())
.setTargetLanguage(TranslateLanguage.ENGLISH)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new
DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {
// Model downloaded successfully. Okay
to start translating.
// (Set a flag, unhide the translation
UI, etc.)
Log.d("FromSource",
String.valueOf(fromLanguageCode));
Log.d("toSource",
String.valueOf(toLanguageCode));
translateTV.setText("Translation...");

englishGermanTranslator.translate(passsource).addOnSuccessListener(new
OnSuccessListener<String>() {
@Override
public void onSuccess(String s) {

updateConversion(s);
Log.d("dhaval","dhaval oin :
"+s);
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
//
message.put(Constants.KEY_MESSAGE,trans);
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {

Toast.makeText(ChatActivity.this, "Failed to Translate!! try again",


Toast.LENGTH_SHORT).show();
}
});
}
talk Buddy

})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or
other internal error.
// ...
}
});

/* if (fromLanguageCode!=TranslateLanguage.ENGLISH){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
updateConversion(trans);
}
},1000);
}else

updateConversion(binding.InputMessage.getText().toString());*/
} else {
HashMap<String, Object> conversion = new HashMap<>();
conversion.put(Constants.KEY_SENDER_ID,
preferencesManager.getString(Constants.KEY_USER_ID));
conversion.put(Constants.KEY_SENDER_NAME,
preferencesManager.getString(Constants.KEY_NAME));
conversion.put(Constants.KEY_SENDER_IMAGE,
preferencesManager.getString(Constants.KEY_IMAGE));
conversion.put(Constants.KEY_RECEIVER_ID, reciverUser.id);
conversion.put(Constants.KEY_RECEIVER_NAME, reciverUser.name);
conversion.put(Constants.KEY_RECEIVER_IMAGE,
reciverUser.image);

// conversion.put(Constants.KEY_LAST_MESSAGE,
binding.InputMessage.getText().toString());

String passsource=binding.InputMessage.getText().toString();
TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(Locale.getDefault().getLangu
age())
.setTargetLanguage(TranslateLanguage.ENGLISH)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new
DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {

englishGermanTranslator.translate(passsource).addOnSuccessListener(new
OnSuccessListener<String>() {
@Override
talk Buddy

public void onSuccess(String s) {

conversion.put(Constants.KEY_LAST_MESSAGE,s);

conversion.put(Constants.KEY_TIME, new Date());


addConversion(conversion);
Log.d("dhaval","dhaval oin :
"+s);
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
//
message.put(Constants.KEY_MESSAGE,trans);
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {

Toast.makeText(ChatActivity.this, "Failed to Translate!! try again",


Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or
other internal error.
// ...
}
});
/* if (fromLanguageCode!=TranslateLanguage.ENGLISH){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
conversion.put(Constants.KEY_LAST_MESSAGE,trans);
}
},2000);
}
else{
conversion.put(Constants.KEY_LAST_MESSAGE,
binding.InputMessage.getText().toString());
}
*/
// conversion.put(Constants.KEY_LAST_MESSAGE,
binding.InputMessage.getText().toString());

}
if (isReceiverAvailable) {
try {
JSONArray tokens = new JSONArray();
tokens.put(reciverUser.token);
JSONObject data = new JSONObject();
data.put(Constants.KEY_USER_ID,
talk Buddy

preferencesManager.getString(Constants.KEY_USER_ID));
data.put(Constants.KEY_NAME,
preferencesManager.getString(Constants.KEY_NAME));
data.put(Constants.KEY_FCM_TOKEN,
preferencesManager.getString(Constants.KEY_FCM_TOKEN));

String
passsource=binding.InputMessage.getText().toString();
TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(Locale.getDefault().getL
anguage())
.setTargetLanguage(TranslateLanguage.ENGLIS
H)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new
DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {

englishGermanTranslator.translate(passsource).addOnSuccessListener(new
OnSuccessListener<String>() {
@Override
public void onSuccess(String s)
{
try {

data.put(Constants.KEY_MESSAGE, binding.InputMessage.getText().toString());
JSONObject body = new
JSONObject();

body.put(Constants.MSG_DATA, data);

body.put(Constants.MSG_REGISTRATION_IDS, tokens);

SendNotification(body.toString());
} catch (Exception e){

}
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
//
message.put(Constants.KEY_MESSAGE,trans);
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
talk Buddy

Toast.makeText(ChatActivity.this, "Failed to Translate!! try again",


Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or
other internal error.
// ...
}
});

} catch (Exception exception) {


ShowToast(exception.getMessage());
}
}
binding.InputMessage.setText(null);
}

private void ShowToast(String message) {


Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}

private void SendNotification(String messageBody) {


ApiClient.getClient().create(ApiService.class).sendMessage(
Constants.getMsgHeaders(),
messageBody
).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull
Response<String> response) {
if (response.isSuccessful()) {
try {
if (response.body() != null) {
JSONObject responseJson = new
JSONObject(response.body());
JSONArray results =
responseJson.getJSONArray("results");
if (responseJson.getInt("failure") == 1) {
JSONObject error = (JSONObject)
results.get(0);
ShowToast(error.getString("error"));
return;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
ShowToast("Notification Sent Successfully");
} else {
ShowToast("Error:" + response.code());
}
talk Buddy

@Override
public void onFailure(@NonNull Call<String> call, @NonNull
Throwable t) {
ShowToast(t.getMessage());
}
});
}

private void listenAvailabilityOfReceiver() {


database.collection(Constants.KEY_COLLECTION_USERS).document(
reciverUser.id
).addSnapshotListener(ChatActivity.this, (value, error) -> {
if (error != null) {
return;
}
if (value != null) {
if (value.getLong(Constants.KEY_AVAILABILITY) != null) {
int availability = Objects.requireNonNull(
value.getLong(Constants.KEY_AVAILABILITY)
).intValue();
isReceiverAvailable = availability == 1;
}
reciverUser.token =
value.getString(Constants.KEY_FCM_TOKEN);
if (reciverUser.image == null) {
reciverUser.image =
value.getString(Constants.KEY_IMAGE);

chatAdapter.setReceiverProfileImage(getBitmapFromEncodedString(reciverUser.
image));
chatAdapter.notifyItemRangeChanged(0,
chatmessage.size());
}

}
if (isReceiverAvailable) {
binding.UserAvailability.setVisibility(View.VISIBLE);
} else {
binding.UserAvailability.setVisibility(View.GONE);
}
});
}

private void SendReceivedMessage() {


database.collection(Constants.KEY_CHAT_COLLECTION)
.whereEqualTo(Constants.KEY_SENDER_ID,
preferencesManager.getString(Constants.KEY_USER_ID))
.whereEqualTo(Constants.KEY_RECEIVER_ID, reciverUser.id)
.addSnapshotListener(eventListener);
database.collection(Constants.KEY_CHAT_COLLECTION)
.whereEqualTo(Constants.KEY_SENDER_ID, reciverUser.id)
.whereEqualTo(Constants.KEY_RECEIVER_ID,
preferencesManager.getString(Constants.KEY_USER_ID))
.addSnapshotListener(eventListener);

private final EventListener<QuerySnapshot> eventListener = (value,


error) -> {
talk Buddy

if (error != null) {
return;
}
if (value != null) {
int count = chatmessage.size();
for (DocumentChange documentChange :
value.getDocumentChanges()) {
if (documentChange.getType() == DocumentChange.Type.ADDED)
{
ChatMessage chatMessage = new ChatMessage();
chatMessage.senderId =
documentChange.getDocument().getString(Constants.KEY_SENDER_ID);
chatMessage.recieverId =
documentChange.getDocument().getString(Constants.KEY_RECEIVER_ID);
chatMessage.message =
documentChange.getDocument().getString(Constants.KEY_MESSAGE);

chatMessage.dateTime =
getDateTime(documentChange.getDocument().getDate(Constants.KEY_TIME));
chatMessage.date =
documentChange.getDocument().getDate(Constants.KEY_TIME);
chatmessage.add(chatMessage);
}

}
Collections.sort(chatmessage, (obj1, obj2) ->
obj1.date.compareTo(obj2.date));
if (count == 0) {
chatAdapter.notifyDataSetChanged();
} else {
chatAdapter.notifyItemRangeInserted(chatmessage.size(),
chatmessage.size());

binding.ChatRecyclerView.smoothScrollToPosition(chatmessage.size() - 1);
}
binding.ChatRecyclerView.setVisibility(View.VISIBLE);
}
binding.progressBar.setVisibility(View.GONE);
if (conversionId == null) {
checkConversion();
}

};

private Bitmap getBitmapFromEncodedString(String encodedImage) {


if (encodedImage != null) {
byte[] bytes = Base64.decode(encodedImage, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
} else {
return null;
}
}

private void loadReceiverDetails() {


reciverUser = (User)
getIntent().getSerializableExtra(Constants.KEY_USER);
binding.TextName.setText(reciverUser.name);
}
talk Buddy

private void setListeners() {


binding.ImageBack.setOnClickListener(v -> onBackPressed());
binding.SendMesage.setOnClickListener(view -> sendMessage());

private String getDateTime(Date date) {


return new SimpleDateFormat("MMMM dd,yyyy - hh:mm a",
Locale.getDefault()).format(date);
}

private void addConversion(HashMap<String, Object> conversion) {


database.collection(Constants.KEY_COLLECTION_CONVERSATIONS)
.add(conversion)
.addOnSuccessListener(documentReference -> conversionId =
documentReference.getId());
}

private void updateConversion(String message) {


Log.d("dhaval","Message: "+message);
DocumentReference documentReference =

database.collection(Constants.KEY_COLLECTION_CONVERSATIONS).document(conver
sionId);
documentReference.update(
Constants.KEY_LAST_MESSAGE, message,
Constants.KEY_TIME, new Date()
);
}

private void checkConversion() {


if (chatmessage.size() != 0) {

checkConversionRemote(preferencesManager.getString(Constants.KEY_USER_ID),
reciverUser.id);
checkConversionRemote(reciverUser.id,
preferencesManager.getString(Constants.KEY_USER_ID));
}
}

private void checkConversionRemote(String senderId, String receiverId)


{
database.collection(Constants.KEY_COLLECTION_CONVERSATIONS)
.whereEqualTo(Constants.KEY_SENDER_ID, senderId)
.whereEqualTo(Constants.KEY_RECEIVER_ID, receiverId)
.get()
.addOnCompleteListener(conversionOnCompleteListener);

private final OnCompleteListener<QuerySnapshot>


conversionOnCompleteListener = task -> {
if (task.isSuccessful() && task.getResult() != null &&
task.getResult().getDocuments().size() > 0) {
DocumentSnapshot documentSnapshot =
task.getResult().getDocuments().get(0);
conversionId = documentSnapshot.getId();
}

};
talk Buddy

@Override
protected void onResume() {
super.onResume();
listenAvailabilityOfReceiver();
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
@Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_PERMISSION_CODE)
{
if (resultCode==RESULT_OK && data!=null){
ArrayList<String> result =
data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
binding.InputMessage.setText(result.get(0));
}
}
}

private void translateText(String fromLanguageCode, String


toLanguageCode, String source) {
Log.d("ChatActivity", "translateText: "+fromLanguageCode+"
"+toLanguageCode+" "+source);
TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(Locale.getDefault().getLanguage(
))
.setTargetLanguage(toLanguageCode)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {
// Model downloaded successfully. Okay to
start translating.
// (Set a flag, unhide the translation UI,
etc.)
Log.d("FromSource",
String.valueOf(fromLanguageCode));
Log.d("toSource",
String.valueOf(toLanguageCode));
translateTV.setText("Translation...");

englishGermanTranslator.translate(source).addOnSuccessListener(new
OnSuccessListener<String>() {
@Override
public void onSuccess(String s) {
binding.InputMessage.setText(s);
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
talk Buddy

//
message.put(Constants.KEY_MESSAGE,trans);
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
Toast.makeText(ChatActivity.this,
"Failed to Translate!! try again", Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or other
internal error.
// ...
}
});
}

private String getLanguageCode(String language)


{
String languageCode = String.valueOf(0);
switch (language){
case "English":
languageCode = TranslateLanguage.ENGLISH;
break;
case "Afrikaans":
languageCode = TranslateLanguage.AFRIKAANS;
break;
case "Arabic":
languageCode = TranslateLanguage.ARABIC;
break;
case "Belarusin":
languageCode = TranslateLanguage.BELARUSIAN;
break;
case "Bulgarian":
languageCode = TranslateLanguage.BULGARIAN;
break;
case "Bengali":
languageCode = TranslateLanguage.BENGALI;
break;
case "Catalan":
languageCode = TranslateLanguage.CATALAN;
break;
case "Czech":
languageCode = TranslateLanguage.CZECH;
break;
case "Welsh":
languageCode = TranslateLanguage.WELSH;
break;
case "Hindi":
languageCode = TranslateLanguage.HINDI;
break;
case "urdu":
talk Buddy

languageCode = TranslateLanguage.URDU;
break;
case "Gujarati":
languageCode = TranslateLanguage.GUJARATI;
break;
default:
languageCode = TranslateLanguage.ENGLISH;
}
return languageCode;
}
}

Output:
talk Buddy
talk Buddy

Main Activity.
<?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"
android:animateLayoutChanges="true"
android:background="@color/primary"
tools:context=".activities.MainActivity">

<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/ProfileImage"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_marginStart="@dimen/_16sdp"
android:layout_marginLeft="@dimen/_16sdp"
android:layout_marginTop="@dimen/_12sdp"
android:background="@drawable/background_icon"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_corner_radius="@dimen/_8sdp"/>

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ImageSignOut"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_marginTop="@dimen/_12sdp"
android:layout_marginEnd="@dimen/_16sdp"
android:layout_marginRight="@dimen/_16sdp"
android:background="@drawable/background_icon"
android:padding="@dimen/_6sdp"
android:src="@drawable/ic_logout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:tint="@color/white"/>

<TextView
android:id="@+id/TextName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/_14ssp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/ProfileImage"
app:layout_constraintEnd_toStartOf="@id/ImageSignOut"
app:layout_constraintStart_toEndOf="@id/ProfileImage"
app:layout_constraintTop_toTopOf="@id/ProfileImage"/>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
talk Buddy

android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/background_container_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ProfileImage">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/conversionRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
android:overScrollMode="never"
android:padding="@dimen/_20sdp"
android:visibility="gone"

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

<ProgressBar
android:id="@+id/progressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"/>

</FrameLayout>

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/NewChat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/_24sdp"
android:layout_marginRight="@dimen/_24sdp"
android:layout_marginBottom="@dimen/_24sdp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_add"
android:backgroundTint="@color/primary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:tint="@color/white"/>
</androidx.constraintlayout.widget.ConstraintLayout>
JAVA.
package com.example.talkbuddy.activities;

import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.talkbuddy.R;
import com.example.talkbuddy.adapters.RecentConversionAdapter;
import com.example.talkbuddy.databinding.ActivityMainBinding;
import com.example.talkbuddy.databinding.ActivitySignInBinding;
import com.example.talkbuddy.listeners.ConversionListeners;
import com.example.talkbuddy.models.ChatMessage;
import com.example.talkbuddy.models.User;
talk Buddy

import com.example.talkbuddy.utilities.Constants;
import com.example.talkbuddy.utilities.PreferencesManager;
import com.google.firebase.firestore.DocumentChange;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FieldValue;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.messaging.FirebaseMessaging;
import com.makeramen.roundedimageview.RoundedImageView;

import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends BaseActivity implements


ConversionListeners {

private ActivityMainBinding binding;


PreferencesManager preferencesManager;

private List<ChatMessage> conversations;


private RecentConversionAdapter recentConversionAdapter;
private FirebaseFirestore database;

Dialog dialog;

RoundedImageView Profile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
preferencesManager=new PreferencesManager(getApplicationContext());

Profile=findViewById(R.id.profile);
init();
LoadUserDetails();
getToken();//optional
setListener();
listenConversation();
}

private void init(){


conversations =new ArrayList<>();
recentConversionAdapter=new
RecentConversionAdapter(conversations,this);
binding.conversionRecyclerView.setAdapter(recentConversionAdapter);
database=FirebaseFirestore.getInstance();

private void setListener(){


binding.ImageSignOut.setOnClickListener(v -> SignOut());
binding.NewChat.setOnClickListener(v ->
startActivity(new
Intent(getApplicationContext(),UsersActivity.class)));
binding.ProfileImage.setOnClickListener(new View.OnClickListener()
talk Buddy

{
@Override
public void onClick(View view) {
dialog= new Dialog(MainActivity.this);
dialog.setContentView(R.layout.dialog_profile);

// byte[] bytes=
android.util.Base64.decode(preferencesManager.getString(Constants.KEY_IMAGE
), android.util.Base64.DEFAULT);
// Bitmap bitmap=
BitmapFactory.decodeByteArray(bytes,0,bytes.length);

dialog.show();

}
});
}
private void LoadUserDetails(){

binding.TextName.setText(preferencesManager.getString(Constants.KEY_NAME));
byte[] bytes=
android.util.Base64.decode(preferencesManager.getString(Constants.KEY_IMAGE
), android.util.Base64.DEFAULT);
Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
binding.ProfileImage.setImageBitmap(bitmap);
Profile.setImageBitmap(bitmap);

private void ShowToast(String message){


Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}

private void listenConversation(){

database.collection(Constants.KEY_COLLECTION_CONVERSATIONS)
.whereEqualTo(Constants.KEY_SENDER_ID,preferencesManager.ge
tString(Constants.KEY_USER_ID))
.addSnapshotListener(eventListener);
database.collection(Constants.KEY_COLLECTION_CONVERSATIONS)
.whereEqualTo(Constants.KEY_RECEIVER_ID,preferencesManager.
getString(Constants.KEY_USER_ID))
.addSnapshotListener(eventListener);
}

private final EventListener<QuerySnapshot> eventListener


=(value,error)->{
if(error!=null){
return;
}
if(value!=null){
for(DocumentChange documentChange:value.getDocumentChanges()){
if(documentChange.getType()== DocumentChange.Type.ADDED){
String
senderId=documentChange.getDocument().getString(Constants.KEY_SENDER_ID);
String
receiverId=documentChange.getDocument().getString(Constants.KEY_RECEIVER_ID
);
talk Buddy

ChatMessage chatMessage= new ChatMessage();


chatMessage.senderId=senderId;
chatMessage.recieverId=receiverId;

if(preferencesManager.getString(Constants.KEY_USER_ID).equals(senderId)){

chatMessage.conversionImage=documentChange.getDocument().getString(Constant
s.KEY_RECEIVER_IMAGE);

chatMessage.conversionName=documentChange.getDocument().getString(Constants
.KEY_RECEIVER_NAME);

chatMessage.conversionId=documentChange.getDocument().getString(Constants.K
EY_RECEIVER_ID);
}
else {

chatMessage.conversionImage=documentChange.getDocument().getString(Constant
s.KEY_SENDER_IMAGE);

chatMessage.conversionName=documentChange.getDocument().getString(Constants
.KEY_SENDER_NAME);

chatMessage.conversionId=documentChange.getDocument().getString(Constants.K
EY_SENDER_ID);
}

chatMessage.message=documentChange.getDocument().getString(Constants.KEY_LA
ST_MESSAGE);

chatMessage.date=documentChange.getDocument().getDate(Constants.KEY_TIME);
conversations.add(chatMessage);
}else if(documentChange.getType() ==
DocumentChange.Type.MODIFIED){
for(int i=0;i<conversations.size();i++)
{
String
senderId=documentChange.getDocument().getString(Constants.KEY_SENDER_ID);
String
receiverId=documentChange.getDocument().getString(Constants.KEY_RECEIVER_ID
);
if(conversations.get(i).senderId.equals(senderId)
&& conversations.get(i).recieverId.equals(receiverId)){

conversations.get(i).message=documentChange.getDocument().getString(Constan
ts.KEY_LAST_MESSAGE);

conversations.get(i).date=documentChange.getDocument().getDate(Constants.KE
Y_TIME);
break;
}
}
}
}
Collections.sort(conversations,(obj1,obj2)->
obj2.date.compareTo(obj1.date));
recentConversionAdapter.notifyDataSetChanged();
binding.conversionRecyclerView.smoothScrollToPosition(0);
binding.conversionRecyclerView.setVisibility(View.VISIBLE);
binding.progressBar.setVisibility(View.GONE);
}
talk Buddy

};

private void getToken(){

FirebaseMessaging.getInstance().getToken().addOnSuccessListener(this::Updat
eToken);
}
private void UpdateToken(String token){
preferencesManager.putString(Constants.KEY_FCM_TOKEN,token);
FirebaseFirestore database= FirebaseFirestore.getInstance();
DocumentReference documentReference=

database.collection(Constants.KEY_COLLECTION_USERS).document(preferencesMan
ager.getString(Constants.KEY_USER_ID));
documentReference.update(Constants.KEY_FCM_TOKEN,token)
// .addOnSuccessListener(unused -> ShowToast("Token
Updated successfully"))
.addOnFailureListener(e -> ShowToast("Unable To
updata Token"));
}

private void SignOut(){


// ShowToast("Sign out.....");
FirebaseFirestore database= FirebaseFirestore.getInstance();
DocumentReference documentReference=
database.collection(Constants.KEY_COLLECTION_USERS).document(preferencesMan
ager.getString(Constants.KEY_USER_ID));
HashMap<String,Object> updates=new HashMap<>();
updates.put(Constants.KEY_FCM_TOKEN, FieldValue.delete());
documentReference.update(updates)
.addOnSuccessListener(unused -> {
preferencesManager.clear();
startActivity(new
Intent(getApplicationContext(),SignInActivity.class));
finish();
})
.addOnFailureListener(e-> ShowToast("Unable to Signout"));
}

@Override
public void onConversionClicked(User user) {
Intent intent=new
Intent(getApplicationContext(),ChatActivity.class);
intent.putExtra(Constants.KEY_USER,user);
startActivity(intent);

}
}
Output:
talk Buddy
talk Buddy

Chat Adapter.
package com.example.talkbuddy.adapters;

import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.talkbuddy.R;
import com.example.talkbuddy.activities.ChatActivity;
import com.example.talkbuddy.databinding.RecievedMessageContainerBinding;
import com.example.talkbuddy.databinding.SentMessageContainerBinding;
import com.example.talkbuddy.models.ChatMessage;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.mlkit.common.model.DownloadConditions;
import com.google.mlkit.nl.translate.TranslateLanguage;
import com.google.mlkit.nl.translate.Translation;
import com.google.mlkit.nl.translate.Translator;
import com.google.mlkit.nl.translate.TranslatorOptions;

import java.util.List;
import java.util.Locale;

public class ChatAdapter extends


RecyclerView.Adapter<RecyclerView.ViewHolder>{

private Spinner fromSpinner;


String[] fromLanguage =
{"From","English","Afrikaans","Arabic","Belarusin","Bulgarian","Bengali","C
atalan","Czech","Welsh","Hindi","urdu"};
private static final int REQUEST_PERMISSION_CODE = 1;
String languageCode,fromLanguageCode, toLanguageCode=null;
private final List<ChatMessage> chatMessages;
private Bitmap receiverProfileImage;
private final String senderId;

public static final int VIEW_TYPE_SENT = 1;


public static final int VIEW_TYPE_RECEIVED = 2;

public void setReceiverProfileImage(Bitmap bitmap){


receiverProfileImage=bitmap;
}
public ChatAdapter(List<ChatMessage> chatMessages, Bitmap
receiverProfileImage, String senderId) {
this.chatMessages = chatMessages;
this.receiverProfileImage = receiverProfileImage;
this.senderId = senderId;
}

@NonNull
@Override
talk Buddy

public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup


parent, int viewType) {
if(viewType == VIEW_TYPE_SENT){
return new SentMessageViewHolder(
SentMessageContainerBinding.inflate(

LayoutInflater.from(parent.getContext()),parent,false
)
);
}else {
return new ReceivedMessageViewHolder(
RecievedMessageContainerBinding.inflate(

LayoutInflater.from(parent.getContext()),parent,false
)
);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,
int position) {

if(getItemViewType(position) == VIEW_TYPE_SENT){

((SentMessageViewHolder)holder).setData(chatMessages.get(position));
}else{

((ReceivedMessageViewHolder)holder).setData(chatMessages.get(position),
receiverProfileImage);
}
}

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

@Override
public int getItemViewType(int position) {
if(chatMessages.get(position).senderId.equals(senderId)){
return VIEW_TYPE_SENT;
}else {
return VIEW_TYPE_RECEIVED;
}
}

static class SentMessageViewHolder extends RecyclerView.ViewHolder{

//using binding layout final automatic connected with java file


private final SentMessageContainerBinding binding;

SentMessageViewHolder(SentMessageContainerBinding
sentMessageContainerBinding){
super(sentMessageContainerBinding.getRoot());
binding=sentMessageContainerBinding;
}

void setData(ChatMessage chatMessage){


talk Buddy

String toLanguageCode = Locale.getDefault().getLanguage();

String fromLanguageCode = TranslateLanguage.ENGLISH;


TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(fromLanguageCode)
.setTargetLanguage(toLanguageCode)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new
DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {
// Model downloaded successfully. Okay
to start translating.
// (Set a flag, unhide the translation
UI, etc.)
Log.d("FromSource",
String.valueOf(fromLanguageCode));
Log.d("toSource",
String.valueOf(toLanguageCode));
//
translateTV.setText("Translation...");
if(chatMessage==null ||
chatMessage.message==null){
return;
}

englishGermanTranslator.translate(chatMessage.message).addOnSuccessListener
(new OnSuccessListener<String>() {
@Override
public void onSuccess(String s) {
binding.TextMessage.setText(s);

binding.TextDateTime.setText(chatMessage.dateTime);
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
//
message.put(Constants.KEY_MESSAGE,trans);
}
}
).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Toast.makeText(this, "Failed
to Translate!! try again", Toast.LENGTH_SHORT).show();
}
});
}
})
talk Buddy

.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or
other internal error.
// ...
}
});

static class ReceivedMessageViewHolder extends RecyclerView.ViewHolder{

private final RecievedMessageContainerBinding binding;

ReceivedMessageViewHolder(RecievedMessageContainerBinding
recievedMessageContainerBinding){
super(recievedMessageContainerBinding.getRoot());
binding=recievedMessageContainerBinding;
}

void setData(ChatMessage chatMessage,Bitmap receiverProfileImage){


String toLanguageCode = Locale.getDefault().getLanguage();

String fromLanguageCode = TranslateLanguage.ENGLISH;


TranslatorOptions options =
new TranslatorOptions.Builder()
.setSourceLanguage(fromLanguageCode)
.setTargetLanguage(toLanguageCode)
.build();
final Translator englishGermanTranslator =
Translation.getClient(options);
DownloadConditions conditions = new
DownloadConditions.Builder()
.requireWifi()
.build();
englishGermanTranslator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener< Void>() {
@Override
public void onSuccess(Void v) {
// Model downloaded successfully. Okay
to start translating.
// (Set a flag, unhide the translation
UI, etc.)
Log.d("FromSource",
String.valueOf(fromLanguageCode));
Log.d("toSource",
String.valueOf(toLanguageCode));
//
translateTV.setText("Translation...");
if(chatMessage==null ||
chatMessage.message==null){
return;
}
talk Buddy

englishGermanTranslator.translate(chatMessage.message).addOnSuccessListener
(new OnSuccessListener<String>() {
@Override
public void onSuccess(String s) {
binding.TextMessage.setText(s);

binding.TextDateTime.setText(chatMessage.dateTime);
if(receiverProfileImage!=null){

binding.ImageProfile.setImageBitmap(receiverProfileImage);
}
// translateTV.setText(s);
//
trans=translateTV.getText().toString();
// HashMap<String, Object> message =
new HashMap<>();
//
message.put(Constants.KEY_MESSAGE,trans);
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Toast.makeText(this, "Failed
to Translate!! try again", Toast.LENGTH_SHORT).show();
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void
onFailure(@androidx.annotation.NonNull Exception e) {
// Model couldn’t be downloaded or
other internal error.
// ...
}
});
}

// private void translateText(String fromLanguageCode, String


toLanguageCode, String source) {
// TranslatorOptions options =
// new TranslatorOptions.Builder()
// .setSourceLanguage(fromLanguageCode)
// .setTargetLanguage(toLanguageCode)
// .build();
// final Translator englishGermanTranslator =
// Translation.getClient(options);
// DownloadConditions conditions = new DownloadConditions.Builder()
// .requireWifi()
talk Buddy

// .build();
// englishGermanTranslator.downloadModelIfNeeded(conditions)
// .addOnSuccessListener(
// new OnSuccessListener< Void>() {
// @Override
// public void onSuccess(Void v) {
// // Model downloaded successfully. Okay to
start translating.
// // (Set a flag, unhide the translation
UI, etc.)
// Log.d("FromSource",
String.valueOf(fromLanguageCode));
// Log.d("toSource",
String.valueOf(toLanguageCode));
//
englishGermanTranslator.translate(source).addOnSuccessListener(new
OnSuccessListener<String>() {
// @Override
// public void onSuccess(String s) {
//
// }
// }).addOnFailureListener(new
OnFailureListener() {
// @Override
// public void onFailure(@NonNull
Exception e) {
//
// }
// });
// }
// })
// .addOnFailureListener(
// new OnFailureListener() {
// @Override
// public void onFailure(@NonNull Exception e) {
// // Model couldn’t be downloaded or other
internal error.
// // ...
// }
// });
// }
//
// private String getLanguageCode(String language)
// {
// String languageCode = String.valueOf(0);
// switch (language){
// case "English":
// languageCode = TranslateLanguage.ENGLISH;
// break;
// case "Afrikaans":
// languageCode = TranslateLanguage.AFRIKAANS;
// break;
// case "Arabic":
// languageCode = TranslateLanguage.ARABIC;
// break;
// case "Belarusin":
// languageCode = TranslateLanguage.BELARUSIAN;
// break;
// case "Bulgarian":
// languageCode = TranslateLanguage.BULGARIAN;
// break;
talk Buddy

// case "Bengali":
// languageCode = TranslateLanguage.BENGALI;
// break;
// case "Catalan":
// languageCode = TranslateLanguage.CATALAN;
// break;
// case "Czech":
// languageCode = TranslateLanguage.CZECH;
// break;
// case "Welsh":
// languageCode = TranslateLanguage.WELSH;
// break;
// case "Hindi":
// languageCode = TranslateLanguage.HINDI;
// break;
// case "urdu":
// languageCode = TranslateLanguage.URDU;
// break;
// default:
// languageCode = "From";
// }
// return languageCode;
// }

}
Recent Chat Adapter.
package com.example.talkbuddy.adapters;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.talkbuddy.databinding.UserDetailsRecentChatBinding;
import com.example.talkbuddy.listeners.ConversionListeners;
import com.example.talkbuddy.models.ChatMessage;
import com.example.talkbuddy.models.User;

import java.util.List;

public class RecentConversionAdapter extends


RecyclerView.Adapter<RecentConversionAdapter.ConversionViewHolder>{

private final List<ChatMessage> chatMessages;


private final ConversionListeners conversionListeners;

public RecentConversionAdapter(List<ChatMessage>
chatMessages,ConversionListeners conversionListeners) {
this.chatMessages = chatMessages;
this.conversionListeners=conversionListeners;
}

@NonNull
@Override
public ConversionViewHolder onCreateViewHolder(@NonNull ViewGroup
parent, int viewType) {
talk Buddy

return new
ConversionViewHolder(UserDetailsRecentChatBinding.inflate(LayoutInflater.fr
om(parent.getContext()),parent,false));
}

@Override
public void onBindViewHolder(@NonNull ConversionViewHolder holder, int
position) {
holder.setData(chatMessages.get(position));
}

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

class ConversionViewHolder extends RecyclerView.ViewHolder{

UserDetailsRecentChatBinding binding;
ConversionViewHolder(UserDetailsRecentChatBinding
userDetailsRecentChatBinding){
super(userDetailsRecentChatBinding.getRoot());
binding=userDetailsRecentChatBinding;
}

void setData(ChatMessage chatMessage){

binding.ProfileImage.setImageBitmap(getConversionImage(chatMessage.conversi
onImage));
binding.TextName.setText(chatMessage.conversionName);
binding.textRecentMessage.setText(chatMessage.message);
binding.getRoot().setOnClickListener(v -> {
User user= new User();
user.id=chatMessage.conversionId;
user.name=chatMessage.conversionName;
user.image=chatMessage.conversionImage;
conversionListeners.onConversionClicked(user);
});
}

}
private Bitmap getConversionImage(String encodedImage){
byte[] bytes= Base64.decode(encodedImage,Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bytes,0,bytes.length);
}
}
User Adapter.
package com.example.talkbuddy.adapters;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.talkbuddy.databinding.UserDetailsBinding;
import com.example.talkbuddy.listeners.UserListener;
talk Buddy

import com.example.talkbuddy.models.User;

import java.util.List;

public class UsersAdapter extends


RecyclerView.Adapter<UsersAdapter.UserViewHolder>{

private final List<User> users;


private final UserListener userListener;

public UsersAdapter(List<User> users,UserListener userListener) {

this.users = users;
this.userListener=userListener;
}

@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
viewType) {
UserDetailsBinding
userDetailsBinding=UserDetailsBinding.inflate(LayoutInflater.from(parent.ge
tContext()),parent,false);

return new UserViewHolder(userDetailsBinding);


}

@Override
public void onBindViewHolder(@NonNull UserViewHolder holder, int
position) {

holder.SetUserData(users.get(position));
}

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

//Decode Image
private Bitmap getUserImage(String encodedImage){
byte[] bytes= Base64.decode(encodedImage,Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bytes,0,bytes.length);
}

class UserViewHolder extends RecyclerView.ViewHolder{

///connect userdetail layout using binding


UserDetailsBinding binding;
UserViewHolder(UserDetailsBinding userDetailsBinding){
super(userDetailsBinding.getRoot());
binding=userDetailsBinding;
}

//setuser data on row


void SetUserData(User user){
binding.TextName.setText(user.name);
binding.MobileNumber.setText(user.mobileNumber);
talk Buddy

binding.ProfileImage.setImageBitmap(getUserImage(user.image));
binding.getRoot().setOnClickListener(v ->
userListener.onUserClicked(user));
}

}
Firebase Message Service.
package com.example.talkbuddy.firebase;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

import com.example.talkbuddy.R;
import com.example.talkbuddy.activities.ChatActivity;
import com.example.talkbuddy.models.User;
import com.example.talkbuddy.utilities.Constants;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import java.util.Random;

public class MessageService extends FirebaseMessagingService {

@Override
public void onNewToken(@NonNull String token) {
super.onNewToken(token);

@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);

User user=new User();


user.id=remoteMessage.getData().get(Constants.KEY_USER_ID);
user.name=remoteMessage.getData().get(Constants.KEY_NAME);
user.token=remoteMessage.getData().get(Constants.KEY_FCM_TOKEN);

int notificationId= new Random().nextInt();


String channelId=" chat_message";

Intent intent =new Intent(this, ChatActivity.class);


intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(Constants.KEY_USER,user);
PendingIntent
pendingIntent=PendingIntent.getActivity(this,0,intent,0);

NotificationCompat.Builder builder=new
NotificationCompat.Builder(this,channelId);
talk Buddy

builder.setSmallIcon(R.drawable.ic_notification);
builder.setContentTitle(user.name);

builder.setContentText(remoteMessage.getData().get(Constants.KEY_MESSAGE));
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(
remoteMessage.getData().get(Constants.KEY_MESSAGE)

));
builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);

if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.O){
CharSequence channelName="Chat Message";
String channelDiscription="This notification channel is used
for chat message notification";
int importance= NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new
NotificationChannel(channelId,channelName,importance);
channel.setDescription(channelDiscription);
NotificationManager
notificationManager=getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}

NotificationManagerCompat
notificationManagerCompat=NotificationManagerCompat.from(this);
notificationManagerCompat.notify(notificationId,builder.build());
}
}
Model Chat Message.
package com.example.talkbuddy.models;

import java.util.Date;

public class ChatMessage {

public String senderId,recieverId,message,dateTime;


public Date date;

public String conversionId,conversionName,conversionImage;


}
Model User.
package com.example.talkbuddy.models;

import java.io.Serializable;

public class User implements Serializable {


public String mobileNumber,name,image,token,id;

Network Api client.


package com.example.talkbuddy.network;

import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
talk Buddy

public class ApiClient {

private static Retrofit retrofit=null;

public static Retrofit getClient(){


if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl("https://fcm.googleapis.com/fcm/")
.addConverterFactory(ScalarsConverterFactory.create())
.build();
}
return retrofit;

}
}
API service.
package com.example.talkbuddy.network;

import java.util.HashMap;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.HeaderMap;
import retrofit2.http.POST;

public interface ApiService {

@POST("send")
Call<String> sendMessage(@HeaderMap HashMap<String,String> headers,
@Body String messageBody);
}

Conversion Listener.
package com.example.talkbuddy.listeners;

import com.example.talkbuddy.models.User;

public interface ConversionListeners {

void onConversionClicked(User user);


}
User Listener.
package com.example.talkbuddy.listeners;

import com.example.talkbuddy.models.User;

public interface UserListener {

void onUserClicked(User user);


}
Constant.
package com.example.talkbuddy.utilities;
talk Buddy

import java.util.HashMap;

public class Constants {

public static final String KEY_COLLECTION_USERS="Users";


public static final String KEY_NAME="Name";
public static final String KEY_PHONENUMBER="phoneNumber";
public static final String KEY_PASSWORD="Password";
public static final String KEY_PREFERENCE_NAME="ChatAppPreference";
public static final String KEY_IS_SIGNED_IN="IsSignedIn";
public static final String KEY_USER_ID="UserId";
public static final String KEY_IMAGE="Image";

public static final String KEY_FCM_TOKEN="FcmToken";

public static final String KEY_USER = "user";

public static final String KEY_CHAT_COLLECTION = "chat";


public static final String KEY_SENDER_ID = "senderId";
public static final String KEY_RECEIVER_ID = "receiverId";
public static final String KEY_MESSAGE = "message";
public static final String KEY_TIME = "time";

public static final String KEY_COLLECTION_CONVERSATIONS =


"conversations";
public static final String KEY_SENDER_NAME = "sendername";
public static final String KEY_RECEIVER_NAME = "receivername";
public static final String KEY_SENDER_IMAGE = "senderimage";
public static final String KEY_RECEIVER_IMAGE = "receiverimage";
public static final String KEY_LAST_MESSAGE = "lastmessage";
public static final String KEY_AVAILABILITY = "availability";
public static final String MSG_AUTHORIZATION = "authorization";
public static final String MSG_CONTENT_TYPE = "content_type";
public static final String MSG_DATA = "data";
public static final String MSG_REGISTRATION_IDS = "registration_ids";

public static HashMap<String,String> msgHeaders=null;

public static HashMap<String,String> getMsgHeaders(){


if(msgHeaders==null){
msgHeaders=new HashMap<>();

msgHeaders.put(MSG_AUTHORIZATION,"key=AAAADv9FqDg:APA91bGos_gyWa7xTssTtUMYU
_LkZwkkJJo29sdctPHPhtvVQVLJkb-
p6lsvBoo4hIM3Ml6jShmCXElbVUipqmKFbefoJsBPAM7NzRna-u3_53AdN-
Ly6LmjeBhtf6_nX1mMGbfxWppy");
msgHeaders.put(MSG_CONTENT_TYPE,"application/json");

}
talk Buddy

return msgHeaders;
}

}
Preference Manager.
package com.example.talkbuddy.utilities;

import android.content.Context;
import android.content.SharedPreferences;

public class PreferencesManager {

private SharedPreferences sharedPreferences;

public PreferencesManager(Context context){


//set preference when object is created

sharedPreferences=context.getSharedPreferences(Constants.KEY_PREFERENCE_NAM
E,context.MODE_PRIVATE);
}

public void putBoolean(String key,Boolean value){


SharedPreferences.Editor editor= sharedPreferences.edit();
editor.putBoolean(key,value);
editor.apply();
}

public boolean getBoolean(String key){


return sharedPreferences.getBoolean(key,false);
}

public void putString(String key,String value){


SharedPreferences.Editor editor= sharedPreferences.edit();
editor.putString(key,value);
editor.apply();
}

public String getString(String key){


return sharedPreferences.getString(key,null);
}

public void clear(){

SharedPreferences.Editor editor= sharedPreferences.edit();


editor.clear();
editor.apply();
}
}

You might also like