falta so o chat
This commit is contained in:
165
docs/01_MainActivity.md
Normal file
165
docs/01_MainActivity.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# 🏠 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)
|
||||
```java
|
||||
setContentView(R.layout.activity_main);
|
||||
```
|
||||
- Carrega o layout XML
|
||||
- Envolto em `try-catch` para capturar erros de inflação da view
|
||||
|
||||
### 2. Verificação de Autenticação (Linhas 71–79)
|
||||
```java
|
||||
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 `uid` do médico atual para filtrar dados
|
||||
|
||||
### 3. Carregamento do Nome em Cache (Linhas 91–95)
|
||||
```java
|
||||
String cachedName = getSharedPreferences("SessaoMedico", MODE_PRIVATE).getString("nome_medico", "");
|
||||
```
|
||||
- Lê o nome do médico das `SharedPreferences` para **exibição instantânea** (sem esperar pelo Firestore)
|
||||
- Mostra "Olá, [Primeiro Nome]" no topo
|
||||
|
||||
### 4. Configuração dos Pacientes (Linhas 97–107)
|
||||
- Cria um `RecyclerView` com `PacienteAdapter`
|
||||
- Ao clicar num paciente → abre `DetalhePacienteActivity`
|
||||
|
||||
### 5. Configuração da Agenda (Linhas 109–120)
|
||||
- Cria um `RecyclerView` com `ConsultaAdapter`
|
||||
- Ao clicar numa consulta → abre `DetalhePacienteActivity` com ID da consulta
|
||||
|
||||
### 6. Configuração do Perfil (Linhas 122–139)
|
||||
- Associa os `TextView` do 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)
|
||||
```java
|
||||
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 `CalendarView` para filtrar consultas por data
|
||||
|
||||
---
|
||||
|
||||
## Lógica dos Pacientes — Linhas 190–230
|
||||
|
||||
### `loadUtilizadores()`
|
||||
```java
|
||||
db.collection("utilizadores").addSnapshotListener(...)
|
||||
```
|
||||
|
||||
**O que faz:**
|
||||
1. Escuta **em tempo real** a coleção `utilizadores` no Firestore
|
||||
2. Para cada documento:
|
||||
- Converte para objeto `Paciente`
|
||||
- Tenta o campo `nome_completo`, depois `nome` como fallback
|
||||
- Filtra: apenas inclui se `tipo` for `"paciente"` ou não estiver definido
|
||||
3. Atualiza o `RecyclerView` ou mostra mensagem "vazio"
|
||||
|
||||
---
|
||||
|
||||
## Ações nas Consultas — Linhas 232–260
|
||||
|
||||
### `onAceitarClick(Consulta)` — Linha 233
|
||||
- Atualiza o campo `status` da consulta para `"aceite"` no Firestore
|
||||
|
||||
### `onEliminarClick(Consulta)` — Linha 238
|
||||
- **Elimina** o documento da consulta do Firestore
|
||||
|
||||
### `onConsultaClick(Consulta)` — Linha 246
|
||||
- Abre o `DetalhePacienteActivity` com os IDs do paciente e da consulta
|
||||
|
||||
### `updateConsultaStatus()` — Linha 253
|
||||
- Método auxiliar que atualiza o campo `status` de uma consulta
|
||||
|
||||
---
|
||||
|
||||
## Lógica da Agenda — Linhas 262–342
|
||||
|
||||
### `loadConsultasAgendaForDate(String dateStr)`
|
||||
|
||||
**O que faz:**
|
||||
1. Remove qualquer listener anterior (para evitar duplicados)
|
||||
2. Escuta **todas** as consultas em tempo real
|
||||
3. Para cada consulta:
|
||||
- Verifica se **pertence ao médico atual** (campo `medicos` pode ser `String` ou `List`)
|
||||
- Verifica se a **data corresponde** à data selecionada (suporta 3 formatos: `dd/MM/yyyy`, `d/M/yyyy`, `yyyy-MM-dd`)
|
||||
- Exclui consultas com status `"cancelada"`
|
||||
4. 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()`
|
||||
1. Escuta em tempo real na coleção `utilizadores`
|
||||
2. Se o documento **não existe**, faz fallback para a coleção `medicos`
|
||||
3. Chama `updateProfileUI()` com os dados encontrados
|
||||
|
||||
### `updateProfileUI(DocumentSnapshot doc)`
|
||||
1. Lê `nome_completo` (ou `nome` como fallback)
|
||||
2. Guarda o nome nas `SharedPreferences` para cache
|
||||
3. Atualiza todos os campos da UI:
|
||||
- Nome, Email, Especialidade, Cédula profissional
|
||||
- Saudação "Olá, [Nome]" no topo
|
||||
|
||||
---
|
||||
|
||||
## Diagrama de Fluxo
|
||||
|
||||
```mermaid
|
||||
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]
|
||||
```
|
||||
Reference in New Issue
Block a user