diff --git a/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java b/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java index 36ed63b..0711684 100644 --- a/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java +++ b/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java @@ -1,26 +1,194 @@ package com.example.cuida.ui.Inicial; +import android.content.Intent; import android.os.Bundle; - -import androidx.activity.EdgeToEdge; +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; +import android.util.Log; +import android.util.Patterns; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - import com.example.cuida.R; +import com.example.cuida.ui.MainActivity; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException; +import com.google.firebase.auth.FirebaseAuthUserCollisionException; +import com.google.firebase.auth.FirebaseAuthWeakPasswordException; public class Criar_conta extends AppCompatActivity { + // ... (suas variáveis) + private EditText nomeApelidoEditText; + private EditText gmailEditText; + private EditText telemovelEditText; + private EditText palavraPasseEditText; + private EditText confirmarPalavraPasseEditText; + private EditText moradaEditText; + private EditText dataEditText; + private Button criarContaButton; + + private FirebaseAuth mAuth; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); setContentView(R.layout.activity_criar_conta); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; + + mAuth = FirebaseAuth.getInstance(); + + //... (outros findViewById) + nomeApelidoEditText = findViewById(R.id.nomeApelidoEditText); + gmailEditText = findViewById(R.id.gmailEditText); + telemovelEditText = findViewById(R.id.telemovelEditText); + palavraPasseEditText = findViewById(R.id.palavraPasseEditText); + confirmarPalavraPasseEditText = findViewById(R.id.confirmarPalavraPasseEditText); + moradaEditText = findViewById(R.id.moradaEditText); + dataEditText = findViewById(R.id.dataEditText); + criarContaButton = findViewById(R.id.CriarContaButton); + + + // Use isto se preferir fazer via código. Mas a melhor forma é no XML com android:inputType="number" + telemovelEditText.setInputType(InputType.TYPE_CLASS_NUMBER); + + // ... (o resto do seu código onCreate continua igual) + dataEditText.addTextChangedListener(new TextWatcher() { + //... (código do TextWatcher da data) + private String current = ""; + private final String ddmmyyyy = "DDMMYYYY"; + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + + @Override + public void afterTextChanged(Editable s) { + if (!s.toString().equals(current)) { + String clean = s.toString().replaceAll("[^\\d.]|\\.", ""); + String cleanC = current.replaceAll("[^\\d.]|\\.", ""); + + int cl = clean.length(); + int sel = cl; + for (int i = 2; i <= cl && i < 6; i += 2) { + sel++; + } + if (clean.equals(cleanC)) sel--; + + if (clean.length() < 8) { + clean = clean + ddmmyyyy.substring(clean.length()); + } + + clean = String.format("%s/%s/%s", clean.substring(0, 2), + clean.substring(2, 4), + clean.substring(4, 8)); + + sel = sel < 0 ? 0 : sel; + current = clean; + dataEditText.setText(current); + dataEditText.setSelection(sel < current.length() ? sel : current.length()); + } + } }); + + criarContaButton.setOnClickListener(v -> criarNovaConta()); } -} \ No newline at end of file + + private void criarNovaConta() { + String nome = nomeApelidoEditText.getText().toString().trim(); + String email = gmailEditText.getText().toString().trim(); + String telemovel = telemovelEditText.getText().toString().trim(); + String morada = moradaEditText.getText().toString().trim(); + String data = dataEditText.getText().toString().trim(); + String password = palavraPasseEditText.getText().toString().trim(); + String confirmPassword = confirmarPalavraPasseEditText.getText().toString().trim(); + + // ... (outras validações) + if (nome.isEmpty()) { + nomeApelidoEditText.setError("O nome é obrigatório."); + nomeApelidoEditText.requestFocus(); + return; + } + if (email.isEmpty()) { + gmailEditText.setError("O e-mail é obrigatório."); + gmailEditText.requestFocus(); + return; + } + if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + gmailEditText.setError("Por favor, insira um e-mail válido."); + gmailEditText.requestFocus(); + return; + } + + // --- VALIDAÇÃO REFORÇADA PARA O TELEMÓVEL --- + if (telemovel.isEmpty()) { + telemovelEditText.setError("O telemóvel é obrigatório."); + telemovelEditText.requestFocus(); + return; + } + // Esta linha verifica se o texto contém algo que NÃO seja um número (0-9) + if (!telemovel.matches("[0-9]+")) { + telemovelEditText.setError("Por favor, insira apenas números."); + telemovelEditText.requestFocus(); + return; + } + + // ... (resto das validações) + if (morada.isEmpty()) { + moradaEditText.setError("A morada é obrigatória."); + moradaEditText.requestFocus(); + return; + } + if (data.length() != 10 || data.contains("D") || data.contains("M") || data.contains("Y")) { + dataEditText.setError("A data de nascimento está incompleta."); + dataEditText.requestFocus(); + return; + } + if (password.isEmpty()) { + palavraPasseEditText.setError("A palavra-passe é obrigatória."); + palavraPasseEditText.requestFocus(); + return; + } + if (password.length() < 6) { + palavraPasseEditText.setError("A palavra-passe deve ter no mínimo 6 caracteres."); + palavraPasseEditText.requestFocus(); + return; + } + if (!password.equals(confirmPassword)) { + confirmarPalavraPasseEditText.setError("As palavras-passe não coincidem."); + confirmarPalavraPasseEditText.requestFocus(); + return; + } + + + // ... (código do Firebase continua igual) + mAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(this, task -> { + if (task.isSuccessful()) { + Log.d("FIREBASE_AUTH", "createUserWithEmail:success"); + Toast.makeText(Criar_conta.this, "Conta criada com sucesso!", Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(Criar_conta.this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); + } else { + try { + throw task.getException(); + } catch (FirebaseAuthWeakPasswordException e) { + Toast.makeText(Criar_conta.this, "Palavra-passe fraca. Tente uma mais forte.", Toast.LENGTH_LONG).show(); + } catch (FirebaseAuthInvalidCredentialsException e) { + Toast.makeText(Criar_conta.this, "Formato de e-mail inválido.", Toast.LENGTH_LONG).show(); + } catch (FirebaseAuthUserCollisionException e) { + Toast.makeText(Criar_conta.this, "Este e-mail já está registado.", Toast.LENGTH_LONG).show(); + } catch (Exception e) { + Log.e("FIREBASE_AUTH", e.getMessage()); + Toast.makeText(Criar_conta.this, "Falha ao criar conta: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + }); + } +} diff --git a/app/src/main/res/layout/activity_criar_conta.xml b/app/src/main/res/layout/activity_criar_conta.xml index 53fdf80..0cdcaff 100644 --- a/app/src/main/res/layout/activity_criar_conta.xml +++ b/app/src/main/res/layout/activity_criar_conta.xml @@ -8,7 +8,7 @@ tools:context=".ui.Inicial.Criar_conta"> + app:layout_constraintEnd_toEndOf="@+id/criarContaTextView" + app:layout_constraintStart_toStartOf="@+id/criarContaTextView" + app:layout_constraintTop_toBottomOf="@+id/criarContaTextView" /> + app:layout_constraintEnd_toEndOf="@+id/nomeApelidoEditText" + app:layout_constraintStart_toStartOf="@+id/nomeApelidoEditText" + app:layout_constraintTop_toBottomOf="@+id/nomeApelidoEditText" /> + app:layout_constraintEnd_toEndOf="@+id/gmailEditText" + app:layout_constraintStart_toStartOf="@+id/gmailEditText" + app:layout_constraintTop_toBottomOf="@+id/gmailEditText" /> + app:layout_constraintStart_toStartOf="@+id/palavraPasseEditText" + app:layout_constraintTop_toBottomOf="@+id/palavraPasseEditText" /> + app:layout_constraintEnd_toEndOf="@+id/dataEditText" + app:layout_constraintStart_toStartOf="@+id/dataEditText" + app:layout_constraintTop_toBottomOf="@+id/dataEditText" /> + app:layout_constraintEnd_toEndOf="@+id/telemovelEditText" + app:layout_constraintStart_toStartOf="@+id/telemovelEditText" + app:layout_constraintTop_toBottomOf="@+id/telemovelEditText" />