I have a messaging app. I am using firebase real time database in my application. Sometimes messages are not delivered instantly due to internet speed. When this happens, I want the user's message to appear on the screen with a dark background. When the message is delivered, I want the message to have a blue background. How can I do that ?
ChatActivity :
private final List<Messages> messagesList = new ArrayList<>();
private MessagesAdapter messagesAdapter;
RecyclerView usermessageslist;
messagesAdapter = new MessagesAdapter(messagesList);
usermessageslist = findViewById(R.id.message_list_user);
linearLayoutManager = new LinearLayoutManager(this);
usermessageslist.setHasFixedSize(true);
usermessageslist.setLayoutManager(linearLayoutManager);
usermessageslist.setAdapter(messagesAdapter);
public void getchat(){
Rootref.child("message").child(messageSenderID).child(messageReceiverID).limitToLast(currentpage * total_ITEMS)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull final DataSnapshot dataSnapshot, @Nullable String s) {
try {
Messages messages = dataSnapshot.getValue(Messages.class);
itemPos++;
if(itemPos == 1){
String messageKey = dataSnapshot.getKey();
mLastKey = messageKey;
mPrevKey = messageKey;
}
messagesList.add(messages);
messagesAdapter.notifyDataSetChanged();
usermessageslist.smoothScrollToPosition(usermessageslist.getAdapter().getItemCount());
usermessageslist.scrollToPosition(messagesList.size() - 1);
}catch (Exception e){
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
chatreflesh.setRefreshing(false);
}
private void SendMessage() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
final String messageText = messageınputtext.getText().toString();
if (TextUtils.isEmpty(messageText)){
}
else {
String messagesenderref ="message/" + messageSenderID + "/" + messageReceiverID;
String messagereceiverref ="message/" + messageReceiverID + "/" + messageSenderID;
DatabaseReference usermessagekeyref = Rootref.child("message")
.child(messageSenderID).child(messageReceiverID).push();
String messagepushid = usermessagekeyref.getKey();
Calendar calFordDate = Calendar.getInstance();
SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
saveCurrentDate = currentDate.format(calFordDate.getTime());
Calendar calFordTime = Calendar.getInstance();
SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm aa");
saveCurrentTime = currentTime.format(calFordTime.getTime());
Map messageTextBody = new HashMap();
messageTextBody.put("message" , messageText);
messageTextBody.put("time" , saveCurrentTime);
messageTextBody.put("date" , saveCurrentDate);
messageTextBody.put("type" , "text");
messageTextBody.put("from" , messageSenderID);
Map messageBodyDetails = new HashMap();
messageBodyDetails.put(messagesenderref + "/" + messagepushid , messageTextBody);
messageBodyDetails.put(messagereceiverref + "/" + messagepushid , messageTextBody);
Rootref.updateChildren(messageBodyDetails).addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()){
}
else {
String message = task.getException().getMessage();
Toast.makeText(context, "Error :" + message , Toast.LENGTH_SHORT).show();
}
}
});
MessagesAdapter:
public class MessagesAdapter extends RecyclerView.Adapter<MessagesAdapter.MessageViewHolder> {
private List<Messages> userMessagesList;
private FirebaseAuth mAuth;
String messageSenderID ;
public MessagesAdapter(List<Messages> userMessagesList ){
this.userMessagesList = userMessagesList;
}
public class MessageViewHolder extends RecyclerView.ViewHolder{
public TextView SenderMessageText , ReceiverMessageText , receiver_time , sender_time , txt_seen , datechat;
public MessageViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = getAdapterPosition();
}
});
SenderMessageText = itemView.findViewById(R.id.sender_message_text);
ReceiverMessageText = itemView.findViewById(R.id.receiver_message_text);
receiver_time = itemView.findViewById(R.id.receiver_time);
datechat = itemView.findViewById(R.id.datechat);
txt_seen = itemView.findViewById(R.id.txt_seen);
sender_time = itemView.findViewById(R.id.sender_time);
}
}
@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull final ViewGroup viewGroup,final int i) {
View view =LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.message_model,viewGroup,false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MessageViewHolder messageViewHolder, final int i) {
// FirebaseUser mFirebaseUser = mAuth.getCurrentUser();
// if(mFirebaseUser != null) {
// messageSenderID = mFirebaseUser.getUid(); //Do what you need to do with the id
// }
String messageSenderID =mAuth.getCurrentUser().getUid();
Messages messages = userMessagesList.get(i);
String fromUserID = messages.getFrom();
String fromMessageType = messages.getType();
messageViewHolder.SenderMessageText.setEnabled(true);
messageViewHolder.ReceiverMessageText.setVisibility(View.INVISIBLE);
messageViewHolder.SenderMessageText.setVisibility(View.INVISIBLE);
if (fromUserID.equals(messageSenderID)){
messageViewHolder.SenderMessageText.setVisibility(View.VISIBLE);
messageViewHolder.SenderMessageText.setBackgroundResource(R.drawable.sendermessage);
messageViewHolder.SenderMessageText.setTextColor(Color.WHITE);
messageViewHolder.SenderMessageText.setText(messages.getMessage());
messageViewHolder.txt_seen.setVisibility(View.VISIBLE);
if (i == userMessagesList.size()-1){
messageViewHolder.txt_seen.setText("Delivered");
} else {
messageViewHolder.txt_seen.setVisibility(View.GONE);
}
}else {
messageViewHolder.ReceiverMessageText.setVisibility(View.VISIBLE);
messageViewHolder.ReceiverMessageText.setBackgroundResource(R.drawable.receivermessage);
messageViewHolder.ReceiverMessageText.setText(messages.getMessage());
messageViewHolder.txt_seen.setVisibility(View.GONE);
}
messageViewHolder.datechat.setText(messages.getDate());
if(i == 0){
messageViewHolder.datechat.setVisibility(View.VISIBLE);
}else {
Messages previous = userMessagesList.get(i - 1);
if(previous.getDate().equals(messages.getDate())){
messageViewHolder.datechat.setVisibility(View.GONE);
}else{
messageViewHolder.datechat.setVisibility(View.VISIBLE);
}
}
if (fromUserID.equals(messageSenderID)){
}else {
messageViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (userMessagesList.get(i).getType().equals("text")){
CharSequence optıons[] = new CharSequence[]{
"Report Message",
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle(userMessagesList.get(i).getMessage());
builder.setItems(optıons, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
if (which == 0){
AssaultComplaint(i,messageViewHolder);
}
}catch (Exception e){
}
}
});
builder.show();
}
}
});
}
}
@Override
public int getItemCount() {
return userMessagesList.size();
}
}
Messagemodel:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_height="wrap_content">
<TextView
android:layout_marginTop="5dp"
android:textColor="@color/chatdatetextcolor"
android:layout_marginBottom="5dp"
android:textStyle="bold"
android:id="@+id/datechat"
android:textSize="10dp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/receiver_message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/datechat"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_marginStart="3dp"
android:layout_marginLeft="3dp"
android:layout_marginTop="3dp"
android:maxWidth="275dp"
android:padding="10dp"
android:text="receiver messages here"
android:textColor="@color/receivermessagetext"
android:textSize="14sp"
android:textStyle="bold"
/>
<TextView
android:textColor="@color/cardtextbegen"
android:id="@+id/receiver_time"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/receiver_message_text"
android:text=""
android:textSize="10dp"
android:layout_marginTop="2dp"
android:layout_marginLeft="3dp"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_below="@+id/datechat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="@+id/receiver_message_text"
android:layout_marginTop="2dp"
android:layout_marginRight="3dp">
<TextView
android:id="@+id/sender_message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:maxWidth="275dp"
android:padding="10dp"
android:text="sender messagetex"
android:textColor="@color/cardgroundcolor"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/sender_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginRight="3dp"
android:layout_toLeftOf="@id/sender_message_text"
android:text=""
android:textColor="@color/cardtextbegen"
android:textSize="10dp" />
<TextView
android:id="@+id/txt_seen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/sender_message_text"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:textColor="@color/cardtextbegen"
android:textSize="10sp"
android:textStyle="bold">
</TextView>
</RelativeLayout>
</RelativeLayout>
When the user hits the send message button, the message sometimes goes to the database late. Because of internet speed. In such cases, the message written by the user should appear on the screen until the message is sent to the database. The background should be different like this: