# 🔐 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 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`.