diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a6f427e..f3e3b37 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { alias(libs.plugins.android.application) + alias(libs.plugins.google.gms.google.services) } android { @@ -44,6 +45,13 @@ dependencies { implementation(libs.navigation.fragment) implementation(libs.navigation.ui) implementation(libs.activity) + implementation(libs.firebase.ai) + implementation(libs.camera.camera2.pipe) + implementation(libs.firebase.auth) + implementation(libs.credentials) + implementation(libs.credentials.play.services.auth) + implementation(libs.googleid) + implementation(libs.mediarouter) testImplementation(libs.junit) androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5803284..aef0ca7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,10 +12,16 @@ android:supportsRtl="true" android:theme="@style/Theme.Cuida" > + + diff --git a/app/src/main/java/com/example/cuida/ui/iniciar_sessao.java b/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java similarity index 83% rename from app/src/main/java/com/example/cuida/ui/iniciar_sessao.java rename to app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java index 7ce7e97..36ed63b 100644 --- a/app/src/main/java/com/example/cuida/ui/iniciar_sessao.java +++ b/app/src/main/java/com/example/cuida/ui/Inicial/Criar_conta.java @@ -1,4 +1,4 @@ -package com.example.cuida.ui; +package com.example.cuida.ui.Inicial; import android.os.Bundle; @@ -10,13 +10,13 @@ import androidx.core.view.WindowInsetsCompat; import com.example.cuida.R; -public class iniciar_sessao extends AppCompatActivity { +public class Criar_conta extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_iniciar_sessao); + 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); diff --git a/app/src/main/java/com/example/cuida/ui/Inicial/Esqueci_a_palavra_passe.java b/app/src/main/java/com/example/cuida/ui/Inicial/Esqueci_a_palavra_passe.java new file mode 100644 index 0000000..d3b757a --- /dev/null +++ b/app/src/main/java/com/example/cuida/ui/Inicial/Esqueci_a_palavra_passe.java @@ -0,0 +1,26 @@ +package com.example.cuida.ui.Inicial; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +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; + +public class Esqueci_a_palavra_passe extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_esqueci_apalavra_passe); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cuida/ui/Inicial/iniciar_sessao.java b/app/src/main/java/com/example/cuida/ui/Inicial/iniciar_sessao.java new file mode 100644 index 0000000..1e3ebf1 --- /dev/null +++ b/app/src/main/java/com/example/cuida/ui/Inicial/iniciar_sessao.java @@ -0,0 +1,125 @@ +package com.example.cuida.ui.Inicial; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +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.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.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; + +public class iniciar_sessao extends AppCompatActivity { + private ImageView imageView; + private EditText emailEditText; + private EditText palavraPasseEditText; + private Button entrarButton; + private Button criarContaButton; + private TextView bemVindoTextView; + private Button esqueciAPalavraPasseButton; + + private FirebaseAuth mAuth; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_iniciar_sessao); + + // Inicializar Firebase Auth + mAuth = FirebaseAuth.getInstance(); + + // Configuração do layout para Edge-to-Edge + 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; + }); + + // Associar as Views + imageView = findViewById(R.id.imageView); + emailEditText = findViewById(R.id.emailEditText); + palavraPasseEditText = findViewById(R.id.palavraPasseEditText); + entrarButton = findViewById(R.id.entarButton); + criarContaButton = findViewById(R.id.criarContaButton); + bemVindoTextView = findViewById(R.id.bemVindoTextView); + + // Definir o listener para o botão de criar conta + criarContaButton.setOnClickListener(v -> { + // Chama o método para criar a conta + criarConta(); + }); + } + + /** + * Método para criar uma nova conta de utilizador. + */ + private void criarConta() { + String email = emailEditText.getText().toString().trim(); + String password = palavraPasseEditText.getText().toString().trim(); + + // 1. Validar as entradas do utilizador + if (email.isEmpty()) { + emailEditText.setError("O e-mail é obrigatório"); + emailEditText.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; + } + + // 2. Criar o utilizador no Firebase + mAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(this, task -> { + if (task.isSuccessful()) { + // Se o registo for bem-sucedido + Log.d("FIREBASE_AUTH", "createUserWithEmail:success"); + Toast.makeText(iniciar_sessao.this, "Conta criada com sucesso.", Toast.LENGTH_SHORT).show(); + + // Navega para a MainActivity + navegarParaMainActivity(); + + } else { + // Se o registo falhar + Log.w("FIREBASE_AUTH", "createUserWithEmail:failure", task.getException()); + // 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() { + Intent intent = new Intent(iniciar_sessao.this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + finish(); // Finaliza a atividade atual + } +} diff --git a/app/src/main/java/com/example/cuida/MainActivity.java b/app/src/main/java/com/example/cuida/ui/MainActivity.java similarity index 89% rename from app/src/main/java/com/example/cuida/MainActivity.java rename to app/src/main/java/com/example/cuida/ui/MainActivity.java index d32294d..15b8795 100644 --- a/app/src/main/java/com/example/cuida/MainActivity.java +++ b/app/src/main/java/com/example/cuida/ui/MainActivity.java @@ -1,7 +1,8 @@ -package com.example.cuida; +package com.example.cuida.ui; import android.os.Bundle; +import com.example.cuida.R; import com.google.android.material.bottomnavigation.BottomNavigationView; import androidx.appcompat.app.AppCompatActivity; @@ -27,7 +28,7 @@ public class MainActivity extends AppCompatActivity { // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( - R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications) + R.id.navigation_inicio, R.id.navigation_dashboard, R.id.navigation_notifications) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); diff --git a/app/src/main/res/layout/activity_criar_conta.xml b/app/src/main/res/layout/activity_criar_conta.xml new file mode 100644 index 0000000..01e6cda --- /dev/null +++ b/app/src/main/res/layout/activity_criar_conta.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_esqueci_apalavra_passe.xml b/app/src/main/res/layout/activity_esqueci_apalavra_passe.xml new file mode 100644 index 0000000..aaff33d --- /dev/null +++ b/app/src/main/res/layout/activity_esqueci_apalavra_passe.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_iniciar_sessao.xml b/app/src/main/res/layout/activity_iniciar_sessao.xml index fad58ee..69a7cfd 100644 --- a/app/src/main/res/layout/activity_iniciar_sessao.xml +++ b/app/src/main/res/layout/activity_iniciar_sessao.xml @@ -5,6 +5,103 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.iniciar_sessao"> + tools:context=".ui.Inicial.iniciar_sessao"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3825f7e..b5d9cad 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,4 +30,5 @@ app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/mobile_navigation" /> - \ No newline at end of file + + diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index fb6d040..a058270 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -1,11 +1,17 @@ - + + + app:startDestination="@+id/navigation_inicio"> diff --git a/build.gradle.kts b/build.gradle.kts index 3756278..c4f8066 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.android.application) apply false + alias(libs.plugins.google.gms.google.services) apply false } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fab7b9e..d983ad4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,6 +11,14 @@ lifecycleViewmodelKtx = "2.6.1" navigationFragment = "2.6.0" navigationUi = "2.6.0" activity = "1.11.0" +googleGmsGoogleServices = "4.4.4" +firebaseAi = "17.6.0" +cameraCamera2Pipe = "1.6.0-alpha01" +firebaseAuth = "24.0.1" +credentials = "1.5.0" +credentialsPlayServicesAuth = "1.5.0" +googleid = "1.1.1" +mediarouter = "1.8.1" [libraries] junit = { group = "junit", name = "junit", version.ref = "junit" } @@ -24,7 +32,15 @@ lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-view navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" } navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigationUi" } activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } +firebase-ai = { group = "com.google.firebase", name = "firebase-ai", version.ref = "firebaseAi" } +camera-camera2-pipe = { group = "androidx.camera", name = "camera-camera2-pipe", version.ref = "cameraCamera2Pipe" } +firebase-auth = { group = "com.google.firebase", name = "firebase-auth", version.ref = "firebaseAuth" } +credentials = { group = "androidx.credentials", name = "credentials", version.ref = "credentials" } +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" } +mediarouter = { group = "androidx.mediarouter", name = "mediarouter", version.ref = "mediarouter" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } +google-gms-google-services = { id = "com.google.gms.google-services", version.ref = "googleGmsGoogleServices" }