tudo a andar rapido vamossss

This commit is contained in:
2026-04-23 16:05:48 +01:00
parent 7a4bf84d42
commit 9a56ecd1dd
21 changed files with 990 additions and 3 deletions

View File

@@ -14,16 +14,32 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Locale;
import com.example.lifegrid.R;
import com.example.lifegrid.adapters.MetaAdapter;
import com.example.lifegrid.models.Meta;
import com.example.lifegrid.models.Transacao;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* MetasFragment projeta objetivos futuros onde o utilizador fixa montantes e datas a alcançar
@@ -31,6 +47,13 @@ import com.google.firebase.database.FirebaseDatabase;
*/
public class MetasFragment extends Fragment {
private RecyclerView rvMetas;
private MetaAdapter metaAdapter;
private List<Meta> metasList;
private TextView tvEmptyState;
private DatabaseReference databaseReference;
private String userId;
public MetasFragment() {
// Construtor público vazio obrigatório
}
@@ -49,8 +72,99 @@ public class MetasFragment extends Fragment {
Button novaTransacaoButton = root.findViewById(R.id.novaTransacaoButton);
novaTransacaoButton.setOnClickListener(v -> showNovaMetaDialog());
rvMetas = root.findViewById(R.id.rvMetas);
tvEmptyState = root.findViewById(R.id.textView13);
rvMetas.setLayoutManager(new LinearLayoutManager(requireContext()));
metasList = new ArrayList<>();
metaAdapter = new MetaAdapter(metasList, new MetaAdapter.OnItemClickListener() {
@Override
public void onDeleteClick(Meta meta) {
new AlertDialog.Builder(requireContext())
.setTitle("Excluir Meta")
.setMessage("Tem a certeza que deseja excluir esta meta?")
.setPositiveButton("Sim", (dialog, which) -> {
if (databaseReference != null && userId != null && meta.getId() != null) {
databaseReference.child("users").child(userId).child("metas").child(meta.getId()).removeValue();
Toast.makeText(requireContext(), "Meta excluída.", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Não", null)
.show();
}
@Override
public void onAddValueClick(Meta meta, double valorAdicional, EditText editText) {
if (databaseReference != null && userId != null && meta.getId() != null) {
double valorAtual = 0;
if (meta.getValorGuardado() != null && !meta.getValorGuardado().isEmpty()) {
valorAtual = Double.parseDouble(meta.getValorGuardado().replace(",", "."));
}
double novoValor = valorAtual + valorAdicional;
// Update Meta
databaseReference.child("users").child(userId).child("metas").child(meta.getId())
.child("valorGuardado").setValue(String.format(Locale.US, "%.2f", novoValor));
// Create a Despesa Transaction to adjust the global balance (Receitas - Despesas)
String todayDate = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(new Date());
Transacao transacao = new Transacao("Despesa", String.format(Locale.US, "%.2f", valorAdicional), "Investimento/Meta", "Adicionado à meta: " + meta.getNome(), todayDate);
String key = databaseReference.child("users").child(userId).child("transacoes").push().getKey();
if (key != null) {
databaseReference.child("users").child(userId).child("transacoes").child(key).setValue(transacao);
}
editText.setText("");
Toast.makeText(requireContext(), "Valor adicionado e despesa registada!", Toast.LENGTH_SHORT).show();
}
}
});
rvMetas.setAdapter(metaAdapter);
carregarMetas();
return root;
}
private void carregarMetas() {
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser == null) return;
userId = currentUser.getUid();
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.child("users").child(userId).child("metas").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
metasList.clear();
for (DataSnapshot ds : snapshot.getChildren()) {
Meta m = ds.getValue(Meta.class);
if (m != null) {
m.setId(ds.getKey());
metasList.add(m);
}
}
metaAdapter.notifyDataSetChanged();
if (metasList.isEmpty()) {
tvEmptyState.setVisibility(View.VISIBLE);
rvMetas.setVisibility(View.GONE);
} else {
tvEmptyState.setVisibility(View.GONE);
rvMetas.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(requireContext(), "Erro ao carregar metas.", Toast.LENGTH_SHORT).show();
}
});
}
private void showNovaMetaDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());

View File

@@ -25,12 +25,21 @@ import java.util.Calendar;
import java.util.Locale;
import com.example.lifegrid.R;
import com.example.lifegrid.adapters.TransacaoAdapter;
import com.example.lifegrid.models.Transacao;
import com.google.firebase.Firebase;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
/**
* TransacoesFragment controla a aba pertencente às listagens e histórico de carteira e gestão de dados base.
@@ -38,7 +47,12 @@ import com.google.firebase.database.FirebaseDatabase;
*/
public class TransacoesFragment extends Fragment {
private RecyclerView rvTransacoes;
private TransacaoAdapter transacaoAdapter;
private List<Transacao> transacoesList;
private TextView tvEmptyState;
private DatabaseReference databaseReference;
private String userId;
public TransacoesFragment() {
// Construtor público vazio obrigatório
@@ -60,8 +74,67 @@ public class TransacoesFragment extends Fragment {
Button novaTransacaoButton = root.findViewById(R.id.novaTransacaoButton);
novaTransacaoButton.setOnClickListener(v -> showNovaTransacaoDialog());
rvTransacoes = root.findViewById(R.id.rvTransacoes);
tvEmptyState = root.findViewById(R.id.textView13);
rvTransacoes.setLayoutManager(new LinearLayoutManager(requireContext()));
transacoesList = new ArrayList<>();
transacaoAdapter = new TransacaoAdapter(transacoesList, transacao -> {
new AlertDialog.Builder(requireContext())
.setTitle("Excluir Transação")
.setMessage("Tem a certeza que deseja excluir esta transação?")
.setPositiveButton("Sim", (dialog, which) -> {
if (databaseReference != null && userId != null && transacao.getId() != null) {
databaseReference.child("users").child(userId).child("transacoes").child(transacao.getId()).removeValue();
Toast.makeText(requireContext(), "Transação excluída.", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Não", null)
.show();
});
rvTransacoes.setAdapter(transacaoAdapter);
carregarTransacoes();
return root;
}
private void carregarTransacoes() {
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser == null) return;
userId = currentUser.getUid();
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.child("users").child(userId).child("transacoes").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
transacoesList.clear();
for (DataSnapshot ds : snapshot.getChildren()) {
Transacao t = ds.getValue(Transacao.class);
if (t != null) {
t.setId(ds.getKey());
transacoesList.add(t);
}
}
transacaoAdapter.notifyDataSetChanged();
if (transacoesList.isEmpty()) {
tvEmptyState.setVisibility(View.VISIBLE);
rvTransacoes.setVisibility(View.GONE);
} else {
tvEmptyState.setVisibility(View.GONE);
rvTransacoes.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(requireContext(), "Erro ao carregar transações.", Toast.LENGTH_SHORT).show();
}
});
}
/**
* Cria e monta manualmente uma janela Modal (Pop-up) a fim do utilizador preencher