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">
+
+
+
+
+ android:textColor="#FFFFFF"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ android:elevation="4dp"
+ android:stateListAnimator="@null" />
-
+ app:layout_constraintTop_toBottomOf="@+id/cardRegister">
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index ecbf7f6..c4e92a1 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -5,97 +5,195 @@
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">
+
+
+
+
+
+
-
-
+ app:layout_constraintTop_toBottomOf="@+id/textViewSubtitle"
+ 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">
+
+
+
+
+
+
+
+ android:textColor="#FFFFFF"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ android:elevation="4dp"
+ android:stateListAnimator="@null" />
-
+
+ app:layout_constraintTop_toBottomOf="@+id/cardLogin">
-
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_recuperar_senha.xml b/app/src/main/res/layout/activity_recuperar_senha.xml
new file mode 100644
index 0000000..26d760d
--- /dev/null
+++ b/app/src/main/res/layout/activity_recuperar_senha.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+