Sharingang/Sharingang-Android

View on GitHub
app/src/main/java/com/example/sharingang/ui/fragments/ChatsFragment.kt

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package com.example.sharingang.ui.fragments

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.sharingang.databinding.FragmentChatsBinding
import com.example.sharingang.auth.CurrentUserProvider
import com.example.sharingang.models.User
import com.example.sharingang.ui.adapters.UserAdapter
import com.example.sharingang.database.repositories.UserRepository
import com.example.sharingang.utils.RecyclerViewDecorator
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import javax.inject.Inject

/**
 * ChatsFragment takes care of displaying and representing the current
 * chat partners of the logged-in user.
 */
@AndroidEntryPoint
class ChatsFragment : Fragment() {

    private lateinit var binding: FragmentChatsBinding
    private var currentUserId: String? = null
    private lateinit var userAdapter: UserAdapter

    @Inject
    lateinit var currentUserProvider: CurrentUserProvider

    private val listUsers: MutableList<User> = mutableListOf()

    @Inject
    lateinit var userRepository: UserRepository
    private val usersLiveData: MutableLiveData<List<User>> = MutableLiveData(listOf())

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        currentUserId = currentUserProvider.getCurrentUserId()
        binding = FragmentChatsBinding.inflate(inflater, container, false)
        if (currentUserId != null) {
            userAdapter = UserAdapter(
                requireContext(), listUsers, userRepository, currentUserId!!, lifecycleScope, this
            )
            binding.chatUsersList.adapter = userAdapter
            val decorator = RecyclerViewDecorator()
            decorator.setRecyclerViewDecoration(margin = 10, recyclerView = binding.chatUsersList)
            binding.chatUsersList.layoutManager = LinearLayoutManager(requireContext())
            usersLiveData.observe(viewLifecycleOwner, { newList ->
                (binding.chatUsersList.adapter as UserAdapter).submitList(newList)
            })
        }
        setupUI()
        return binding.root
    }

    /**
     * Sets up the UI (views) with the help of the UserAdapter
     */
    private fun setupUI() {
        listUsers.clear()
        if (currentUserId != null) {
            binding.loggedOutInfo.visibility = View.GONE
            lifecycleScope.launch(Dispatchers.IO) {
                val chatPartners = userRepository.getChatPartners(currentUserId!!)
                chatPartners.forEach {
                    val user = userRepository.get(it)
                    if (!userRepository.hasBeenBlocked(currentUserId!!, by = user!!.id!!) &&
                        !userRepository.hasBeenBlocked(user.id!!, by = currentUserId!!)
                    ) {
                        listUsers.add(user)
                    }
                }
                lifecycleScope.launch(Dispatchers.Main) {
                    usersLiveData.postValue(listUsers)
                }
            }
        } else {
            binding.chatUsersList.visibility = View.GONE
            binding.loggedOutInfo.visibility = View.VISIBLE
        }
    }
}