5.2 KiB
5.2 KiB
🏠 MainActivity.java — Ecrã Principal
Ficheiro:
app/src/main/java/com/example/medcuida/pro/MainActivity.java
Layout:activity_main.xml
Linhas de código: 404
Descrição Geral
A MainActivity é o ecrã central da aplicação. Funciona como um painel de controlo do médico, com 3 secções controladas por uma BottomNavigationView:
| Tab | Conteúdo |
|---|---|
| 📅 Agenda | Calendário + lista de consultas do dia selecionado |
| 👥 Pacientes | Lista de todos os pacientes registados |
| 👤 Perfil | Dados do médico (nome, email, especialidade, cédula) |
Inicialização (onCreate) — Linhas 59–188
1. Configuração do Layout (Linhas 63–69)
setContentView(R.layout.activity_main);
- Carrega o layout XML
- Envolto em
try-catchpara capturar erros de inflação da view
2. Verificação de Autenticação (Linhas 71–79)
if (mAuth.getCurrentUser() == null) {
startActivity(new Intent(this, LoginActivity.class));
finish();
return;
}
- Se o utilizador não está autenticado, redireciona para o
LoginActivity - Obtém o
uiddo médico atual para filtrar dados
3. Carregamento do Nome em Cache (Linhas 91–95)
String cachedName = getSharedPreferences("SessaoMedico", MODE_PRIVATE).getString("nome_medico", "");
- Lê o nome do médico das
SharedPreferencespara exibição instantânea (sem esperar pelo Firestore) - Mostra "Olá, [Primeiro Nome]" no topo
4. Configuração dos Pacientes (Linhas 97–107)
- Cria um
RecyclerViewcomPacienteAdapter - Ao clicar num paciente → abre
DetalhePacienteActivity
5. Configuração da Agenda (Linhas 109–120)
- Cria um
RecyclerViewcomConsultaAdapter - Ao clicar numa consulta → abre
DetalhePacienteActivitycom ID da consulta
6. Configuração do Perfil (Linhas 122–139)
- Associa os
TextViewdo perfil (nome, email, especialidade, cédula) - Botão "Editar Dados" → abre
EditarPerfilActivity - Botão "Logout" → faz sign out e redireciona para login
7. Bottom Navigation (Linhas 141–162)
bottomNav.setOnItemSelectedListener(item -> {
// Esconde todas as views
// Mostra apenas a view selecionada
});
- Controla a visibilidade das 3 secções (Agenda, Pacientes, Perfil)
- A tab Agenda é a selecionada por defeito
8. Carregamento de Dados (Linhas 164–183)
- Chama
loadUtilizadores()para carregar pacientes - Chama
loadPerfilMedico()para carregar o perfil - Configura o
CalendarViewpara filtrar consultas por data
Lógica dos Pacientes — Linhas 190–230
loadUtilizadores()
db.collection("utilizadores").addSnapshotListener(...)
O que faz:
- Escuta em tempo real a coleção
utilizadoresno Firestore - Para cada documento:
- Converte para objeto
Paciente - Tenta o campo
nome_completo, depoisnomecomo fallback - Filtra: apenas inclui se
tipofor"paciente"ou não estiver definido
- Converte para objeto
- Atualiza o
RecyclerViewou mostra mensagem "vazio"
Ações nas Consultas — Linhas 232–260
onAceitarClick(Consulta) — Linha 233
- Atualiza o campo
statusda consulta para"aceite"no Firestore
onEliminarClick(Consulta) — Linha 238
- Elimina o documento da consulta do Firestore
onConsultaClick(Consulta) — Linha 246
- Abre o
DetalhePacienteActivitycom os IDs do paciente e da consulta
updateConsultaStatus() — Linha 253
- Método auxiliar que atualiza o campo
statusde uma consulta
Lógica da Agenda — Linhas 262–342
loadConsultasAgendaForDate(String dateStr)
O que faz:
- Remove qualquer listener anterior (para evitar duplicados)
- Escuta todas as consultas em tempo real
- Para cada consulta:
- Verifica se pertence ao médico atual (campo
medicospode serStringouList) - Verifica se a data corresponde à data selecionada (suporta 3 formatos:
dd/MM/yyyy,d/M/yyyy,yyyy-MM-dd) - Exclui consultas com status
"cancelada"
- Verifica se pertence ao médico atual (campo
- Atualiza a lista na UI
convertToISODate() — Linha 324
- Converte
"22/04/2026"→"2026-04-22"
getAlternativeDate() — Linha 335
- Converte
"01/04/2026"→"1/4/2026"(sem zeros à esquerda)
Lógica do Perfil — Linhas 350–402
loadPerfilMedico()
- Escuta em tempo real na coleção
utilizadores - Se o documento não existe, faz fallback para a coleção
medicos - Chama
updateProfileUI()com os dados encontrados
updateProfileUI(DocumentSnapshot doc)
- Lê
nome_completo(ounomecomo fallback) - Guarda o nome nas
SharedPreferencespara cache - Atualiza todos os campos da UI:
- Nome, Email, Especialidade, Cédula profissional
- Saudação "Olá, [Nome]" no topo
Diagrama de Fluxo
graph TD
A[onCreate] --> B{Utilizador autenticado?}
B -->|Não| C[Ir para Login]
B -->|Sim| D[Carregar UI]
D --> E[Carregar nome em cache]
D --> F[Configurar RecyclerViews]
D --> G[Configurar BottomNav]
D --> H[loadUtilizadores]
D --> I[loadPerfilMedico]
D --> J[loadConsultasAgendaForDate - hoje]
G -->|Tab Agenda| K[Mostrar Agenda]
G -->|Tab Pacientes| L[Mostrar Pacientes]
G -->|Tab Perfil| M[Mostrar Perfil]