Firebase App - Parte 2

8. Lógica da Aplicação com ViewModel

8.3. HomeFragment

package ...

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.navigation.Navigation.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import br.edu.ifsc.fulano.minhastarefas.databinding.FragmentHomeBinding
import com.google.android.material.snackbar.Snackbar
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class HomeFragment : Fragment() {
//binding das views automatizado
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
//firebase
private lateinit var mAuth: FirebaseAuth //acessa os recursos de autenticação do Firebase

companion object {
fun newInstance() = HomeFragment()
}

private val viewModel: HomeViewModel by viewModels()
//adaptador da recyclerview
private var listaTarefaAdapter: ListaTarefaAdapter? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// TODO: Use the ViewModel
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
//configura a vinculação
_binding = FragmentHomeBinding.inflate(inflater, container, false)

//Configura a recyclerView
val recyclerView = binding.tarefasRecyclerView
recyclerView.layoutManager = LinearLayoutManager(context)
//inicializa o adaptar com uma lista vazia
listaTarefaAdapter = ListaTarefaAdapter(ArrayList<Tarefa>())
recyclerView.adapter = listaTarefaAdapter

//Configura a ação do FAB
binding.addFAB.setOnClickListener{
addTarefa()
}

return binding.root
}

override fun onStart() {
super.onStart()
//inicializa o serviço de autenticação do Firebase
mAuth = Firebase.auth
//obtem os dados do usuário atual
val currentUser = mAuth.currentUser
//verifica se o usuário existe
if (currentUser != null) {
view?.let{
Snackbar.make(it, "Usuário logado: " + currentUser.email, Snackbar.LENGTH_LONG).show()
}
getTarefas()
}
//caso contrário encaminha para a página de login
else {
Log.d("TODO2024", "Usuário deslogado")
findNavController(requireView()).navigate(R.id.action_homeFragment_to_loginFragment)
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val menuHost: MenuHost = requireActivity()

menuHost.addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_main, menu)
}

override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
R.id.action_logout -> {
logOut()
true
}
else -> false
}
}
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
}

fun logOut(){
//faz logout e vai para a página de login
mAuth.signOut()
view?.let{
Snackbar.make(it, "Usuário deslogado.", Snackbar.LENGTH_LONG).show()
}
findNavController(requireView()).navigate(R.id.action_homeFragment_to_loginFragment)
}

fun getTarefas() {
view?.let{
Snackbar.make(it, "Lendo tarefas...", Snackbar.LENGTH_LONG).show()
}
//usa a LiveData da viewModel para escutar mudanças
//ao ouvir mudanças atualiza a lista de tarefas do adaptador
viewModel.listaTarefas.observe(this) { tarefas ->
listaTarefaAdapter?.updateData(tarefas)
}
}

fun addTarefa() {
//faz a leitura dos dados
val descricao = binding.nomeTarefaTextInputLayout.editText?.text.toString().trim()
//se o campo estiver em branco encerra a operação
if (descricao == "")
return
//envia os dados a ViewModel para adicionar uma nova tarefa
viewModel.addTarefa(descricao, false)
//limpa os campos
binding.nomeTarefaTextInputLayout.editText?.text?.clear()
}
}