public class ChatAdapter extends RecyclerView.Adapter {
ArrayList<MessageModel> messageModels;
Context context;
String receiverId;
// Log tag for easier identification of logs related to ChatAdapter
public ChatAdapter(ArrayList<MessageModel> messageModels, Context context) {
this.messageModels = messageModels;
this.context = context;
}
public ChatAdapter(ArrayList<MessageModel> messageModels, Context context, String receiverId) {
this.messageModels = messageModels;
this.context = context;
this.receiverId = receiverId;
}
int Sender_View_Type = 1;
int Reciver_View_Type = 2;
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d("chatAdepter", "onCreateViewHolder called with viewType: " + viewType);
if (viewType == Sender_View_Type) {
View view = LayoutInflater.from(context).inflate(R.layout.layout_sender, parent, false);
return new SenderViewHolder(view);
} else {
View view = LayoutInflater.from(context).inflate(R.layout.layout_reciver, parent, false);
return new ReciverViewHolder(view);
}
}
@Override
public int getItemViewType(int position) {
Log.d("chatAdepter", "getItemViewType called for position: " + position);
if (messageModels.get(position).getuId().equals(FirebaseAuth.getInstance().getUid())) {
return Sender_View_Type;
} else {
return Reciver_View_Type;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MessageModel messageModel = messageModels.get(position);
Log.d("chatAdepter", "onBindViewHolder called for position: " + position + ", message: " + messageModel.getMessage());
if (messageModel == null) {
Log.e("chatAdepter", "MessageModel is null at position: " + position);
return; // Skip if messageModel is null
}
long timestamp = messageModel.getTimestemp();
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a", Locale.getDefault());
String time = sdf.format(new Date(timestamp));
if (holder.getClass() == SenderViewHolder.class) {
((SenderViewHolder) holder).senderMsg.setText(messageModel.getMessage());
((SenderViewHolder) holder).senderTime.setText(time);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
Log.d("chatAdepter", "Sender message long-clicked. Message: " + messageModel.getMessage());
new AlertDialog.Builder(context).setTitle("Delete Message?")
.setItems(new CharSequence[]{"Delete", "Delete for Everyone", "Cancel"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
String senderRoom = FirebaseAuth.getInstance().getUid() + receiverId;
String receiverRoom = receiverId+ FirebaseAuth.getInstance().getUid();
switch (i) {
case 0:
Log.d("chatAdepter", "Delete option selected for message: " + messageModel.getMessage());
database.getReference().child("Chats").child(senderRoom).child(messageModel.getMessageId()).removeValue();
break;
case 1:
Log.d("chatAdepter", "Delete for Everyone option selected for message: " + messageModel.getMessage());
database.getReference().child("Chats").child(senderRoom).child(messageModel.getMessageId()).removeValue();
database.getReference().child("Chats").child(receiverRoom).child(messageModel.getMessageId()).removeValue();
break;
case 2: // Cancel
Log.d("chatAdepter", "Cancel option selected");
dialogInterface.dismiss();
break;
}
}
}).show();
return true;
}
});
} else {
((ReciverViewHolder) holder).reciverMsg.setText(messageModel.getMessage());
((ReciverViewHolder) holder).reciverTime.setText(time);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
Log.d("chatAdepter", "Receiver message long-clicked. Message: " + messageModel.getMessage());
new AlertDialog.Builder(context).setTitle("Delete Message")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
String senderRoom = FirebaseAuth.getInstance().getUid() + receiverId;
Log.d("chatAdepter", "Delete option selected for receiver message: " + messageModel.getMessage());
database.getReference().child("Chats").child(senderRoom).child(messageModel.getMessageId()).setValue(null);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.d("chatAdepter", "Cancel delete for receiver message.");
dialogInterface.dismiss();
}
}).show();
return false;
}
});
}
}
@Override
public int getItemCount() {
return messageModels.size();
}
public class ReciverViewHolder extends RecyclerView.ViewHolder {
TextView reciverMsg, reciverTime;
public ReciverViewHolder(@NonNull View itemView) {
super(itemView);
reciverMsg = itemView.findViewById(R.id.receiver_message_text);
reciverTime = itemView.findViewById(R.id.receiver_message_time);
}
}
public class SenderViewHolder extends RecyclerView.ViewHolder {
TextView senderMsg, senderTime;
public SenderViewHolder(@NonNull View itemView) {
super(itemView);
senderMsg = itemView.findViewById(R.id.sender_message_text);
senderTime = itemView.findViewById(R.id.sender_message_time);
}
}
}
When I click "Delete for Everyone" in my chat application, the message is only deleted on the sender's side. It does not get deleted on the receiver's side.
package com.Adepter;
import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView;
import com.Model.MessageModel; import com.Model.User; import com.example.chatapp.R; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.FirebaseDatabase;
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale;
public class ChatAdapter extends RecyclerView.Adapter {
}
When I click "Delete for Everyone" in my chat application, the message is only deleted on the sender's side. It does not get deleted on the receiver's side.