0

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:

enter image description here

  • You shared a lot of code and a clear use-case. While it's of course always possible that someone will be able to help you implement that use-case with what you shared already, chances of that will go up drastically if you tell us exactly where in your code you are stuck. Don't you know how to detect if a message was successfully written to the database? Or whether it was read by the other client? Or how to set the colors of the UI? The more focused you can make your question, the better the chances someone can help. – Frank van Puffelen Aug 03 '22 at 14:46
  • @FrankvanPuffelen If a message has been successfully written to the database, it appears on the screen. But when the button is pressed and sent, I want to show that message with a dark background until it is successfully written in the database. i don't know how i can do this. – Muratcan Yıldız Aug 03 '22 at 15:30

0 Answers0