package com.mygeopay.wallet.ui; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.mygeopay.core.coins.CoinType; import com.mygeopay.core.util.GenericUtils; import com.mygeopay.core.wallet.AbstractWallet; import com.mygeopay.wallet.AddressBookProvider; import com.mygeopay.wallet.R; import com.mygeopay.wallet.ui.widget.SendOutput; import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; import org.bitcoinj.core.TransactionOutput; import java.util.ArrayList; import java.util.List; /** * @author John L. Jegutanis */ public class TransactionAmountVisualizerAdapter extends BaseAdapter { private final Context context; private final LayoutInflater inflater; private final AbstractWallet pocket; private boolean isSending; private CoinType type; private String symbol; private List<TransactionOutput> outputs; private boolean isInternalTransfer; private boolean hasFee; private Coin feeAmount; private int itemCount; public TransactionAmountVisualizerAdapter(final Context context, final AbstractWallet walletPocket) { this.context = context; inflater = LayoutInflater.from(context); pocket = walletPocket; type = pocket.getCoinType(); symbol = type.getSymbol(); outputs = new ArrayList<TransactionOutput>(); } public void setTransaction(Transaction tx) { outputs.clear(); final Coin value = tx.getValue(pocket); isSending = value.signum() < 0; // if sending and all the outputs point inside the current pocket it is an internal transfer isInternalTransfer = isSending; for (TransactionOutput txo : tx.getOutputs()) { if (isSending) { if (txo.isMine(pocket)) continue; isInternalTransfer = false; } else { if (!txo.isMine(pocket)) continue; } outputs.add(txo); } feeAmount = tx.getFee(); hasFee = feeAmount != null && !feeAmount.isZero(); itemCount = isInternalTransfer ? 1 : outputs.size(); itemCount += hasFee ? 1 : 0; notifyDataSetChanged(); } @Override public int getCount() { return itemCount; } @Override public TransactionOutput getItem(int position) { if (position < outputs.size()) { return outputs.get(position); } return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View row, ViewGroup parent) { if (row == null) { row = inflater.inflate(R.layout.transaction_details_output_row, null); ((SendOutput) row).setSendLabel(context.getString(R.string.sent)); ((SendOutput) row).setReceiveLabel(context.getString(R.string.received)); } final SendOutput output = (SendOutput) row; final TransactionOutput txo = getItem(position); if (txo == null) { if (position == 0) { output.setLabel(context.getString(R.string.internal_transfer)); output.setSending(isSending); output.setAmount(null); output.setSymbol(null); } else if (hasFee) { output.setAmount(GenericUtils.formatCoinValue(type, feeAmount)); output.setSymbol(symbol); output.setIsFee(true); } else { // Should not happen output.setLabel("???"); output.setAmount(null); output.setSymbol(null); } } else { Coin outputAmount = txo.getValue(); output.setAmount(GenericUtils.formatCoinValue(type, outputAmount)); output.setSymbol(symbol); String address = txo.getScriptPubKey().getToAddress(type).toString(); output.setLabelAndAddress( AddressBookProvider.resolveLabel(context, type, address), address); output.setSending(isSending); } return row; } }