From dacee0a8343b89467d5aa7be838902b55c98261f Mon Sep 17 00:00:00 2001 From: 230415 <230415@epvc.pt> Date: Tue, 28 Apr 2026 17:15:46 +0100 Subject: [PATCH] a mudar design --- .../example/lifegrid/DefinicoesActivity.java | 63 ++++++++- .../com/example/lifegrid/LoginActivity.java | 9 +- .../example/lifegrid/TelaInicialActivity.java | 68 ++++++++-- .../example/lifegrid/menu/HomeFragment.java | 33 +++++ .../main/res/layout/activity_tela_inicial.xml | 121 +++++++++++------- .../main/res/layout/fragment_documentos.xml | 18 +-- app/src/main/res/layout/fragment_home.xml | 82 ++++++++++++ app/src/main/res/layout/item_transacao.xml | 17 +++ 8 files changed, 333 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/com/example/lifegrid/menu/HomeFragment.java create mode 100644 app/src/main/res/layout/fragment_home.xml diff --git a/app/src/main/java/com/example/lifegrid/DefinicoesActivity.java b/app/src/main/java/com/example/lifegrid/DefinicoesActivity.java index 1651192..7a77fa9 100644 --- a/app/src/main/java/com/example/lifegrid/DefinicoesActivity.java +++ b/app/src/main/java/com/example/lifegrid/DefinicoesActivity.java @@ -11,11 +11,17 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import android.content.Context; +import android.content.SharedPreferences; +import android.net.Uri; + import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; @@ -27,6 +33,12 @@ public class DefinicoesActivity extends AppCompatActivity { private EditText etUsername; private Switch switchNotifications; private Spinner spinnerCurrency; + + private ImageView ivProfilePicture; + private TextView tvChangePhoto; + private Uri selectedImageUri; + + private ActivityResultLauncher pickImageLauncher; @Override protected void onCreate(Bundle savedInstanceState) { @@ -46,9 +58,40 @@ public class DefinicoesActivity extends AppCompatActivity { switchNotifications = findViewById(R.id.switchNotifications); spinnerCurrency = findViewById(R.id.spinnerCurrency); - FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); - if (user != null && user.getDisplayName() != null && !user.getDisplayName().isEmpty()) { - etUsername.setText(user.getDisplayName()); + ivProfilePicture = findViewById(R.id.ivProfilePicture); + tvChangePhoto = findViewById(R.id.tvChangePhoto); + + pickImageLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(), + uri -> { + if (uri != null) { + selectedImageUri = uri; + ivProfilePicture.setImageURI(uri); + } + }); + + tvChangePhoto.setOnClickListener(v -> pickImageLauncher.launch("image/*")); + ivProfilePicture.setOnClickListener(v -> pickImageLauncher.launch("image/*")); + + SharedPreferences prefs = getSharedPreferences("LifeGridPrefs", Context.MODE_PRIVATE); + String savedName = prefs.getString("username", ""); + String savedPhotoUri = prefs.getString("profile_photo_uri", ""); + + if (!savedPhotoUri.isEmpty()) { + selectedImageUri = Uri.parse(savedPhotoUri); + try { + ivProfilePicture.setImageURI(selectedImageUri); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (!savedName.isEmpty()) { + etUsername.setText(savedName); + } else { + FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); + if (user != null && user.getDisplayName() != null && !user.getDisplayName().isEmpty()) { + etUsername.setText(user.getDisplayName()); + } } btnBack.setOnClickListener(v -> { @@ -64,8 +107,18 @@ public class DefinicoesActivity extends AppCompatActivity { }); btnSaveSettings.setOnClickListener(v -> { - // Em implementações futuras isto iria guardar a foto, username (Firebase UserProfileChangeRequest) - // Notificações e moeda escolhida no Firebase Realtime Database + SharedPreferences.Editor editor = getSharedPreferences("LifeGridPrefs", Context.MODE_PRIVATE).edit(); + editor.putString("username", etUsername.getText().toString().trim()); + if (selectedImageUri != null) { + editor.putString("profile_photo_uri", selectedImageUri.toString()); + try { + getContentResolver().takePersistableUriPermission(selectedImageUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + } catch (Exception e) { + e.printStackTrace(); + } + } + editor.apply(); + Toast.makeText(this, "Definições guardadas com sucesso!", Toast.LENGTH_SHORT).show(); finish(); }); diff --git a/app/src/main/java/com/example/lifegrid/LoginActivity.java b/app/src/main/java/com/example/lifegrid/LoginActivity.java index b1a95e4..09ccc8b 100644 --- a/app/src/main/java/com/example/lifegrid/LoginActivity.java +++ b/app/src/main/java/com/example/lifegrid/LoginActivity.java @@ -279,7 +279,7 @@ public class LoginActivity extends AppCompatActivity { // [START create_credential_manager_request] // Instancia um pedido de início de sessão do Google GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() - .setFilterByAuthorizedAccounts(true) + .setFilterByAuthorizedAccounts(false) .setServerClientId(getString(R.string.default_web_client_id)) .build(); @@ -291,11 +291,11 @@ public class LoginActivity extends AppCompatActivity { // Lança a interface do Gestor de Credenciais credentialManager.getCredentialAsync( - getBaseContext(), + LoginActivity.this, request, new CancellationSignal(), - Executors.newSingleThreadExecutor(), - new CredentialManagerCallback<>() { + androidx.core.content.ContextCompat.getMainExecutor(LoginActivity.this), + new CredentialManagerCallback() { @Override public void onResult(GetCredentialResponse result) { // Extrai a credencial do resultado devolvido pelo Gestor de Credenciais @@ -305,6 +305,7 @@ public class LoginActivity extends AppCompatActivity { @Override public void onError(GetCredentialException e) { Log.e(TAG, "Couldn't retrieve user's credentials: " + e.getLocalizedMessage()); + Toast.makeText(LoginActivity.this, "Falha ao abrir Google Sign In.", Toast.LENGTH_SHORT).show(); } } ); diff --git a/app/src/main/java/com/example/lifegrid/TelaInicialActivity.java b/app/src/main/java/com/example/lifegrid/TelaInicialActivity.java index fe8d1c7..9fed1a2 100644 --- a/app/src/main/java/com/example/lifegrid/TelaInicialActivity.java +++ b/app/src/main/java/com/example/lifegrid/TelaInicialActivity.java @@ -4,6 +4,9 @@ import android.os.Bundle; import android.content.Intent; import android.widget.ImageView; import android.widget.TextView; +import android.content.Context; +import android.content.SharedPreferences; +import android.net.Uri; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -56,6 +59,9 @@ public class TelaInicialActivity extends AppCompatActivity { private TextView tvTitulo; private TextView tvTitulo2; + private ImageView ivHeaderProfilePicture; + private TextView tvHeaderUsername; + private Spinner spinnerMes; private Spinner spinnerAno; @@ -83,6 +89,9 @@ public class TelaInicialActivity extends AppCompatActivity { tvTitulo = findViewById(R.id.tvTitulo); tvTitulo2 = findViewById(R.id.tvTitulo2); + ivHeaderProfilePicture = findViewById(R.id.ivHeaderProfilePicture); + tvHeaderUsername = findViewById(R.id.tvHeaderUsername); + spinnerMes = findViewById(R.id.spinnerMes); spinnerAno = findViewById(R.id.spinnerAno); @@ -93,19 +102,26 @@ public class TelaInicialActivity extends AppCompatActivity { .replace(R.id.fragmentContainerView, transacoesFragment2) .commit(); - ImageView carteiraImageView = findViewById(R.id.carteiraImageView); - carteiraImageView.setOnClickListener(v -> { + android.view.View.OnClickListener openTransacoesListener = v -> { Fragment transacoesFragment = new TransacoesFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainerView, transacoesFragment) .commit(); - }); + scrollToFragment(); + }; + + findViewById(R.id.receitasCardView).setOnClickListener(openTransacoesListener); + findViewById(R.id.despesasCardView).setOnClickListener(openTransacoesListener); + + ImageView carteiraImageView = findViewById(R.id.carteiraImageView); + carteiraImageView.setOnClickListener(openTransacoesListener); ImageView setaImageView = findViewById(R.id.setaImageView); setaImageView.setOnClickListener(v -> { Fragment ativosFragment = new AtivosFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainerView, ativosFragment) .commit(); + scrollToFragment(); }); ImageView graficoImageView = findViewById(R.id.graficoImageView); graficoImageView.setOnClickListener(v -> { @@ -113,6 +129,7 @@ public class TelaInicialActivity extends AppCompatActivity { getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainerView, graficosFragment) .commit(); + scrollToFragment(); }); ImageView alvoImageView = findViewById(R.id.alvoImageView); alvoImageView.setOnClickListener(v -> { @@ -120,13 +137,7 @@ public class TelaInicialActivity extends AppCompatActivity { getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainerView, metasFragment) .commit(); - }); - ImageView documentoImageView = findViewById(R.id.documentoImageView); - documentoImageView.setOnClickListener(v -> { - Fragment documentoFragment = new DocumentosFragment(); - getSupportFragmentManager().beginTransaction() - .replace(R.id.fragmentContainerView, documentoFragment) - .commit(); + scrollToFragment(); }); ImageView definicoesImageView = findViewById(R.id.definicoesImageView); definicoesImageView.setOnClickListener(v -> { @@ -135,6 +146,43 @@ public class TelaInicialActivity extends AppCompatActivity { }); } + @Override + protected void onResume() { + super.onResume(); + SharedPreferences prefs = getSharedPreferences("LifeGridPrefs", Context.MODE_PRIVATE); + String savedName = prefs.getString("username", ""); + String savedPhotoUri = prefs.getString("profile_photo_uri", ""); + + if (ivHeaderProfilePicture != null && !savedPhotoUri.isEmpty()) { + try { + ivHeaderProfilePicture.setImageURI(Uri.parse(savedPhotoUri)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (tvHeaderUsername != null) { + if (!savedName.isEmpty()) { + tvHeaderUsername.setText(savedName); + } else { + FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); + if (user != null && user.getDisplayName() != null && !user.getDisplayName().isEmpty()) { + tvHeaderUsername.setText(user.getDisplayName()); + } else { + tvHeaderUsername.setText("Utilizador"); + } + } + } + } + + private void scrollToFragment() { + android.widget.ScrollView scrollView = findViewById(R.id.mainScrollView); + android.view.View barraCardView = findViewById(R.id.barraCardView); + if (scrollView != null && barraCardView != null) { + scrollView.post(() -> scrollView.smoothScrollTo(0, barraCardView.getTop() - 20)); + } + } + private void setupSpinners() { ArrayAdapter mesAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, meses); mesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); diff --git a/app/src/main/java/com/example/lifegrid/menu/HomeFragment.java b/app/src/main/java/com/example/lifegrid/menu/HomeFragment.java new file mode 100644 index 0000000..b7b57e7 --- /dev/null +++ b/app/src/main/java/com/example/lifegrid/menu/HomeFragment.java @@ -0,0 +1,33 @@ +package com.example.lifegrid.menu; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.lifegrid.R; + + +public class HomeFragment extends Fragment { + + public HomeFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View root = inflater.inflate(R.layout.fragment_home, container, false); + + return root; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_tela_inicial.xml b/app/src/main/res/layout/activity_tela_inicial.xml index bcb967c..ce3e736 100644 --- a/app/src/main/res/layout/activity_tela_inicial.xml +++ b/app/src/main/res/layout/activity_tela_inicial.xml @@ -9,6 +9,7 @@ tools:context=".TelaInicialActivity"> @@ -27,12 +28,12 @@ android:layout_width="379dp" android:layout_height="175dp" android:layout_margin="16dp" - android:layout_marginTop="28dp" android:background="@drawable/cardview_background" android:padding="16dp" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.51" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/llFiltros"> + app:layout_constraintTop_toTopOf="@+id/fragmentContainerView"> @@ -94,18 +95,70 @@ + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/llProfileHeader" /> + + + + app:layout_constraintTop_toBottomOf="@+id/llFiltros"> + app:layout_constraintVertical_bias="0.263" + app:srcCompat="@drawable/alvo" + tools:layout_editor_absoluteX="293dp" /> - - + app:layout_constraintVertical_bias="0.263" + app:srcCompat="@drawable/carteira" + tools:layout_editor_absoluteX="132dp" /> + app:srcCompat="@drawable/grafico" + tools:layout_editor_absoluteX="231dp" /> + app:srcCompat="@drawable/diagonalarrowrightup_110941" + tools:layout_editor_absoluteX="169dp" + tools:layout_editor_absoluteY="5dp" /> - - - diff --git a/app/src/main/res/layout/fragment_documentos.xml b/app/src/main/res/layout/fragment_documentos.xml index 28dcf5d..3dc3dc3 100644 --- a/app/src/main/res/layout/fragment_documentos.xml +++ b/app/src/main/res/layout/fragment_documentos.xml @@ -32,20 +32,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> -