Files
cuidamais_med/docs/codigo_detalhado/01_MainActivity_Codigo.md
2026-04-22 12:41:12 +01:00

3.5 KiB

📄 Análise de Código: MainActivity.java

O MainActivity.java é a classe central da aplicação. Como usa o BottomNavigationView, ele controla três "ecrãs" virtuais que se escondem ou aparecem dependendo do botão carregado: Agenda, Pacientes e Perfil.

1. Importações e Declarações (Linhas 1 - 34)

A classe estende AppCompatActivity e implementa interfaces do ConsultaAdapter (OnConsultaActionClickListener, OnConsultaClickListener) para conseguir "ouvir" cliques feitos nos itens da lista de consultas.

2. Variáveis Globais (Linhas 36 - 57)

  • Views de Navegação: viewAgenda, viewPacientes, viewPerfil, layTop — Estas variáveis controlam a visibilidade de cada secção da app.
  • RecyclerViews e Adapters: recyclerConsultas e adapterPacientes (para a lista de pacientes), recyclerAgenda e adapterAgenda (para a lista de consultas).
  • Firebase: mAuth (autenticação) e db (Firestore).
  • ID: currentMedicoId guarda o UID (User ID) do médico logado.

3. Método onCreate() (Linhas 59 - 188)

  • Verificação de Login: A primeira coisa que o onCreate faz é verificar se há algum utilizador logado (mAuth.getCurrentUser() == null). Se não houver, ele atira o utilizador para a LoginActivity.
  • Carregamento Instantâneo (SharedPreferences): Usa o cache local SessaoMedico para exibir o nome ("Olá, [Nome]") antes mesmo da base de dados responder.
  • Configuração dos Recyclers: Define os layouts (LinearLayoutManager) e os Adapters que vão desenhar as listas.
  • Bottom Navigation: Há um setOnItemSelectedListener que, dependendo do botão tocado (Agenda, Pacientes, Perfil), faz um setVisibility(View.GONE) aos ecrãs indesejados e um VISIBLE ao ecrã selecionado.
  • Início dos Dados: Chama loadUtilizadores(), loadPerfilMedico(), e usa a data atual (SimpleDateFormat) para chamar loadConsultasAgendaForDate(today).

4. Lógica de Pacientes (loadUtilizadores()) (Linhas 190 - 230)

  • Coloca um SnapshotListener (espião em tempo real) na coleção "utilizadores".
  • Se o tipo for "paciente" (ou nulo), adiciona à lista e manda o adapter desenhá-los no ecrã.
  • Tenta ir buscar o nome a "nome_completo" e depois a "nome".

5. Eventos de Clique nas Consultas (Linhas 232 - 260)

  • onAceitarClick(): Altera o status da consulta para "aceite".
  • onEliminarClick(): Elimina a consulta inteira da base de dados e informa o utilizador com um Toast.
  • onConsultaClick(): Se o médico clicar na consulta (e não nos botões de aceitar/rejeitar), a app vai para a DetalhePacienteActivity, passando o PACIENTE_ID via Intent.

6. Lógica da Agenda (loadConsultasAgendaForDate()) (Linhas 262 - 342)

  • Recebe uma data (ex: 12/04/2026).
  • Liga-se à coleção "consultas". Filtra no cliente (através de um if) se o ID do médico (como string ou como parte de uma lista) está na consulta.
  • Aceita três formatos de data via getAlternativeDate (ex: 04/05/2026 e 4/5/2026) ou formato ISO.
  • Só mostra consultas se não estiverem marcadas como "cancelada".

7. Lógica do Perfil (loadPerfilMedico()) (Linhas 350 - 403)

  • Acede à coleção "utilizadores". Se o documento não existir, faz um fallback e tenta ler na coleção "medicos".
  • Depois de encontrar, usa o updateProfileUI() para meter o nome, email, especialidade e cédula nos TextViews respetivos.
  • Atualiza a SharedPreferences para garantir que o "Olá, X" nunca fica vazio quando o ecrã recarrega.