falta so o chat
This commit is contained in:
40
docs/codigo_detalhado/01_MainActivity_Codigo.md
Normal file
40
docs/codigo_detalhado/01_MainActivity_Codigo.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# 📄 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.
|
||||
Reference in New Issue
Block a user