我有点困惑,需要一些帮助来解决这个小问题。我已经创建了聊天活动,但是我不确定为什么在键入消息并单击“发送”时,消息没有存储在数据库中。我已经提到了代码。请尽量不要与聊天室的名称混淆,我之所以这样命名,是因为我不想创建聊天室。我只想直接从数据库中选择一个用户并向他们发送消息。让我知道是否需要对代码进行任何其他更改才能实现此目的。
Chat.java
package com.example.firestoretest;
public class Chat {
private String id;
private String senderId;
private String message;
private long sent;
public Chat(String id, String chatRoomId, String senderId, String message, long sent) {
this.id = id;
this.senderId = senderId;
this.message = message;
this.sent = sent;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSenderId() {
return senderId;
}
public void setSenderId(String senderId) {
this.senderId = senderId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public long getSent() {
return sent;
}
public void setSent(long sent) {
this.sent = sent;
}
}
ChatRoom.java
package com.example.firestoretest;
public class ChatRoom {
private String id;
private String name;
public ChatRoom(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ChatRoomActivity.java
package com.example.firestoretest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;
public class ChatRoomActivity extends AppCompatActivity {
public static final String CHAT_ROOM_ID = "CHAT_ROOM_ID";
public static final String CHAT_ROOM_NAME = "CHAT_ROOM_NAME";
private static final String CURRENT_USER_KEY = "CURRENT_USER_KEY";
private String userId = "";
private String userName = "";
private ChatRoomRepository chatRoomRepository;
private EditText message;
private ImageButton send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_room);
Bundle extras = getIntent().getExtras();
if (extras != null) {
userId = extras.getString(CHAT_ROOM_ID, "");
userName = extras.getString(CHAT_ROOM_NAME, "");
chatRoomRepository = new ChatRoomRepository(FirebaseFirestore.getInstance());
userId = getCurrentUserKey();
initUI();
}
if (getSupportActionBar() != null) {
setTitle(userName);
}
}
private String getCurrentUserKey() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
return preferences.getString(CURRENT_USER_KEY, "");
}
private void initUI() {
message = findViewById(R.id.message_text);
send = findViewById(R.id.send_message);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (message.getText().toString().isEmpty()) {
Toast.makeText(
ChatRoomActivity.this,
getString(R.string.error_empty_message),
Toast.LENGTH_SHORT
).show();
} else {
addMessageToChatRoom();
}
}
});
}
private void addMessageToChatRoom() {
String chatMessage = message.getText().toString();
message.setText("");
send.setEnabled(false);
chatRoomRepository.addMessageToChatRoom(
userId,
chatMessage,
new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
send.setEnabled(true);
}
},
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
send.setEnabled(true);
Toast.makeText(
ChatRoomActivity.this,
getString(R.string.error_message_failed),
Toast.LENGTH_SHORT
).show();
}
}
);
}
}
ChatRoomRepository.java
package com.example.firestoretest;
import androidx.annotation.NonNull;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.HashMap;
import java.util.Map;
public class ChatRoomRepository {
private static final String TAG = "ChatRoomRepo";
private FirebaseFirestore db;
public ChatRoomRepository(FirebaseFirestore db) {
this.db = db;
}
public void createRoom(String name,
final OnSuccessListener<DocumentReference> successCallback,
final OnFailureListener failureCallback) {
Map<String, Object> room = new HashMap<>();
room.put("name", name);
db.collection("rooms")
.add(room)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
successCallback.onSuccess(documentReference);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
failureCallback.onFailure(e);
}
});
}
public void getRooms(EventListener<QuerySnapshot> listener) {
db.collection("users")
.orderBy("name")
.addSnapshotListener(listener);
}
public void addMessageToChatRoom(String senderId,
String message,
final OnSuccessListener<DocumentReference> successCallback,
final OnFailureListener failureCallback) {
Map<String, Object> chat = new HashMap<>();
chat.put("sender_id", senderId);
chat.put("message", message);
chat.put("sent", System.currentTimeMillis());
db.collection("chats")
.add(chat)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
successCallback.onSuccess(documentReference);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
failureCallback.onFailure(e);
}
});
}
}
ChatsRoomAdapter.java
package com.example.firestoretest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class ChatRoomsAdapter extends RecyclerView.Adapter<ChatRoomsAdapter.ChatRoomViewHolder> {
private List<ChatRoom> chatRooms;
public ChatRoomsAdapter(List<ChatRoom> chatRooms) {
this.chatRooms = chatRooms;
}
@Override
public ChatRoomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.item_chat_room,
parent,
false
);
return new ChatRoomViewHolder(view);
}
@Override
public void onBindViewHolder(ChatRoomViewHolder holder, int position) {
holder.bind(chatRooms.get(position));
}
@Override
public int getItemCount() {
return chatRooms.size();
}
class ChatRoomViewHolder extends RecyclerView.ViewHolder {
TextView name;
ChatRoom chatRoom;
public ChatRoomViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.item_chat_room_name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(),ChatRoomActivity.class);
v.getContext().startActivity(intent);
}
});
}
public void bind(ChatRoom chatRoom) {
this.chatRoom = chatRoom;
name.setText(chatRoom.getName());
}
}
}
ChatsAdapter.java
package com.example.firestoretest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class ChatsAdapter extends RecyclerView.Adapter<ChatsAdapter.ChatViewHolder> {
private static final int SENT = 0;
private static final int RECEIVED = 1;
private String userId;
private List<Chat> chats;
public ChatsAdapter(List<Chat> chats, String userId) {
this.chats = chats;
this.userId = userId;
}
@Override
public ChatViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == SENT) {
view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.item_chat_sent,
parent,
false
);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.item_chat_received,
parent,
false);
}
return new ChatViewHolder(view);
}
@Override
public void onBindViewHolder(ChatViewHolder holder, int position) {
holder.bind(chats.get(position));
}
@Override
public int getItemViewType(int position) {
if (chats.get(position).getSenderId().contentEquals(userId)) {
return SENT;
} else {
return RECEIVED;
}
}
@Override
public int getItemCount() {
return chats.size();
}
class ChatViewHolder extends RecyclerView.ViewHolder {
TextView message;
public ChatViewHolder(View itemView) {
super(itemView);
message = itemView.findViewById(R.id.chat_message);
}
public void bind(Chat chat) {
message.setText(chat.getMessage());
}
}
}
MainActivity.java
package com.example.firestoretest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String CURRENT_USER_KEY = "CURRENT_USER_KEY";
AuthenticationRepository authentication;
ChatRoomRepository chatRoomRepository;
private RecyclerView chatRooms;
private ChatRoomsAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
authentication = new AuthenticationRepository(FirebaseFirestore.getInstance());
chatRoomRepository = new ChatRoomRepository(FirebaseFirestore.getInstance());
authenticate();
initUI();
getChatRooms();
}
private void getChatRooms() {
chatRoomRepository.getRooms(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot snapshots, FirebaseFirestoreException e) {
if (e != null) {
Log.e("MainActivity", "Listen failed.", e);
return;
}
List<ChatRoom> rooms = new ArrayList<>();
for (QueryDocumentSnapshot doc : snapshots) {
rooms.add(new ChatRoom(doc.getId(), doc.getString("name")));
}
adapter = new ChatRoomsAdapter(rooms);
chatRooms.setAdapter(adapter);
}
});
}
private void initUI() {
chatRooms = findViewById(R.id.rooms);
chatRooms.setLayoutManager(new LinearLayoutManager(this));
}
private void authenticate() {
String currentUserKey = getCurrentUserKey();
if (currentUserKey.isEmpty()) {
authentication.createNewUser(
new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
saveCurrentUserKey(documentReference.getId());
Toast.makeText(MainActivity.this, "New user created", Toast.LENGTH_SHORT).show();
}
},
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(
MainActivity.this,
"Error creating user. Check your internet connection",
Toast.LENGTH_SHORT)
.show();
}
}
);
} else {
authentication.login(
currentUserKey,
new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Toast.makeText(MainActivity.this, "Logged in", Toast.LENGTH_SHORT).show();
}
},
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(
MainActivity.this,
"Error signing in. Check your internet connection",
Toast.LENGTH_SHORT)
.show();
}
}
);
}
}
private String getCurrentUserKey() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
return preferences.getString(CURRENT_USER_KEY, "");
}
private void saveCurrentUserKey(String key) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(CURRENT_USER_KEY, key);
editor.apply();
}
}