Compare commits

..

5 Commits

12 changed files with 497 additions and 112 deletions

View File

@ -52,6 +52,7 @@ dependencies {
implementation(libs.credentials.play.services.auth) implementation(libs.credentials.play.services.auth)
implementation(libs.googleid) implementation(libs.googleid)
implementation(libs.mediarouter) implementation(libs.mediarouter)
implementation(libs.recyclerview)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.espresso.core)

View File

@ -18,18 +18,19 @@
android:name=".ui.Inicial.Criar_conta" android:name=".ui.Inicial.Criar_conta"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".ui.Inicial.iniciar_sessao" android:name=".ui.MainActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".ui.MainActivity" android:name=".ui.Inicial.iniciar_sessao"
android:exported="true" android:exported="true"
android:label="@string/app_name" > android:label="@string/app_name">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>
</manifest> </manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -1,26 +1,194 @@
package com.example.cuida.ui.Inicial; package com.example.cuida.ui.Inicial;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable;
import androidx.activity.EdgeToEdge; 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.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.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 { 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 @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_criar_conta); setContentView(R.layout.activity_criar_conta);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); mAuth = FirebaseAuth.getInstance();
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets; //... (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());
}
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();
}
}
}); });
} }
} }

View File

@ -1,26 +1,108 @@
package com.example.cuida.ui.Inicial; package com.example.cuida.ui.Inicial;
import android.content.Intent; // Importação necessária para o Intent
import android.os.Bundle; import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import com.example.cuida.R; import com.example.cuida.R;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
public class Esqueci_a_palavra_passe extends AppCompatActivity { public class Esqueci_a_palavra_passe extends AppCompatActivity {
private TextView tpTextView;
private TextView tsTextView;
private EditText emailEditText;
private Button enviarButton;
// Removi as variáveis não usadas 'voltarButtona
private Button voltarParaOLoginButton;
private FirebaseAuth mAuth;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_esqueci_apalavra_passe); setContentView(R.layout.activity_esqueci_apalavra_passe);
mAuth = FirebaseAuth.getInstance();
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets; return insets;
}); });
// Inicialização dos componentes
tpTextView = findViewById(R.id.tPTextView);
voltarParaOLoginButton = findViewById(R.id.voltarParaOLoginButton);
tsTextView = findViewById(R.id.tSTextView);
emailEditText = findViewById(R.id.emailTextEdit);
enviarButton = findViewById(R.id.enviarButton);
// Lógica para o botão de enviar e-mail
enviarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recuperarSenha();
}
});
// --- CÓDIGO ADICIONADO AQUI ---
// Lógica para o botão "Voltar para o Login"
voltarParaOLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Cria um Intent para ir da tela atual para a tela de login
Intent intent = new Intent(Esqueci_a_palavra_passe.this, iniciar_sessao.class);
startActivity(intent);
finish(); // Fecha a tela atual para que o usuário não volte para ela ao clicar "Voltar"
}
});
}
private void recuperarSenha() {
String email = emailEditText.getText().toString().trim();
if (email.isEmpty()) {
emailEditText.setError("O campo de e-mail é obrigatório.");
emailEditText.requestFocus();
return;
}
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
emailEditText.setError("Por favor, insira um e-mail válido.");
emailEditText.requestFocus();
return;
}
mAuth.sendPasswordResetEmail(email)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(Esqueci_a_palavra_passe.this,
"E-mail de redefinição de senha enviado. Verifique a sua caixa de entrada.",
Toast.LENGTH_LONG).show();
// Após enviar o e-mail, também podemos fechar a tela
finish();
} else {
Toast.makeText(Esqueci_a_palavra_passe.this,
"Falha ao enviar e-mail. Verifique se o e-mail está correto e registado.",
Toast.LENGTH_LONG).show();
}
}
});
} }
} }

View File

@ -1,6 +1,7 @@
package com.example.cuida.ui.Inicial; package com.example.cuida.ui.Inicial;
import android.content.Intent; import android.content.Intent;
import android.media.Image;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@ -10,8 +11,6 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
@ -19,61 +18,58 @@ import androidx.core.view.WindowInsetsCompat;
import com.example.cuida.R; import com.example.cuida.R;
import com.example.cuida.ui.MainActivity; import com.example.cuida.ui.MainActivity;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseAuth;
public class iniciar_sessao extends AppCompatActivity { public class iniciar_sessao extends AppCompatActivity {
private ImageView imageView; private ImageView imageView;
private EditText emailEditText; private EditText emailEditText;
private EditText palavraPasseEditText; private EditText palavraPasseEditText;
private Button entrarButton; private Button entrarButton;
private Button criarContaButton; private Button criarContaButton;
private TextView bemVindoTextView; private TextView esqueciAPalavraPasseButton;
private Button esqueciAPalavraPasseButton;
private FirebaseAuth mAuth; private FirebaseAuth mAuth;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_iniciar_sessao); setContentView(R.layout.activity_iniciar_sessao);
// Inicializar Firebase Auth
mAuth = FirebaseAuth.getInstance(); mAuth = FirebaseAuth.getInstance();
// Configuração do layout para Edge-to-Edge
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets; return insets;
}); });
// Associar as Views
imageView = findViewById(R.id.imageView); imageView = findViewById(R.id.imageView);
emailEditText = findViewById(R.id.emailEditText); emailEditText = findViewById(R.id.emailEditText);
palavraPasseEditText = findViewById(R.id.palavraPasseEditText); palavraPasseEditText = findViewById(R.id.palavraPasseEditText);
entrarButton = findViewById(R.id.entarButton); entrarButton = findViewById(R.id.entarButton);
criarContaButton = findViewById(R.id.criarContaButton); criarContaButton = findViewById(R.id.criarContaButton);
bemVindoTextView = findViewById(R.id.bemVindoTextView); esqueciAPalavraPasseButton = findViewById(R.id.esqueciAPalavraPasseButton);
entrarButton.setOnClickListener(v -> iniciarSessao());
// Definir o listener para o botão de criar conta
criarContaButton.setOnClickListener(v -> { criarContaButton.setOnClickListener(v -> {
// Chama o método para criar a conta Intent intent = new Intent(iniciar_sessao.this, Criar_conta.class);
criarConta(); startActivity(intent);
});
esqueciAPalavraPasseButton.setOnClickListener(v -> {
Intent intent = new Intent(iniciar_sessao.this, Esqueci_a_palavra_passe.class);
startActivity(intent);
}); });
} }
/** private void iniciarSessao() {
* Método para criar uma nova conta de utilizador.
*/
private void criarConta() {
String email = emailEditText.getText().toString().trim(); String email = emailEditText.getText().toString().trim();
String password = palavraPasseEditText.getText().toString().trim(); String password = palavraPasseEditText.getText().toString().trim();
// 1. Validar as entradas do utilizador
if (email.isEmpty()) { if (email.isEmpty()) {
emailEditText.setError("O e-mail é obrigatório"); emailEditText.setError("O e-mail é obrigatório");
emailEditText.requestFocus(); emailEditText.requestFocus();
@ -86,40 +82,23 @@ public class iniciar_sessao extends AppCompatActivity {
return; return;
} }
if (password.length() < 6) { mAuth.signInWithEmailAndPassword(email, password)
palavraPasseEditText.setError("A palavra-passe deve ter no mínimo 6 caracteres");
palavraPasseEditText.requestFocus();
return;
}
// 2. Criar o utilizador no Firebase
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, task -> { .addOnCompleteListener(this, task -> {
if (task.isSuccessful()) { if (task.isSuccessful()) {
// Se o registo for bem-sucedido Log.d("FIREBASE_AUTH", "signInWithEmail:success");
Log.d("FIREBASE_AUTH", "createUserWithEmail:success"); Toast.makeText(iniciar_sessao.this, "Login bem-sucedido.", Toast.LENGTH_SHORT).show();
Toast.makeText(iniciar_sessao.this, "Conta criada com sucesso.", Toast.LENGTH_SHORT).show();
// Navega para a MainActivity
navegarParaMainActivity(); navegarParaMainActivity();
} else { } else {
// Se o registo falhar Log.w("FIREBASE_AUTH", "signInWithEmail:failure", task.getException());
Log.w("FIREBASE_AUTH", "createUserWithEmail:failure", task.getException()); Toast.makeText(iniciar_sessao.this, "Falha na autenticação. Verifique suas credenciais.", Toast.LENGTH_LONG).show();
// Mostra uma mensagem de erro mais específica
String errorMessage = task.getException() != null ? task.getException().getMessage() : "Erro desconhecido.";
Toast.makeText(iniciar_sessao.this, "Falha na autenticação: " + errorMessage, Toast.LENGTH_LONG).show();
} }
}); });
} }
/**
* Navega para a MainActivity e limpa a pilha de atividades.
*/
private void navegarParaMainActivity() { private void navegarParaMainActivity() {
Intent intent = new Intent(iniciar_sessao.this, MainActivity.class); Intent intent = new Intent(iniciar_sessao.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent); startActivity(intent);
finish(); // Finaliza a atividade atual finish();
} }
} }

View File

@ -8,13 +8,111 @@
tools:context=".ui.Inicial.Criar_conta"> tools:context=".ui.Inicial.Criar_conta">
<TextView <TextView
android:id="@+id/textView3" android:id="@+id/criarContaTextView"
android:layout_width="wrap_content" android:layout_width="170dp"
android:layout_height="wrap_content" android:layout_height="49dp"
android:layout_marginTop="28dp"
android:text="Criar conta" android:text="Criar conta"
android:textColor="#020202" android:textColor="#020202"
android:textSize="34sp" android:textSize="34sp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/nomeApelidoEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="50dp"
android:ems="10"
android:hint="Nome e Apelido"
android:inputType="text"
app:layout_constraintEnd_toEndOf="@+id/criarContaTextView"
app:layout_constraintStart_toStartOf="@+id/criarContaTextView"
app:layout_constraintTop_toBottomOf="@+id/criarContaTextView" />
<EditText
android:id="@+id/gmailEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Gmail"
android:inputType="textEmailAddress"
app:layout_constraintEnd_toEndOf="@+id/nomeApelidoEditText"
app:layout_constraintStart_toStartOf="@+id/nomeApelidoEditText"
app:layout_constraintTop_toBottomOf="@+id/nomeApelidoEditText" />
<EditText
android:id="@+id/telemovelEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Nº de telemovel"
android:inputType="phone"
app:layout_constraintEnd_toEndOf="@+id/gmailEditText"
app:layout_constraintStart_toStartOf="@+id/gmailEditText"
app:layout_constraintTop_toBottomOf="@+id/gmailEditText" />
<EditText
android:id="@+id/confirmarPalavraPasseEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Confirmar Palavra-Passe"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="@+id/palavraPasseEditText"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/palavraPasseEditText"
app:layout_constraintTop_toBottomOf="@+id/palavraPasseEditText" />
<EditText
android:id="@+id/palavraPasseEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Palavra-Passe"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="@+id/dataEditText"
app:layout_constraintStart_toStartOf="@+id/dataEditText"
app:layout_constraintTop_toBottomOf="@+id/dataEditText" />
<EditText
android:id="@+id/moradaEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="morada"
android:inputType="text"
app:layout_constraintEnd_toEndOf="@+id/telemovelEditText"
app:layout_constraintStart_toStartOf="@+id/telemovelEditText"
app:layout_constraintTop_toBottomOf="@+id/telemovelEditText" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/CriarContaButton"
android:layout_width="200dp"
android:layout_height="50dp"
android:layout_marginTop="50dp"
android:background="@color/blue"
android:text="Criar Conta"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="@+id/confirmarPalavraPasseEditText"
app:layout_constraintStart_toStartOf="@+id/confirmarPalavraPasseEditText"
app:layout_constraintTop_toBottomOf="@+id/confirmarPalavraPasseEditText" />
<EditText
android:id="@+id/dataEditText"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Data de nascimento"
android:inputType="date"
app:layout_constraintEnd_toEndOf="@+id/moradaEditText"
app:layout_constraintStart_toStartOf="@+id/moradaEditText"
app:layout_constraintTop_toBottomOf="@+id/moradaEditText" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,4 +7,64 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.Inicial.Esqueci_a_palavra_passe"> tools:context=".ui.Inicial.Esqueci_a_palavra_passe">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/enviarButton"
android:layout_width="196dp"
android:layout_height="47dp"
android:layout_marginTop="28dp"
android:background="@color/blue"
android:text="Enviar"
android:textColor="#F2EFEF"
app:layout_constraintEnd_toEndOf="@+id/emailTextEdit"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/emailTextEdit"
app:layout_constraintTop_toBottomOf="@+id/emailTextEdit" />
<TextView
android:id="@+id/tPTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="260dp"
android:text="Esqueci a palavra passe"
android:textSize="34sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tSTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="usa o email para recuperar a sua palavra-passe"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="@+id/tPTextView"
app:layout_constraintHorizontal_bias="0.785"
app:layout_constraintStart_toStartOf="@+id/tPTextView"
app:layout_constraintTop_toBottomOf="@+id/tPTextView" />
<EditText
android:id="@+id/emailTextEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:ems="10"
android:hint="Email"
android:inputType="textEmailAddress"
app:layout_constraintEnd_toEndOf="@+id/tSTextView"
app:layout_constraintStart_toStartOf="@+id/tSTextView"
app:layout_constraintTop_toBottomOf="@+id/tSTextView" />
<TextView
android:id="@+id/voltarParaOLoginButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="voltar para o login"
android:textColor="@color/black"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="@+id/enviarButton"
app:layout_constraintStart_toStartOf="@+id/enviarButton"
app:layout_constraintTop_toBottomOf="@+id/enviarButton" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,47 +7,28 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.Inicial.iniciar_sessao"> tools:context=".ui.Inicial.iniciar_sessao">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="100dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="100dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars" />
<EditText <EditText
android:id="@+id/emailEditText" android:id="@+id/emailEditText"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_marginStart="100dp" android:layout_marginTop="12dp"
android:layout_marginTop="112dp"
android:layout_marginEnd="100dp"
android:ems="10" android:ems="10"
android:hint="Email" android:hint="Email"
android:inputType="textEmailAddress" android:inputType="textEmailAddress"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="@+id/textView"
app:layout_constraintHorizontal_bias="0.505" app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="@+id/textView"
app:layout_constraintTop_toBottomOf="@+id/imageView" /> app:layout_constraintTop_toBottomOf="@+id/textView" />
<EditText <EditText
android:id="@+id/palavraPasseEditText" android:id="@+id/palavraPasseEditText"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_marginStart="100dp"
android:layout_marginTop="12dp"
android:layout_marginEnd="100dp"
android:ems="10" android:ems="10"
android:hint="Palavra-Passe" android:hint="Palavra-Passe"
android:inputType="textPassword" android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="@+id/emailEditText"
app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="@+id/emailEditText"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/emailEditText" /> app:layout_constraintTop_toBottomOf="@+id/emailEditText" />
<androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton
@ -55,19 +36,19 @@
android:layout_width="250dp" android:layout_width="250dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_marginStart="100dp" android:layout_marginStart="100dp"
android:layout_marginTop="44dp" android:layout_marginTop="12dp"
android:layout_marginEnd="100dp" android:layout_marginEnd="100dp"
android:background="#2196F3" android:background="#2196F3"
android:backgroundTint="#000000" android:backgroundTint="@color/black"
android:shadowColor="#03A9F4" android:shadowColor="#03A9F4"
android:text="Entrar" android:text="Entrar"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textColorHighlight="#03A9F4" android:textColorHighlight="#03A9F4"
android:textColorHint="#03A9F4" android:textColorHint="#03A9F4"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.515" app:layout_constraintHorizontal_bias="0.512"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/palavraPasseEditText" app:layout_constraintTop_toBottomOf="@+id/esqueciAPalavraPasseButton"
app:rippleColor="#03A9F4" app:rippleColor="#03A9F4"
app:strokeColor="#03A9F4" /> app:strokeColor="#03A9F4" />
@ -86,22 +67,35 @@
android:id="@+id/criarContaButton" android:id="@+id/criarContaButton"
android:layout_width="250dp" android:layout_width="250dp"
android:layout_height="45dp" android:layout_height="45dp"
android:layout_marginTop="12dp"
android:backgroundTint="#FFFFFF" android:backgroundTint="#FFFFFF"
android:text="Criar conta" android:text="Criar conta"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/entarButton" app:layout_constraintEnd_toEndOf="@+id/entarButton"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/entarButton" app:layout_constraintStart_toStartOf="@+id/entarButton"
app:layout_constraintTop_toBottomOf="@+id/entarButton" /> app:layout_constraintTop_toBottomOf="@+id/entarButton"
app:layout_constraintVertical_bias="0.04" />
<TextView <TextView
android:id="@+id/bemVindoTextView" android:id="@+id/textView"
android:layout_width="wrap_content" android:layout_width="144dp"
android:layout_height="wrap_content" android:layout_height="37dp"
android:layout_marginTop="24dp" android:layout_marginTop="8dp"
android:text="BEM VINDO" android:text="bem vindo"
android:textSize="34sp" android:textSize="30sp"
app:layout_constraintEnd_toEndOf="@+id/imageView" app:layout_constraintEnd_toEndOf="@+id/imageView"
app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintStart_toStartOf="@+id/imageView"
app:layout_constraintTop_toBottomOf="@+id/imageView" /> app:layout_constraintTop_toBottomOf="@+id/imageView" />
<ImageView
android:id="@+id/imageView"
android:layout_width="144dp"
android:layout_height="148dp"
android:layout_marginTop="172dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@mipmap/img_cuida" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,11 +7,6 @@
android:icon="@drawable/ic_home_black_24dp" android:icon="@drawable/ic_home_black_24dp"
android:title="@string/title_home" /> android:title="@string/title_home" />
<item
android:id="@+id/app_bar_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:actionViewClass="android.widget.SearchView" />
<item <item
android:id="@+id/navigation_dashboard" android:id="@+id/navigation_dashboard"
android:icon="@drawable/ic_dashboard_black_24dp" android:icon="@drawable/ic_dashboard_black_24dp"

View File

@ -5,6 +5,11 @@
<color name="purple_700">#FF3700B3</color> <color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color> <color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color> <color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="black">#FF000000</color> <!-- Em vez de "preto" -->
<color name="white">#FFFFFFFF</color> <!-- Em vez de "branco" -->
<color name="blue">#FF2196F3</color>
<!-- LINHA A ADICIONAR PARA CORRIGIR O ERRO -->
<color name="img_cuida_background">#FFFFFFFF</color>
</resources> </resources>

View File

@ -1,5 +1,5 @@
[versions] [versions]
agp = "8.13.1" agp = "8.13.2"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.3.0" junitVersion = "1.3.0"
espressoCore = "3.7.0" espressoCore = "3.7.0"
@ -19,6 +19,7 @@ credentials = "1.5.0"
credentialsPlayServicesAuth = "1.5.0" credentialsPlayServicesAuth = "1.5.0"
googleid = "1.1.1" googleid = "1.1.1"
mediarouter = "1.8.1" mediarouter = "1.8.1"
recyclerview = "1.4.0"
[libraries] [libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" } junit = { group = "junit", name = "junit", version.ref = "junit" }
@ -39,6 +40,7 @@ credentials = { group = "androidx.credentials", name = "credentials", version.re
credentials-play-services-auth = { group = "androidx.credentials", name = "credentials-play-services-auth", version.ref = "credentialsPlayServicesAuth" } credentials-play-services-auth = { group = "androidx.credentials", name = "credentials-play-services-auth", version.ref = "credentialsPlayServicesAuth" }
googleid = { group = "com.google.android.libraries.identity.googleid", name = "googleid", version.ref = "googleid" } googleid = { group = "com.google.android.libraries.identity.googleid", name = "googleid", version.ref = "googleid" }
mediarouter = { group = "androidx.mediarouter", name = "mediarouter", version.ref = "mediarouter" } mediarouter = { group = "androidx.mediarouter", name = "mediarouter", version.ref = "mediarouter" }
recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }