Talk Buddy
Talk Buddy
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;
binding=ActivitySignInBinding.inflate(getLayoutInflater());//inflater use
for take layout from view
setContentView(binding.getRoot());
binding.TextCreateNewAccount.setOnClickListener(view ->
startActivity(new
Intent(getApplicationContext(),SignUpActivity.class)));
binding.SignInButton.setOnClickListener(view -> {
if(isValidSignInDetails())
SignIn();
});
}
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 ShowToast(String message){
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
}
}
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;
@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();
}
i_set_image.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
PickImage.launch(i_set_image);
}
talk Buddy
});
}
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());
});
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);
InputStream
inputStream=getContentResolver().openInputStream(imageUri);
Bitmap bitmap=
BitmapFactory.decodeStream(inputStream);
binding.ProfileImage.setImageBitmap(bitmap);
binding.TextAddImage.setVisibility(View.GONE);
EncodedImage=EncodeImage(bitmap);
);
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;
}
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;
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();
}
});
}
}
}
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;
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);
}
});
fromAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdow
n_item);
fromSpinner.setAdapter(fromAdapter);
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) {
})
.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
conversion.put(Constants.KEY_LAST_MESSAGE,s);
}
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
@Override
public void onFailure(@NonNull Call<String> call, @NonNull
Throwable t) {
ShowToast(t.getMessage());
}
});
}
chatAdapter.setReceiverProfileImage(getBitmapFromEncodedString(reciverUser.
image));
chatAdapter.notifyItemRangeChanged(0,
chatmessage.size());
}
}
if (isReceiverAvailable) {
binding.UserAvailability.setVisibility(View.VISIBLE);
} else {
binding.UserAvailability.setVisibility(View.GONE);
}
});
}
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();
}
};
database.collection(Constants.KEY_COLLECTION_CONVERSATIONS).document(conver
sionId);
documentReference.update(
Constants.KEY_LAST_MESSAGE, message,
Constants.KEY_TIME, new Date()
);
}
checkConversionRemote(preferencesManager.getString(Constants.KEY_USER_ID),
reciverUser.id);
checkConversionRemote(reciverUser.id,
preferencesManager.getString(Constants.KEY_USER_ID));
}
}
};
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));
}
}
}
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.
// ...
}
});
}
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;
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();
}
{
@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);
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);
}
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
};
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"));
}
@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;
@NonNull
@Override
talk Buddy
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;
}
}
SentMessageViewHolder(SentMessageContainerBinding
sentMessageContainerBinding){
super(sentMessageContainerBinding.getRoot());
binding=sentMessageContainerBinding;
}
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.
// ...
}
});
ReceivedMessageViewHolder(RecievedMessageContainerBinding
recievedMessageContainerBinding){
super(recievedMessageContainerBinding.getRoot());
binding=recievedMessageContainerBinding;
}
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.
// ...
}
});
}
// .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 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();
}
UserDetailsRecentChatBinding binding;
ConversionViewHolder(UserDetailsRecentChatBinding
userDetailsRecentChatBinding){
super(userDetailsRecentChatBinding.getRoot());
binding=userDetailsRecentChatBinding;
}
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;
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);
@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);
}
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;
@Override
public void onNewToken(@NonNull String token) {
super.onNewToken(token);
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
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;
import java.io.Serializable;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
talk Buddy
}
}
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;
@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;
import com.example.talkbuddy.models.User;
import java.util.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;
sharedPreferences=context.getSharedPreferences(Constants.KEY_PREFERENCE_NAM
E,context.MODE_PRIVATE);
}