diff --git a/app/src/main/java/com/example/lifegrid/adapters/AtivosAdapter.java b/app/src/main/java/com/example/lifegrid/adapters/AtivosAdapter.java new file mode 100644 index 0000000..60b042f --- /dev/null +++ b/app/src/main/java/com/example/lifegrid/adapters/AtivosAdapter.java @@ -0,0 +1,121 @@ +package com.example.lifegrid.adapters; + +import android.content.Context; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.lifegrid.R; +import com.example.lifegrid.models.Ativos; + +import java.util.List; +import java.util.Locale; + +public class AtivosAdapter extends RecyclerView.Adapter { + + private List ativosList; + private List keysList; + private Context context; + private OnItemClickListener listener; + + public interface OnItemClickListener { + void onDeleteClick(int position, String key); + void onRefreshClick(int position, String key, Ativos ativo); + } + + public AtivosAdapter(Context context, List ativosList, List keysList, OnItemClickListener listener) { + this.context = context; + this.ativosList = ativosList; + this.keysList = keysList; + this.listener = listener; + } + + @NonNull + @Override + public AtivosViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_ativo, parent, false); + return new AtivosViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull AtivosViewHolder holder, int position) { + Ativos ativo = ativosList.get(position); + String key = keysList.get(position); + + holder.tvNome.setText(ativo.getNome()); + holder.tvTipo.setText(ativo.getTipo()); + + String info = String.format(Locale.getDefault(), "%s unidades x %.2f€", ativo.getQuantidade(), ativo.getPrecoCompra()); + holder.tvInfo.setText(info); + + double precoAtual = ativo.getPrecoAtual(); + double precoCompra = ativo.getPrecoCompra(); + double qtd = 0; + try { + qtd = Double.parseDouble(ativo.getQuantidade().replace(",", ".")); + } catch (NumberFormatException e) { + qtd = 0; + } + + double total = qtd * precoAtual; + + holder.tvPrecoAtual.setText(String.format(Locale.getDefault(), "%.2f€", total)); + + double percentagem = 0.0; + if (precoCompra > 0) { + percentagem = ((precoAtual - precoCompra) / precoCompra) * 100; + } + + if (percentagem >= 0) { + holder.tvPercentagem.setText(String.format(Locale.getDefault(), "+%.2f%%", percentagem)); + holder.tvPercentagem.setTextColor(Color.parseColor("#16a34a")); // Green + holder.ivTrend.setImageResource(R.drawable.ic_trend_up); + holder.ivTrend.setColorFilter(Color.parseColor("#16a34a")); + holder.ivTrend.setBackgroundResource(R.drawable.bg_circle_green); + } else { + holder.tvPercentagem.setText(String.format(Locale.getDefault(), "%.2f%%", percentagem)); + holder.tvPercentagem.setTextColor(Color.parseColor("#ef4444")); // Red + holder.ivTrend.setImageResource(R.drawable.ic_arrow_down); // Fallback if no specific icon + holder.ivTrend.setColorFilter(Color.parseColor("#ef4444")); + holder.ivTrend.setBackgroundResource(R.drawable.bg_circle_red); + } + + holder.btnDelete.setOnClickListener(v -> { + if (listener != null) listener.onDeleteClick(position, key); + }); + + holder.btnRefresh.setOnClickListener(v -> { + if (listener != null) listener.onRefreshClick(position, key, ativo); + Toast.makeText(context, "Ativo atualizado (Exemplo)", Toast.LENGTH_SHORT).show(); + }); + } + + @Override + public int getItemCount() { + return ativosList.size(); + } + + public static class AtivosViewHolder extends RecyclerView.ViewHolder { + ImageView ivTrend, btnDelete, btnRefresh; + TextView tvNome, tvTipo, tvInfo, tvPrecoAtual, tvPercentagem; + + public AtivosViewHolder(@NonNull View itemView) { + super(itemView); + ivTrend = itemView.findViewById(R.id.ivTrend); + tvNome = itemView.findViewById(R.id.tvNome); + tvTipo = itemView.findViewById(R.id.tvTipo); + tvInfo = itemView.findViewById(R.id.tvInfo); + tvPrecoAtual = itemView.findViewById(R.id.tvPrecoAtual); + tvPercentagem = itemView.findViewById(R.id.tvPercentagem); + btnDelete = itemView.findViewById(R.id.btnDelete); + btnRefresh = itemView.findViewById(R.id.btnRefresh); + } + } +} diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..54bb66e --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_tela_inicial.xml b/app/src/main/res/layout/activity_tela_inicial.xml index 7942f4f..bcb967c 100644 --- a/app/src/main/res/layout/activity_tela_inicial.xml +++ b/app/src/main/res/layout/activity_tela_inicial.xml @@ -381,10 +381,11 @@ android:id="@+id/alvoImageView" android:layout_width="20dp" android:layout_height="20dp" - android:layout_marginStart="57dp" + android:layout_marginStart="40dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/graficoImageView" app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.473" app:srcCompat="@drawable/alvo" /> - - - - - - - - - + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + +