3.5 KiB
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:
recyclerConsultaseadapterPacientes(para a lista de pacientes),recyclerAgendaeadapterAgenda(para a lista de consultas). - Firebase:
mAuth(autenticação) edb(Firestore). - ID:
currentMedicoIdguarda o UID (User ID) do médico logado.
3. Método onCreate() (Linhas 59 - 188)
- Verificação de Login: A primeira coisa que o
onCreatefaz é verificar se há algum utilizador logado (mAuth.getCurrentUser() == null). Se não houver, ele atira o utilizador para aLoginActivity. - Carregamento Instantâneo (SharedPreferences): Usa o cache local
SessaoMedicopara 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
setOnItemSelectedListenerque, dependendo do botão tocado (Agenda, Pacientes, Perfil), faz umsetVisibility(View.GONE)aos ecrãs indesejados e umVISIBLEao ecrã selecionado. - Início dos Dados: Chama
loadUtilizadores(),loadPerfilMedico(), e usa a data atual (SimpleDateFormat) para chamarloadConsultasAgendaForDate(today).
4. Lógica de Pacientes (loadUtilizadores()) (Linhas 190 - 230)
- Coloca um
SnapshotListener(espião em tempo real) na coleção"utilizadores". - Se o
tipofor "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 aDetalhePacienteActivity, passando oPACIENTE_IDvia 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 umif) 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 nosTextViewsrespetivos. - Atualiza a
SharedPreferencespara garantir que o "Olá, X" nunca fica vazio quando o ecrã recarrega.