Skorzystałem z pomocy z jedno tutoriali na YT i mój chatFragment wygląda tak. Wszystko działa. Jedyny problem jaki jest to taki, że gdy nie mam łącza z internetem, a wchodzę w chatFragment to lista waidomośći jest oczywiście pusta, kiedy połącze się z internetem to recyclerView nadal jest pusty. Żeby wiadomości się załądowały muszę przełądować fragment tzn. wyjść i wejść z powrotem. Chciałbym to jeszcze naprawić. Co mogę jeszcze zrobić, żeby to bardziej przypominało MVVM?
class ChatFragment : Fragment() {
private val messaging: Messaging by inject()
private val firebaseDatabase = FirebaseDatabase.getInstance()
private val currentUser = FirebaseAuth.getInstance().currentUser!!
private val adapter = GroupAdapter<GroupieViewHolder>()
private lateinit var currentUserData: User
private lateinit var selectedUser: User
private lateinit var fromReferenceDatabase: DatabaseReference
private lateinit var toReferenceDatabase: DatabaseReference
private lateinit var binding: FragmentChatBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment and set adapter for recyclerView
binding = FragmentChatBinding.inflate(inflater)
binding.chatRecyclerView.adapter = adapter
//init variable
selectedUser = arguments!!.getParcelable("selectedUser")!!
fromReferenceDatabase = firebaseDatabase.getReference("user-messages/${currentUser.uid}/${selectedUser.uid}")
toReferenceDatabase = firebaseDatabase.getReference("user-messages/${selectedUser.uid}/${currentUser.uid}")
getCurrentUserData()
listenerForMessages()
sendMessageListener(binding.sendMessageButton)
return binding.root
}
/**
* Get data about current user from firebase
*/
private fun getCurrentUserData(){
FirebaseDatabase.getInstance().getReference("Users").addValueEventListener(object :
ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
for(item in snapshot.children){
currentUserData = item.getValue(User::class.java)!!
}
}
override fun onCancelled(error: DatabaseError) {
messaging.showToast("error", error.message)
}
})
}
/**
* Listen for messages and show in recyclerView
*/
private fun listenerForMessages(){
fromReferenceDatabase.addChildEventListener(object: ChildEventListener{
override fun onChildAdded(dataSnapshot: DataSnapshot, p1: String?) {
val chatMessage = dataSnapshot.getValue(ChatMessage::class.java)
if(chatMessage!!.fromId == currentUser.uid){
adapter.add(MessageToAdapter(
chatMessage.text,
currentUserData.image.toString(),
imageProcessing = ImageProcessing(activity!!.applicationContext)))
}else{
adapter.add(MessageFromAdapter(
chatMessage.text,
selectedUser.image.toString(),
imageProcessing = ImageProcessing(activity!!.applicationContext)))
}
}
override fun onCancelled(p0: DatabaseError) {}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {}
override fun onChildRemoved(p0: DataSnapshot) {}
})
}
/**
* Send message button listener
*/
private fun sendMessageListener(view: View){
RxView.clicks(view).map {
val textMessage = binding.messageEditText.text.toString()
val chatMessage = ChatMessage(
toReferenceDatabase.key!!,
textMessage, currentUser.uid,
selectedUser.uid.toString()
)
fromReferenceDatabase.push().setValue(chatMessage)
.addOnSuccessListener {
binding.messageEditText.text.clear()
chatRecyclerView.scrollToPosition(adapter.itemCount - 1)
}.addOnFailureListener {
messaging.showToast("error", it.message.toString())
}
toReferenceDatabase.push().setValue(chatMessage)
.addOnSuccessListener {
binding.messageEditText.text.clear()
}.addOnFailureListener {
messaging.showToast("error", it.message.toString())
}
}.throttleFirst(1000, TimeUnit.MILLISECONDS).subscribe()
}
}