diff --git a/app/src/main/java/com/example/lifegrid/menu/AtivosFragment.java b/app/src/main/java/com/example/lifegrid/menu/AtivosFragment.java index e4f1079..7a28e06 100644 --- a/app/src/main/java/com/example/lifegrid/menu/AtivosFragment.java +++ b/app/src/main/java/com/example/lifegrid/menu/AtivosFragment.java @@ -22,10 +22,22 @@ import java.util.Calendar; import java.util.Locale; import com.example.lifegrid.R; +import com.example.lifegrid.adapters.AtivosAdapter; import com.example.lifegrid.models.Ativos; import com.google.firebase.auth.FirebaseAuth; +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 android.widget.TextView; +import java.util.ArrayList; +import java.util.List; /** * AtivosFragment diz respeito à janela do ecossistema dedicada à gestão @@ -33,6 +45,13 @@ import com.google.firebase.database.FirebaseDatabase; */ public class AtivosFragment extends Fragment { + private RecyclerView ativosRecyclerView; + private AtivosAdapter ativosAdapter; + private List ativosList; + private List keysList; + private DatabaseReference databaseReference; + private TextView textViewNenhumInvestimento; + public AtivosFragment() { // Construtor público vazio obrigatório } @@ -45,15 +64,95 @@ public class AtivosFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflaciona o layout para este fragmento View root = inflater.inflate(R.layout.fragment_ativos, container, false); Button novaTransacaoButton = root.findViewById(R.id.novaTransacaoButton); novaTransacaoButton.setOnClickListener(v -> showNovoAtivoDialog()); + ativosRecyclerView = root.findViewById(R.id.ativosRecyclerView); + textViewNenhumInvestimento = root.findViewById(R.id.textView13); + + ativosRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + ativosList = new ArrayList<>(); + keysList = new ArrayList<>(); + + databaseReference = FirebaseDatabase.getInstance().getReference(); + + ativosAdapter = new AtivosAdapter(requireContext(), ativosList, keysList, new AtivosAdapter.OnItemClickListener() { + @Override + public void onDeleteClick(int position, String key) { + String userId = FirebaseAuth.getInstance().getCurrentUser().getUid(); + databaseReference.child("users").child(userId).child("ativos").child(key).removeValue(); + } + + @Override + public void onRefreshClick(int position, String key, Ativos ativo) { + // A implementar no futuro + } + }); + ativosRecyclerView.setAdapter(ativosAdapter); + + loadAtivos(); + return root; } + private void loadAtivos() { + String userId = FirebaseAuth.getInstance().getCurrentUser().getUid(); + databaseReference.child("users").child(userId).child("ativos").addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + ativosList.clear(); + keysList.clear(); + double totalInvestido = 0; + double valorTotalPortfolio = 0; + + for (DataSnapshot dataSnapshot : snapshot.getChildren()) { + Ativos ativo = dataSnapshot.getValue(Ativos.class); + if (ativo != null) { + ativosList.add(ativo); + keysList.add(dataSnapshot.getKey()); + + double qtd = 0; + try { + qtd = Double.parseDouble(ativo.getQuantidade().replace(",", ".")); + } catch (Exception e) {} + + totalInvestido += qtd * ativo.getPrecoCompra(); + valorTotalPortfolio += qtd * ativo.getPrecoAtual(); + } + } + ativosAdapter.notifyDataSetChanged(); + + if (ativosList.isEmpty()) { + textViewNenhumInvestimento.setVisibility(View.VISIBLE); + ativosRecyclerView.setVisibility(View.GONE); + } else { + textViewNenhumInvestimento.setVisibility(View.GONE); + ativosRecyclerView.setVisibility(View.VISIBLE); + } + + View view = getView(); + if (view != null) { + TextView tvValorTotal = view.findViewById(R.id.textView17); + TextView tvTotalInvestido = view.findViewById(R.id.textView18); + TextView tvRoiTotal = view.findViewById(R.id.textView19); + + tvValorTotal.setText(String.format(Locale.getDefault(), "%.2f€", valorTotalPortfolio)); + tvTotalInvestido.setText(String.format(Locale.getDefault(), "%.2f€", totalInvestido)); + + double roi = valorTotalPortfolio - totalInvestido; + tvRoiTotal.setText(String.format(Locale.getDefault(), "%.2f€", roi)); + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + Toast.makeText(requireContext(), "Erro ao carregar ativos.", Toast.LENGTH_SHORT).show(); + } + }); + } + private void showNovoAtivoDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View dialogView = getLayoutInflater().inflate(R.layout.dialog_novo_ativo, null); @@ -87,20 +186,18 @@ public class AtivosFragment extends Fragment { Spinner spinnerTipoAtivo = dialogView.findViewById(R.id.spinnerTipoAtivo); EditText etQuantidade = dialogView.findViewById(R.id.etQuantidade); EditText etPrecoCompra = dialogView.findViewById(R.id.etPrecoCompra); - EditText etPrecoAtual = dialogView.findViewById(R.id.etPrecoAtual); btnAdicionarAtivoDialog.setOnClickListener(v -> { String nome = etNomeAtivo.getText().toString().trim(); String tipo = spinnerTipoAtivo.getSelectedItem().toString(); String quantidade = etQuantidade.getText().toString().trim(); String precoCompra = etPrecoCompra.getText().toString().trim(); - String precoAtual = etPrecoAtual.getText().toString().trim(); String dataCompra = etDataCompra.getText().toString().trim(); - Ativos ativos = new Ativos(nome, quantidade, Double.parseDouble(precoCompra), Double.parseDouble(precoAtual), dataCompra, tipo); + Ativos ativos = new Ativos(nome, quantidade, Double.parseDouble(precoCompra), Double.parseDouble(precoCompra), dataCompra, tipo); - if (nome.isEmpty() || quantidade.isEmpty() || precoCompra.isEmpty() || precoAtual.isEmpty() || dataCompra.isEmpty() || spinnerTipoAtivo.getSelectedItemPosition() == 0) { + if (nome.isEmpty() || quantidade.isEmpty() || precoCompra.isEmpty() || dataCompra.isEmpty() || spinnerTipoAtivo.getSelectedItemPosition() == 0) { Toast.makeText(requireContext(), "Por favor, preencha os campos obrigatórios.", Toast.LENGTH_SHORT).show(); } else { // Aqui seria a lógica para guardar na Firebase diff --git a/app/src/main/res/layout/dialog_novo_ativo.xml b/app/src/main/res/layout/dialog_novo_ativo.xml index ed1ed27..ba7850c 100644 --- a/app/src/main/res/layout/dialog_novo_ativo.xml +++ b/app/src/main/res/layout/dialog_novo_ativo.xml @@ -107,24 +107,6 @@ android:paddingHorizontal="16dp" android:textColor="@color/preto" /> - - -