From 65a662a54c2967bc6a9192f31facec622fcb281f Mon Sep 17 00:00:00 2001 From: 230421 <230421@epvc.pt> Date: Wed, 3 Dec 2025 21:36:38 +0000 Subject: [PATCH] melhorias --- app/src/main/AndroidManifest.xml | 3 + .../example/vdcscore/CriarContaActivity.java | 29 ++- .../com/example/vdcscore/LoginActivity.java | 30 ++- .../vdcscore/RecuperarSenhaActivity.java | 72 +++++++ .../main/res/drawable/bg_gradient_login.xml | 10 + app/src/main/res/drawable/button_modern.xml | 11 + .../main/res/drawable/edit_text_focused.xml | 15 ++ .../main/res/drawable/edit_text_modern.xml | 15 ++ app/src/main/res/drawable/ic_email.xml | 12 ++ app/src/main/res/drawable/ic_lock.xml | 12 ++ .../main/res/layout/activity_criarconta.xml | 191 ++++++++++++----- app/src/main/res/layout/activity_login.xml | 202 +++++++++++++----- .../res/layout/activity_recuperar_senha.xml | 143 +++++++++++++ 13 files changed, 626 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/com/example/vdcscore/RecuperarSenhaActivity.java create mode 100644 app/src/main/res/drawable/bg_gradient_login.xml create mode 100644 app/src/main/res/drawable/button_modern.xml create mode 100644 app/src/main/res/drawable/edit_text_focused.xml create mode 100644 app/src/main/res/drawable/edit_text_modern.xml create mode 100644 app/src/main/res/drawable/ic_email.xml create mode 100644 app/src/main/res/drawable/ic_lock.xml create mode 100644 app/src/main/res/layout/activity_recuperar_senha.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 941e770..8741f3a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,9 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/example/vdcscore/CriarContaActivity.java b/app/src/main/java/com/example/vdcscore/CriarContaActivity.java index f72fe63..af4e9d1 100644 --- a/app/src/main/java/com/example/vdcscore/CriarContaActivity.java +++ b/app/src/main/java/com/example/vdcscore/CriarContaActivity.java @@ -4,7 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; -import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; @@ -14,6 +13,7 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.auth.FirebaseAuth; public class CriarContaActivity extends AppCompatActivity { @@ -28,9 +28,9 @@ public class CriarContaActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); - EditText editPassword2; - EditText editEmail; - EditText editConfirmPassword; + TextInputEditText editPassword2; + TextInputEditText editEmail; + TextInputEditText editConfirmPassword; Button btnCreateAccount; TextView txtGoLogin; @@ -45,7 +45,7 @@ public class CriarContaActivity extends AppCompatActivity { btnCreateAccount.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - String email = editEmail.getText().toString(); + String email = editEmail.getText().toString().trim(); String pass = editPassword2.getText().toString(); String conf = editConfirmPassword.getText().toString(); @@ -54,6 +54,16 @@ public class CriarContaActivity extends AppCompatActivity { return; } + if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + Toast.makeText(CriarContaActivity.this, "Por favor, insira um email válido", Toast.LENGTH_SHORT).show(); + return; + } + + if (pass.length() < 6) { + Toast.makeText(CriarContaActivity.this, "A senha deve ter pelo menos 6 caracteres", Toast.LENGTH_SHORT).show(); + return; + } + if (!pass.equals(conf)) { Toast.makeText(CriarContaActivity.this, "As passwords não coincidem!", Toast.LENGTH_SHORT).show(); return; @@ -62,12 +72,17 @@ public class CriarContaActivity extends AppCompatActivity { FirebaseAuth auth = FirebaseAuth.getInstance(); auth.createUserWithEmailAndPassword(email, pass).addOnCompleteListener(CriarContaActivity.this, task -> { if (task.isSuccessful()) { - + Toast.makeText(CriarContaActivity.this, "Conta criada com sucesso!", Toast.LENGTH_SHORT).show(); Intent intent= new Intent(CriarContaActivity.this, MainActivity.class); startActivity(intent); finish(); } else { - Toast.makeText(CriarContaActivity.this, "Erro ao criar conta!", Toast.LENGTH_SHORT).show(); + String errorMessage = task.getException().getMessage(); + if (errorMessage != null && errorMessage.contains("email")) { + Toast.makeText(CriarContaActivity.this, "Este email já está em uso", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(CriarContaActivity.this, "Erro ao criar conta: " + errorMessage, Toast.LENGTH_SHORT).show(); + } } }); diff --git a/app/src/main/java/com/example/vdcscore/LoginActivity.java b/app/src/main/java/com/example/vdcscore/LoginActivity.java index 622792b..579a462 100644 --- a/app/src/main/java/com/example/vdcscore/LoginActivity.java +++ b/app/src/main/java/com/example/vdcscore/LoginActivity.java @@ -3,21 +3,22 @@ package com.example.vdcscore; import android.content.Intent; import android.os.Bundle; import android.widget.Button; -import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; +import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.auth.FirebaseAuth; public class LoginActivity extends AppCompatActivity { - EditText editEmail, editPassword; + TextInputEditText editEmail, editPassword; Button btnLogin; FirebaseAuth mAuth; private TextView criarContaTextView; + private TextView txtForgotPassword; @Override protected void onCreate(Bundle savedInstanceState) { @@ -28,11 +29,13 @@ public class LoginActivity extends AppCompatActivity { editPassword = findViewById(R.id.editPassword2); btnLogin = findViewById(R.id.btnLogin); criarContaTextView = findViewById(R.id.txtRegister); + txtForgotPassword = findViewById(R.id.txtForgotPassword); mAuth = FirebaseAuth.getInstance(); btnLogin.setOnClickListener(v -> loginUser()); criarContaTextView.setOnClickListener(view -> criarConta()); + txtForgotPassword.setOnClickListener(view -> recuperarSenha()); } private void criarConta() { @@ -40,6 +43,11 @@ public class LoginActivity extends AppCompatActivity { startActivity(intent); } + private void recuperarSenha() { + Intent intent = new Intent(LoginActivity.this, RecuperarSenhaActivity.class); + startActivity(intent); + } + private void loginUser() { String email = editEmail.getText().toString().trim(); String password = editPassword.getText().toString().trim(); @@ -49,6 +57,11 @@ public class LoginActivity extends AppCompatActivity { return; } + if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + Toast.makeText(this, "Por favor, insira um email válido", Toast.LENGTH_SHORT).show(); + return; + } + mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(task -> { if (task.isSuccessful()) { @@ -60,9 +73,16 @@ public class LoginActivity extends AppCompatActivity { finish(); } else { - Toast.makeText(this, - "Erro: " + task.getException().getMessage(), - Toast.LENGTH_LONG).show(); + String errorMessage = task.getException().getMessage(); + if (errorMessage != null && errorMessage.contains("password")) { + Toast.makeText(this, + "Senha incorreta. Esqueceu a senha?", + Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this, + "Erro: " + errorMessage, + Toast.LENGTH_LONG).show(); + } } }); } diff --git a/app/src/main/java/com/example/vdcscore/RecuperarSenhaActivity.java b/app/src/main/java/com/example/vdcscore/RecuperarSenhaActivity.java new file mode 100644 index 0000000..3b8d7fc --- /dev/null +++ b/app/src/main/java/com/example/vdcscore/RecuperarSenhaActivity.java @@ -0,0 +1,72 @@ +package com.example.vdcscore; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.textfield.TextInputEditText; +import com.google.firebase.auth.FirebaseAuth; + +public class RecuperarSenhaActivity extends AppCompatActivity { + + private TextInputEditText editEmailRecover; + private Button btnSendRecovery; + private TextView txtBackToLogin; + private FirebaseAuth mAuth; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recuperar_senha); + + editEmailRecover = findViewById(R.id.editEmailRecover); + btnSendRecovery = findViewById(R.id.btnSendRecovery); + txtBackToLogin = findViewById(R.id.txtBackToLogin); + + mAuth = FirebaseAuth.getInstance(); + + btnSendRecovery.setOnClickListener(v -> sendRecoveryEmail()); + txtBackToLogin.setOnClickListener(v -> backToLogin()); + } + + private void sendRecoveryEmail() { + String email = editEmailRecover.getText().toString().trim(); + + if (email.isEmpty()) { + Toast.makeText(this, "Por favor, insira o seu email", Toast.LENGTH_SHORT).show(); + return; + } + + if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + Toast.makeText(this, "Por favor, insira um email válido", Toast.LENGTH_SHORT).show(); + return; + } + + mAuth.sendPasswordResetEmail(email) + .addOnCompleteListener(task -> { + if (task.isSuccessful()) { + Toast.makeText(this, + "Email de recuperação enviado! Verifique a sua caixa de entrada.", + Toast.LENGTH_LONG).show(); + // Voltar ao login após enviar + backToLogin(); + } else { + Toast.makeText(this, + "Erro: " + task.getException().getMessage(), + Toast.LENGTH_LONG).show(); + } + }); + } + + private void backToLogin() { + Intent intent = new Intent(RecuperarSenhaActivity.this, LoginActivity.class); + startActivity(intent); + finish(); + } +} + diff --git a/app/src/main/res/drawable/bg_gradient_login.xml b/app/src/main/res/drawable/bg_gradient_login.xml new file mode 100644 index 0000000..3d2bd99 --- /dev/null +++ b/app/src/main/res/drawable/bg_gradient_login.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/button_modern.xml b/app/src/main/res/drawable/button_modern.xml new file mode 100644 index 0000000..fe0cba6 --- /dev/null +++ b/app/src/main/res/drawable/button_modern.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/src/main/res/drawable/edit_text_focused.xml b/app/src/main/res/drawable/edit_text_focused.xml new file mode 100644 index 0000000..685bf89 --- /dev/null +++ b/app/src/main/res/drawable/edit_text_focused.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/edit_text_modern.xml b/app/src/main/res/drawable/edit_text_modern.xml new file mode 100644 index 0000000..a3d2341 --- /dev/null +++ b/app/src/main/res/drawable/edit_text_modern.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_email.xml b/app/src/main/res/drawable/ic_email.xml new file mode 100644 index 0000000..ef99fad --- /dev/null +++ b/app/src/main/res/drawable/ic_email.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..c6c2682 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/layout/activity_criarconta.xml b/app/src/main/res/layout/activity_criarconta.xml index 9b169c4..16e24bf 100644 --- a/app/src/main/res/layout/activity_criarconta.xml +++ b/app/src/main/res/layout/activity_criarconta.xml @@ -5,7 +5,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#ECEFF1" + android:background="@drawable/bg_gradient_login" android:id="@+id/main"> @@ -13,12 +13,13 @@ android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="56dp" + android:layout_marginTop="60dp" android:text="Criar Conta" - android:textSize="35sp" + android:textSize="42sp" android:textStyle="bold" + android:textColor="#FFFFFF" + android:letterSpacing="0.1" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.497" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -27,11 +28,11 @@ android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="15dp" + android:layout_marginTop="8dp" android:text="VdcScore" - android:textSize="25sp" - android:textStyle="bold" - app:layout_constraintBottom_toTopOf="@+id/cardRegister" + android:textSize="18sp" + android:textColor="#FFFFFF" + android:alpha="0.9" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> @@ -41,92 +42,172 @@ android:id="@+id/cardRegister" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="16dp" - android:elevation="10dp" - android:padding="24dp" - app:cardCornerRadius="18dp" + android:layout_margin="24dp" + android:elevation="16dp" + android:padding="0dp" + app:cardCornerRadius="24dp" app:cardUseCompatPadding="true" + app:cardBackgroundColor="#FFFFFF" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - android:layout_marginTop="80dp"> + app:layout_constraintTop_toBottomOf="@+id/textView4" + android:layout_marginTop="48dp"> + android:orientation="vertical" + android:padding="32dp"> - + + + + - + app:boxStrokeColor="#667eea" + app:hintTextColor="#667eea" + app:startIconDrawable="@drawable/ic_email" + app:startIconTint="#667eea" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + app:boxCornerRadiusTopStart="12dp" + app:boxCornerRadiusTopEnd="12dp" + app:boxCornerRadiusBottomStart="12dp" + app:boxCornerRadiusBottomEnd="12dp"> + + + + - + app:boxStrokeColor="#667eea" + app:hintTextColor="#667eea" + app:startIconDrawable="@drawable/ic_lock" + app:startIconTint="#667eea" + app:endIconMode="password_toggle" + app:endIconTint="#667eea" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + app:boxCornerRadiusTopStart="12dp" + app:boxCornerRadiusTopEnd="12dp" + app:boxCornerRadiusBottomStart="12dp" + app:boxCornerRadiusBottomEnd="12dp"> + + + + - + app:boxStrokeColor="#667eea" + app:hintTextColor="#667eea" + app:startIconDrawable="@drawable/ic_lock" + app:startIconTint="#667eea" + app:endIconMode="password_toggle" + app:endIconTint="#667eea" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + app:boxCornerRadiusTopStart="12dp" + app:boxCornerRadiusTopEnd="12dp" + app:boxCornerRadiusBottomStart="12dp" + app:boxCornerRadiusBottomEnd="12dp"> + + + +