From 661bbaab46838c7079f85f2876f8f440d51a6786 Mon Sep 17 00:00:00 2001 From: 230415 <230415@epvc.pt> Date: Fri, 12 Dec 2025 10:42:06 +0000 Subject: [PATCH] google --- app/build.gradle.kts | 4 +- app/google-services.json | 22 ++- .../example/lifegrid/CriarContaActivity.java | 41 ---- .../com/example/lifegrid/LoginActivity.java | 179 +++++++++++++----- app/src/main/res/values/strings.xml | 1 - 5 files changed, 155 insertions(+), 92 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a15fd02..5a9b8ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -27,8 +27,8 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } } diff --git a/app/google-services.json b/app/google-services.json index c40df5d..840d351 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -12,7 +12,20 @@ "package_name": "com.example.lifegrid" } }, - "oauth_client": [], + "oauth_client": [ + { + "client_id": "1019731295596-i3q6aprqj6s55g6s97tpopbk4foutold.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.example.lifegrid", + "certificate_hash": "d0d27537414e1e5c5f0dd3bf224dbf819e70668b" + } + }, + { + "client_id": "1019731295596-llnufhs1t24ijo7afa5c85lkc98pk27q.apps.googleusercontent.com", + "client_type": 3 + } + ], "api_key": [ { "current_key": "AIzaSyAbQ_-mob81SR07481CSJHP_z3GniS-xdk" @@ -20,7 +33,12 @@ ], "services": { "appinvite_service": { - "other_platform_oauth_client": [] + "other_platform_oauth_client": [ + { + "client_id": "1019731295596-llnufhs1t24ijo7afa5c85lkc98pk27q.apps.googleusercontent.com", + "client_type": 3 + } + ] } } } diff --git a/app/src/main/java/com/example/lifegrid/CriarContaActivity.java b/app/src/main/java/com/example/lifegrid/CriarContaActivity.java index 0a08dfc..19f3372 100644 --- a/app/src/main/java/com/example/lifegrid/CriarContaActivity.java +++ b/app/src/main/java/com/example/lifegrid/CriarContaActivity.java @@ -69,7 +69,6 @@ public class CriarContaActivity extends AppCompatActivity { credentialManager = CredentialManager.create(this); loginButton2.setOnClickListener(v -> criarConta()); - googleButton2.setOnClickListener(v -> signInWithGoogle()); } private void criarConta() { @@ -176,46 +175,6 @@ public class CriarContaActivity extends AppCompatActivity { return true; } - private void signInWithGoogle() { - String webClientId = getString(R.string.default_web_client_id); - - if (webClientId.equals("YOUR_WEB_CLIENT_ID_HERE")) { - Toast.makeText(this, "Por favor, configure o Web Client ID no Firebase Console.", Toast.LENGTH_LONG).show(); - return; - } - - GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() - .setFilterByAuthorizedAccounts(false) - .setServerClientId(webClientId) - .build(); - - GetCredentialRequest request = new GetCredentialRequest.Builder() - .addCredentialOption(googleIdOption) - .build(); - - toggleLoading(true); - - credentialManager.getCredential( - this, - request, - null - ); - } - - private void handleGoogleSignInResult(GetCredentialResponse result) { - Credential credential = result.getCredential(); - - if (credential instanceof CustomCredential) { - CustomCredential customCredential = (CustomCredential) credential; - if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(customCredential.getType())) { - GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential - .createFrom(customCredential.getData()); - String idToken = googleIdTokenCredential.getIdToken(); - firebaseAuthWithGoogle(idToken); - } - } - } - private void firebaseAuthWithGoogle(String idToken) { AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); firebaseAuth.signInWithCredential(credential) diff --git a/app/src/main/java/com/example/lifegrid/LoginActivity.java b/app/src/main/java/com/example/lifegrid/LoginActivity.java index 7b91062..7f33a19 100644 --- a/app/src/main/java/com/example/lifegrid/LoginActivity.java +++ b/app/src/main/java/com/example/lifegrid/LoginActivity.java @@ -2,7 +2,11 @@ package com.example.lifegrid; import android.content.Intent; import android.os.Bundle; +import android.os.CancellationSignal; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; import android.util.Patterns; import android.view.View; import android.widget.Button; @@ -12,17 +16,21 @@ 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 androidx.credentials.ClearCredentialStateRequest; import androidx.credentials.CredentialManager; import androidx.credentials.Credential; +import androidx.credentials.CredentialManagerCallback; import androidx.credentials.CustomCredential; import androidx.credentials.GetCredentialRequest; import androidx.credentials.GetCredentialResponse; +import androidx.credentials.exceptions.ClearCredentialException; import androidx.credentials.exceptions.GetCredentialException; import androidx.credentials.exceptions.NoCredentialException; @@ -35,6 +43,8 @@ import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; +import java.util.concurrent.Executors; + public class LoginActivity extends AppCompatActivity { private TextView textView5; @@ -51,6 +61,11 @@ public class LoginActivity extends AppCompatActivity { private ProgressBar loadingProgressBar; private FirebaseAuth firebaseAuth; private CredentialManager credentialManager; + private FirebaseAuth mAuth; + + private static final String TAG = "LoginActivity - Google Sign In"; + private static final String GOOGLE_ID_TOKEN_CREDENTIAL = "1019731295596-i3q6aprqj6s55g6s97tpopbk4foutold.apps.googleusercontent.com"; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -76,10 +91,13 @@ public class LoginActivity extends AppCompatActivity { loadingProgressBar = findViewById(R.id.loadingProgressBar); FirebaseApp.initializeApp(this); - firebaseAuth = FirebaseAuth.getInstance(); - credentialManager = CredentialManager.create(this); + mAuth = FirebaseAuth.getInstance(); + credentialManager = CredentialManager.create(getBaseContext()); + loginButton.setOnClickListener(v -> validarLogin()); + googleButton.setOnClickListener(v -> launchCredentialManager()); + criarContaTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -87,21 +105,49 @@ public class LoginActivity extends AppCompatActivity { startActivity(intent); } }); + + // Inicialmente desabilitar o TextView de recuperar senha + passesquecerTextView.setEnabled(false); + passesquecerTextView.setAlpha(0.5f); // Visualmente mais claro quando desabilitado + passesquecerTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String email = emailEditText.getText().toString().trim(); - Intent intent = new Intent(LoginActivity.this, RecupearPasswordActivity.class); - // Passar o email digitado no login para a atividade de recuperação - if (!TextUtils.isEmpty(email)) { - intent.putExtra("email", email); + + // Validar se há email antes de abrir a atividade de recuperação + if (TextUtils.isEmpty(email)) { + emailEditText.setError("Por favor, digite seu email primeiro."); + emailEditText.requestFocus(); + Toast.makeText(LoginActivity.this, "Digite seu email para recuperar a senha.", Toast.LENGTH_SHORT).show(); + return; } + + Intent intent = new Intent(LoginActivity.this, RecupearPasswordActivity.class); + intent.putExtra("email", email); startActivity(intent); } }); - googleButton.setOnClickListener(v -> signInWithGoogle()); + + // Adicionar TextWatcher para habilitar/desabilitar o TextView dinamicamente + emailEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + String email = s.toString().trim(); + boolean hasEmail = !TextUtils.isEmpty(email); + passesquecerTextView.setEnabled(hasEmail); + passesquecerTextView.setAlpha(hasEmail ? 1.0f : 0.5f); + } + + @Override + public void afterTextChanged(Editable s) {} + }); } + private void validarLogin() { String email = emailEditText.getText().toString().trim(); String password = passwordEditText.getText().toString(); @@ -187,45 +233,6 @@ public class LoginActivity extends AppCompatActivity { return true; } - private void signInWithGoogle() { - String webClientId = getString(R.string.default_web_client_id); - - if (webClientId.equals("YOUR_WEB_CLIENT_ID_HERE")) { - Toast.makeText(this, "Por favor, configure o Web Client ID no Firebase Console.", Toast.LENGTH_LONG).show(); - return; - } - - GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() - .setFilterByAuthorizedAccounts(false) - .setServerClientId(webClientId) - .build(); - - GetCredentialRequest request = new GetCredentialRequest.Builder() - .addCredentialOption(googleIdOption) - .build(); - - toggleLoading(true); - - credentialManager.getCredential( - this, - request, - null - ); - } - - private void handleGoogleSignInResult(GetCredentialResponse result) { - Credential credential = result.getCredential(); - - if (credential instanceof CustomCredential) { - CustomCredential customCredential = (CustomCredential) credential; - if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(customCredential.getType())) { - GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential - .createFrom(customCredential.getData()); - String idToken = googleIdTokenCredential.getIdToken(); - firebaseAuthWithGoogle(idToken); - } - } - } private void firebaseAuthWithGoogle(String idToken) { AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); @@ -259,4 +266,84 @@ public class LoginActivity extends AppCompatActivity { criarContaTextView.setEnabled(!show); passesquecerTextView.setEnabled(!show); } + + private void launchCredentialManager() { + // [START create_credential_manager_request] + // Instantiate a Google sign-in request + GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() + .setFilterByAuthorizedAccounts(true) + .setServerClientId(getString(R.string.default_web_client_id)) + .build(); + + // Create the Credential Manager request + GetCredentialRequest request = new GetCredentialRequest.Builder() + .addCredentialOption(googleIdOption) + .build(); + // [END create_credential_manager_request] + + // Launch Credential Manager UI + credentialManager.getCredentialAsync( + getBaseContext(), + request, + new CancellationSignal(), + Executors.newSingleThreadExecutor(), + new CredentialManagerCallback<>() { + @Override + public void onResult(GetCredentialResponse result) { + // Extract credential from the result returned by Credential Manager + handleSignIn(result.getCredential()); + } + + @Override + public void onError(GetCredentialException e) { + Log.e(TAG, "Couldn't retrieve user's credentials: " + e.getLocalizedMessage()); + } + } + ); + } + + private void handleSignIn(Credential credential) { + // Check if credential is of type Google ID + if (credential instanceof CustomCredential customCredential + && credential.getType().equals(GOOGLE_ID_TOKEN_CREDENTIAL)) { + // Create Google ID Token + Bundle credentialData = customCredential.getData(); + GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credentialData); + + // Sign in to Firebase with using the token + firebaseAuthWithGoogle(googleIdTokenCredential.getIdToken()); + } else { + Log.w(TAG, "Credential is not of type Google ID!"); + } + } + + private void signOut() { + // Firebase sign out + mAuth.signOut(); + + // When a user signs out, clear the current user credential state from all credential providers. + ClearCredentialStateRequest clearRequest = new ClearCredentialStateRequest(); + credentialManager.clearCredentialStateAsync( + clearRequest, + new CancellationSignal(), + Executors.newSingleThreadExecutor(), + new CredentialManagerCallback<>() { + @Override + public void onResult(@NonNull Void result) { + //updateUI(null); + } + + @Override + public void onError(@NonNull ClearCredentialException e) { + Log.e(TAG, "Couldn't clear user credentials: " + e.getLocalizedMessage()); + } + }); + } + + @Override + public void onStart() { + super.onStart(); + // Check if user is signed in (non-null) and update UI accordingly. + FirebaseUser currentUser = mAuth.getCurrentUser(); + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ccee7cd..9047b3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,4 @@ LifeGrid - 1019731295596-llnufhs1t24ijo7afa5c85lkc98pk27q.apps.googleusercontent.com \ No newline at end of file