108 lines
3.2 KiB
Markdown
108 lines
3.2 KiB
Markdown
# 🔐 Autenticação — Login e Registo
|
||
|
||
> **Pasta:** `app/src/main/java/com/example/medcuida/pro/ui/auth/`
|
||
|
||
---
|
||
|
||
## LoginActivity.java (154 linhas)
|
||
|
||
> **Layout:** `activity_login.xml`
|
||
|
||
### Descrição
|
||
Ecrã de **entrada na aplicação**. Permite login com email/password via Firebase Auth.
|
||
|
||
### Inicialização (`onCreate`) — Linhas 34–78
|
||
|
||
1. **Auto-login:** Se já existe sessão ativa → redireciona direto para `MainActivity`
|
||
2. **Campos:** email e password (`TextInputEditText`)
|
||
3. **Botão "Entrar"** → `attemptLogin()`
|
||
4. **Link "Registar"** → abre `RegisterActivity`
|
||
5. **Link "Esqueci password":**
|
||
- Valida se o email foi preenchido
|
||
- Envia email de recuperação via `mAuth.sendPasswordResetEmail()`
|
||
|
||
### `attemptLogin()` — Linhas 81–98
|
||
|
||
Validações antes de enviar ao Firebase:
|
||
- Email não pode estar vazio
|
||
- Password não pode estar vazia
|
||
|
||
### `loginUser()` — Linhas 100–123
|
||
|
||
```java
|
||
mAuth.signInWithEmailAndPassword(email, password)
|
||
```
|
||
|
||
1. Desativa o botão (evita duplo clique) e mostra "A entrar..."
|
||
2. Se login OK → chama `checkUserAccess()`
|
||
3. Se falhar → mostra mensagem de erro e reativa o botão
|
||
|
||
### `checkUserAccess()` — Linhas 125–152
|
||
|
||
**Verifica se o utilizador tem perfil configurado** (estratégia com fallback):
|
||
|
||
```
|
||
1º → Procura em 'medicos' → Se existe → Entrar na app
|
||
2º → Procura em 'utilizadores' → Se existe → Entrar na app
|
||
3º → Não encontrado → Erro + signOut
|
||
```
|
||
|
||
Se não encontrar em nenhuma coleção → faz `signOut()` e pede para registar.
|
||
|
||
---
|
||
|
||
## RegisterActivity.java (187 linhas)
|
||
|
||
> **Layout:** `activity_register_medico.xml`
|
||
|
||
### Descrição
|
||
Ecrã de **registo de novos médicos**. Cria conta no Firebase Auth e guarda dados no Firestore.
|
||
|
||
### Campos do Formulário
|
||
|
||
| Campo | Tipo | Obrigatório | Validação |
|
||
|---|---|---|---|
|
||
| Nome completo | `TextInputEditText` | ✅ | Não vazio |
|
||
| Especialidade | `TextInputEditText` | ✅ | Não vazio |
|
||
| Género | `AutoCompleteTextView` | ✅ | Não vazio |
|
||
| Email | `TextInputEditText` | ✅ | Não vazio |
|
||
| Password | `TextInputEditText` | ✅ | Mínimo 6 caracteres |
|
||
|
||
### `attemptRegister()` — Linhas 75–118
|
||
|
||
Valida todos os campos sequencialmente. Se algum falhar, faz `requestFocus()` nesse campo.
|
||
|
||
### `registerUser()` — Linhas 121–155
|
||
|
||
```java
|
||
mAuth.createUserWithEmailAndPassword(email, password)
|
||
```
|
||
|
||
1. Desativa o botão de registo
|
||
2. Se criar conta OK → chama `saveMedicoData()`
|
||
3. **Caso especial — email já existe:**
|
||
- Tenta fazer login com as credenciais fornecidas
|
||
- Se login OK → grava os dados (pode ter falhado antes)
|
||
- Se login falhar → mostra erro "email já registado"
|
||
|
||
### `saveMedicoData()` — Linhas 157–185
|
||
|
||
Grava os dados do médico em **duas coleções** para compatibilidade:
|
||
|
||
```java
|
||
Map<String, Object> medicoMap = new HashMap<>();
|
||
medicoMap.put("id", uid);
|
||
medicoMap.put("nome_completo", name);
|
||
medicoMap.put("email", email);
|
||
medicoMap.put("especialidade", specialty);
|
||
medicoMap.put("sexo", gender);
|
||
medicoMap.put("tipo", "medico");
|
||
```
|
||
|
||
| Coleção | Documento |
|
||
|---|---|
|
||
| `utilizadores/{uid}` | Dados principais |
|
||
| `medicos/{uid}` | Cópia para compatibilidade |
|
||
|
||
Após gravar com sucesso → redireciona para `MainActivity`.
|