diff options
author | Torsten Grote <t@grobox.de> | 2020-04-15 11:26:51 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-04-15 11:26:51 -0300 |
commit | ea3250845fb266a2ecd5ebeba561bc99101bf3de (patch) | |
tree | d726f2216efa9b3008741b0037db325725d0d90b /wallet/src/main/java/net/taler/wallet/history | |
parent | 8e4f85d467c8e8109026a7195757ce9448ad7b19 (diff) | |
download | taler-android-ea3250845fb266a2ecd5ebeba561bc99101bf3de.tar.gz taler-android-ea3250845fb266a2ecd5ebeba561bc99101bf3de.tar.bz2 taler-android-ea3250845fb266a2ecd5ebeba561bc99101bf3de.zip |
[wallet] rename history to transactions
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/history')
7 files changed, 0 insertions, 1112 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryAdapter.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryAdapter.kt deleted file mode 100644 index b9770fb..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/HistoryAdapter.kt +++ /dev/null @@ -1,199 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import android.content.Context -import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.annotation.CallSuper -import androidx.recyclerview.widget.RecyclerView.Adapter -import androidx.recyclerview.widget.RecyclerView.ViewHolder -import net.taler.common.toRelativeTime -import net.taler.wallet.R -import net.taler.wallet.cleanExchange -import net.taler.wallet.history.HistoryAdapter.HistoryEventViewHolder - - -internal class HistoryAdapter( - private val devMode: Boolean, - private val listener: OnEventClickListener, - private var history: History = History() -) : Adapter<HistoryEventViewHolder>() { - - init { - setHasStableIds(false) - } - - override fun getItemViewType(position: Int): Int = history[position].layout - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HistoryEventViewHolder { - val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false) - return when (viewType) { - R.layout.history_receive -> HistoryReceiveViewHolder(view) - R.layout.history_payment -> HistoryPaymentViewHolder(view) - else -> GenericHistoryEventViewHolder(view) - } - } - - override fun getItemCount(): Int = history.size - - override fun onBindViewHolder(holder: HistoryEventViewHolder, position: Int) { - val event = history[position] - holder.bind(event) - } - - fun update(updatedHistory: History) { - this.history = updatedHistory - this.notifyDataSetChanged() - } - - internal abstract inner class HistoryEventViewHolder(private val v: View) : ViewHolder(v) { - - protected val context: Context = v.context - private val icon: ImageView = v.findViewById(R.id.icon) - protected val title: TextView = v.findViewById(R.id.title) - private val time: TextView = v.findViewById(R.id.time) - private val selectableBackground = v.background - - @CallSuper - open fun bind(event: HistoryEvent) { - if (devMode || event.detailPageLayout != 0) { - v.background = selectableBackground - v.setOnClickListener { listener.onEventClicked(event) } - } else { - v.background = null - v.setOnClickListener(null) - } - icon.setImageResource(event.icon) - if (event.title == 0) title.text = event::class.java.simpleName - else title.setText(event.title) - time.text = event.timestamp.ms.toRelativeTime(context) - } - - } - - internal inner class GenericHistoryEventViewHolder(v: View) : HistoryEventViewHolder(v) { - - private val info: TextView = v.findViewById(R.id.info) - - override fun bind(event: HistoryEvent) { - super.bind(event) - info.text = when (event) { - is ExchangeAddedEvent -> cleanExchange(event.exchangeBaseUrl) - is ExchangeUpdatedEvent -> cleanExchange(event.exchangeBaseUrl) - is ReserveBalanceUpdatedEvent -> event.reserveBalance.toString() - is HistoryPaymentSentEvent -> event.orderShortInfo.summary - is HistoryOrderAcceptedEvent -> event.orderShortInfo.summary - is HistoryOrderRefusedEvent -> event.orderShortInfo.summary - is HistoryOrderRedirectedEvent -> event.newOrderShortInfo.summary - else -> "" - } - } - - } - - internal inner class HistoryReceiveViewHolder(v: View) : HistoryEventViewHolder(v) { - - private val summary: TextView = v.findViewById(R.id.summary) - private val amountWithdrawn: TextView = v.findViewById(R.id.amountWithdrawn) - private val paintFlags = amountWithdrawn.paintFlags - - override fun bind(event: HistoryEvent) { - super.bind(event) - when (event) { - is HistoryWithdrawnEvent -> bind(event) - is HistoryRefundedEvent -> bind(event) - is HistoryTipAcceptedEvent -> bind(event) - is HistoryTipDeclinedEvent -> bind(event) - } - } - - private fun bind(event: HistoryWithdrawnEvent) { - summary.text = cleanExchange(event.exchangeBaseUrl) - amountWithdrawn.text = - context.getString(R.string.amount_positive, event.amountWithdrawnEffective) - amountWithdrawn.paintFlags = paintFlags - } - - private fun bind(event: HistoryRefundedEvent) { - summary.text = event.orderShortInfo.summary - amountWithdrawn.text = - context.getString(R.string.amount_positive, event.amountRefundedEffective) - amountWithdrawn.paintFlags = paintFlags - } - - private fun bind(event: HistoryTipAcceptedEvent) { - summary.text = null - amountWithdrawn.text = context.getString(R.string.amount_positive, event.tipRaw) - amountWithdrawn.paintFlags = paintFlags - } - - private fun bind(event: HistoryTipDeclinedEvent) { - summary.text = null - amountWithdrawn.text = context.getString(R.string.amount_positive, event.tipAmount) - amountWithdrawn.paintFlags = amountWithdrawn.paintFlags or STRIKE_THRU_TEXT_FLAG - } - - } - - internal inner class HistoryPaymentViewHolder(v: View) : HistoryEventViewHolder(v) { - - private val summary: TextView = v.findViewById(R.id.summary) - private val amountPaidWithFees: TextView = v.findViewById(R.id.amountPaidWithFees) - - override fun bind(event: HistoryEvent) { - super.bind(event) - when (event) { - is HistoryPaymentSentEvent -> bind(event) - is HistoryPaymentAbortedEvent -> bind(event) - is HistoryRefreshedEvent -> bind(event) - } - } - - private fun bind(event: HistoryPaymentSentEvent) { - summary.text = event.orderShortInfo.summary - amountPaidWithFees.text = - context.getString(R.string.amount_negative, event.amountPaidWithFees) - } - - private fun bind(event: HistoryPaymentAbortedEvent) { - summary.text = event.orderShortInfo.summary - amountPaidWithFees.text = context.getString(R.string.amount_negative, event.amountLost) - } - - private fun bind(event: HistoryRefreshedEvent) { - val res = when (event.refreshReason) { - RefreshReason.MANUAL -> R.string.history_event_refresh_reason_manual - RefreshReason.PAY -> R.string.history_event_refresh_reason_pay - RefreshReason.REFUND -> R.string.history_event_refresh_reason_refund - RefreshReason.ABORT_PAY -> R.string.history_event_refresh_reason_abort_pay - RefreshReason.RECOUP -> R.string.history_event_refresh_reason_recoup - RefreshReason.BACKUP_RESTORED -> R.string.history_event_refresh_reason_backup_restored - } - summary.text = context.getString(res) - val fee = event.amountRefreshedRaw - event.amountRefreshedEffective - if (fee.isZero()) amountPaidWithFees.text = null - else amountPaidWithFees.text = context.getString(R.string.amount_negative, fee) - } - - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt deleted file mode 100644 index af017ed..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/HistoryEvent.kt +++ /dev/null @@ -1,459 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import androidx.annotation.DrawableRes -import androidx.annotation.LayoutRes -import androidx.annotation.StringRes -import com.fasterxml.jackson.annotation.JsonIgnoreProperties -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.annotation.JsonSubTypes -import com.fasterxml.jackson.annotation.JsonSubTypes.Type -import com.fasterxml.jackson.annotation.JsonTypeInfo -import com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY -import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME -import com.fasterxml.jackson.annotation.JsonTypeName -import net.taler.common.Amount -import net.taler.common.Timestamp -import net.taler.wallet.R -import org.json.JSONObject - -enum class ReserveType { - /** - * Manually created. - */ - @JsonProperty("manual") - MANUAL, - - /** - * Withdrawn from a bank that has "tight" Taler integration - */ - @JsonProperty("taler-bank-withdraw") - @Suppress("unused") - TALER_BANK_WITHDRAW, -} - -@JsonInclude(NON_EMPTY) -class ReserveCreationDetail(val type: ReserveType, val bankUrl: String?) - -enum class RefreshReason { - @JsonProperty("manual") - @Suppress("unused") - MANUAL, - - @JsonProperty("pay") - PAY, - - @JsonProperty("refund") - @Suppress("unused") - REFUND, - - @JsonProperty("abort-pay") - @Suppress("unused") - ABORT_PAY, - - @JsonProperty("recoup") - @Suppress("unused") - RECOUP, - - @JsonProperty("backup-restored") - @Suppress("unused") - BACKUP_RESTORED -} - -@JsonInclude(NON_EMPTY) -class ReserveShortInfo( - /** - * The exchange that the reserve will be at. - */ - val exchangeBaseUrl: String, - /** - * Key to query more details - */ - val reservePub: String, - /** - * Detail about how the reserve has been created. - */ - val reserveCreationDetail: ReserveCreationDetail -) - -typealias History = ArrayList<HistoryEvent> - -@JsonTypeInfo( - use = NAME, - include = PROPERTY, - property = "type", - defaultImpl = HistoryUnknownEvent::class -) -/** missing: -AuditorComplaintSent = "auditor-complained-sent", -AuditorComplaintProcessed = "auditor-complaint-processed", -AuditorTrustAdded = "auditor-trust-added", -AuditorTrustRemoved = "auditor-trust-removed", -ExchangeTermsAccepted = "exchange-terms-accepted", -ExchangePolicyChanged = "exchange-policy-changed", -ExchangeTrustAdded = "exchange-trust-added", -ExchangeTrustRemoved = "exchange-trust-removed", -FundsDepositedToSelf = "funds-deposited-to-self", -FundsRecouped = "funds-recouped", -ReserveCreated = "reserve-created", - */ -@JsonSubTypes( - Type(value = ExchangeAddedEvent::class, name = "exchange-added"), - Type(value = ExchangeUpdatedEvent::class, name = "exchange-updated"), - Type(value = ReserveBalanceUpdatedEvent::class, name = "reserve-balance-updated"), - Type(value = HistoryWithdrawnEvent::class, name = "withdrawn"), - Type(value = HistoryOrderAcceptedEvent::class, name = "order-accepted"), - Type(value = HistoryOrderRefusedEvent::class, name = "order-refused"), - Type(value = HistoryOrderRedirectedEvent::class, name = "order-redirected"), - Type(value = HistoryPaymentSentEvent::class, name = "payment-sent"), - Type(value = HistoryPaymentAbortedEvent::class, name = "payment-aborted"), - Type(value = HistoryTipAcceptedEvent::class, name = "tip-accepted"), - Type(value = HistoryTipDeclinedEvent::class, name = "tip-declined"), - Type(value = HistoryRefundedEvent::class, name = "refund"), - Type(value = HistoryRefreshedEvent::class, name = "refreshed") -) -@JsonIgnoreProperties( - value = [ - "eventId" - ] -) -abstract class HistoryEvent( - val timestamp: Timestamp, - @get:LayoutRes - open val layout: Int = R.layout.history_row, - @get:LayoutRes - open val detailPageLayout: Int = 0, - @get:StringRes - open val title: Int = 0, - @get:DrawableRes - open val icon: Int = R.drawable.ic_account_balance, - open val showToUser: Boolean = false -) { - open lateinit var json: JSONObject -} - - -class HistoryUnknownEvent(timestamp: Timestamp) : HistoryEvent(timestamp) { - override val title = R.string.history_event_unknown -} - -@JsonTypeName("exchange-added") -class ExchangeAddedEvent( - timestamp: Timestamp, - val exchangeBaseUrl: String, - val builtIn: Boolean -) : HistoryEvent(timestamp) { - override val title = R.string.history_event_exchange_added -} - -@JsonTypeName("exchange-updated") -class ExchangeUpdatedEvent( - timestamp: Timestamp, - val exchangeBaseUrl: String -) : HistoryEvent(timestamp) { - override val title = R.string.history_event_exchange_updated -} - - -@JsonTypeName("reserve-balance-updated") -class ReserveBalanceUpdatedEvent( - timestamp: Timestamp, - /** - * Condensed information about the reserve. - */ - val reserveShortInfo: ReserveShortInfo, - /** - * Amount currently left in the reserve. - */ - val reserveBalance: Amount, - /** - * Amount we expected to be in the reserve at that time, - * considering ongoing withdrawals from that reserve. - */ - val reserveAwaitedAmount: Amount, - /** - * Amount that hasn't been withdrawn yet. - */ - val reserveUnclaimedAmount: Amount -) : HistoryEvent(timestamp) { - override val title = R.string.history_event_reserve_balance_updated -} - -@JsonTypeName("withdrawn") -class HistoryWithdrawnEvent( - timestamp: Timestamp, - /** - * Exchange that was withdrawn from. - */ - val exchangeBaseUrl: String, - /** - * Unique identifier for the withdrawal session, can be used to - * query more detailed information from the wallet. - */ - val withdrawalGroupId: String, - val withdrawalSource: WithdrawalSource, - /** - * Amount that has been subtracted from the reserve's balance - * for this withdrawal. - */ - val amountWithdrawnRaw: Amount, - /** - * Amount that actually was added to the wallet's balance. - */ - val amountWithdrawnEffective: Amount -) : HistoryEvent(timestamp) { - override val layout = R.layout.history_receive - override val detailPageLayout = R.layout.fragment_event_withdraw - override val title = R.string.history_event_withdrawn - override val icon = R.drawable.history_withdrawn - override val showToUser = true -} - -@JsonTypeName("order-accepted") -class HistoryOrderAcceptedEvent( - timestamp: Timestamp, - /** - * Condensed info about the order. - */ - val orderShortInfo: OrderShortInfo -) : HistoryEvent(timestamp) { - override val icon = R.drawable.ic_add_circle - override val title = R.string.history_event_order_accepted -} - -@JsonTypeName("order-refused") -class HistoryOrderRefusedEvent( - timestamp: Timestamp, - /** - * Condensed info about the order. - */ - val orderShortInfo: OrderShortInfo -) : HistoryEvent(timestamp) { - override val icon = R.drawable.ic_cancel - override val title = R.string.history_event_order_refused -} - -@JsonTypeName("payment-sent") -class HistoryPaymentSentEvent( - timestamp: Timestamp, - /** - * Condensed info about the order that we already paid for. - */ - val orderShortInfo: OrderShortInfo, - /** - * Set to true if the payment has been previously sent - * to the merchant successfully, possibly with a different session ID. - */ - val replay: Boolean, - /** - * Number of coins that were involved in the payment. - */ - val numCoins: Int, - /** - * Amount that was paid, including deposit and wire fees. - */ - val amountPaidWithFees: Amount, - /** - * Session ID that the payment was (re-)submitted under. - */ - val sessionId: String? -) : HistoryEvent(timestamp) { - override val layout = R.layout.history_payment - override val detailPageLayout = R.layout.fragment_event_paid - override val title = R.string.history_event_payment_sent - override val icon = R.drawable.ic_cash_usd_outline - override val showToUser = true -} - -@JsonTypeName("payment-aborted") -class HistoryPaymentAbortedEvent( - timestamp: Timestamp, - /** - * Condensed info about the order that we already paid for. - */ - val orderShortInfo: OrderShortInfo, - /** - * Amount that was lost due to refund and refreshing fees. - */ - val amountLost: Amount -) : HistoryEvent(timestamp) { - override val layout = R.layout.history_payment - override val title = R.string.history_event_payment_aborted - override val icon = R.drawable.history_payment_aborted - override val showToUser = true -} - -@JsonTypeName("refreshed") -class HistoryRefreshedEvent( - timestamp: Timestamp, - /** - * Amount that is now available again because it has - * been refreshed. - */ - val amountRefreshedEffective: Amount, - /** - * Amount that we spent for refreshing. - */ - val amountRefreshedRaw: Amount, - /** - * Why was the refreshing done? - */ - val refreshReason: RefreshReason, - val numInputCoins: Int, - val numRefreshedInputCoins: Int, - val numOutputCoins: Int, - /** - * Identifier for a refresh group, contains one or - * more refresh session IDs. - */ - val refreshGroupId: String -) : HistoryEvent(timestamp) { - override val layout = R.layout.history_payment - override val icon = R.drawable.history_refresh - override val title = R.string.history_event_refreshed - override val showToUser = !(amountRefreshedRaw - amountRefreshedEffective).isZero() -} - -@JsonTypeName("order-redirected") -class HistoryOrderRedirectedEvent( - timestamp: Timestamp, - /** - * Condensed info about the new order that contains a - * product (identified by the fulfillment URL) that we've already paid for. - */ - val newOrderShortInfo: OrderShortInfo, - /** - * Condensed info about the order that we already paid for. - */ - val alreadyPaidOrderShortInfo: OrderShortInfo -) : HistoryEvent(timestamp) { - override val icon = R.drawable.ic_directions - override val title = R.string.history_event_order_redirected -} - -@JsonTypeName("tip-accepted") -class HistoryTipAcceptedEvent( - timestamp: Timestamp, - /** - * Unique identifier for the tip to query more information. - */ - val tipId: String, - /** - * Raw amount of the tip, without extra fees that apply. - */ - val tipRaw: Amount -) : HistoryEvent(timestamp) { - override val icon = R.drawable.history_tip_accepted - override val title = R.string.history_event_tip_accepted - override val layout = R.layout.history_receive - override val showToUser = true -} - -@JsonTypeName("tip-declined") -class HistoryTipDeclinedEvent( - timestamp: Timestamp, - /** - * Unique identifier for the tip to query more information. - */ - val tipId: String, - /** - * Raw amount of the tip, without extra fees that apply. - */ - val tipAmount: Amount -) : HistoryEvent(timestamp) { - override val icon = R.drawable.history_tip_declined - override val title = R.string.history_event_tip_declined - override val layout = R.layout.history_receive - override val showToUser = true -} - -@JsonTypeName("refund") -class HistoryRefundedEvent( - timestamp: Timestamp, - val orderShortInfo: OrderShortInfo, - /** - * Unique identifier for this refund. - * (Identifies multiple refund permissions that were obtained at once.) - */ - val refundGroupId: String, - /** - * Part of the refund that couldn't be applied because - * the refund permissions were expired. - */ - val amountRefundedInvalid: Amount, - /** - * Amount that has been refunded by the merchant. - */ - val amountRefundedRaw: Amount, - /** - * Amount will be added to the wallet's balance after fees and refreshing. - */ - val amountRefundedEffective: Amount -) : HistoryEvent(timestamp) { - override val icon = R.drawable.history_refund - override val title = R.string.history_event_refund - override val layout = R.layout.history_receive - override val detailPageLayout = R.layout.fragment_event_paid - override val showToUser = true -} - -@JsonTypeInfo( - use = NAME, - include = PROPERTY, - property = "type" -) -@JsonSubTypes( - Type(value = WithdrawalSourceReserve::class, name = "reserve") -) -abstract class WithdrawalSource - -@Suppress("unused") -@JsonTypeName("tip") -class WithdrawalSourceTip( - val tipId: String -) : WithdrawalSource() - -@JsonTypeName("reserve") -class WithdrawalSourceReserve( - val reservePub: String -) : WithdrawalSource() - -data class OrderShortInfo( - /** - * Wallet-internal identifier of the proposal. - */ - val proposalId: String, - /** - * Order ID, uniquely identifies the order within a merchant instance. - */ - val orderId: String, - /** - * Base URL of the merchant. - */ - val merchantBaseUrl: String, - /** - * Amount that must be paid for the contract. - */ - val amount: Amount, - /** - * Summary of the proposal, given by the merchant. - */ - val summary: String -) diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryEventFragment.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryEventFragment.kt deleted file mode 100644 index b6a2a33..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/HistoryEventFragment.kt +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import android.widget.Toast.LENGTH_LONG -import androidx.core.content.ContextCompat.getColor -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import kotlinx.android.synthetic.main.fragment_event_paid.* -import kotlinx.android.synthetic.main.fragment_event_withdraw.* -import kotlinx.android.synthetic.main.fragment_event_withdraw.feeView -import kotlinx.android.synthetic.main.fragment_event_withdraw.timeView -import net.taler.common.Amount -import net.taler.common.toAbsoluteTime -import net.taler.wallet.R -import net.taler.wallet.MainViewModel -import net.taler.wallet.cleanExchange - -class HistoryEventFragment : Fragment() { - - private val model: MainViewModel by activityViewModels() - private val historyManager by lazy { model.historyManager } - private val event by lazy { requireNotNull(historyManager.selectedEvent) } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(model.devMode.value == true) - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(event.detailPageLayout, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - requireActivity().title = - getString(if (event.title != 0) event.title else R.string.history_detail_title) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - timeView.text = event.timestamp.ms.toAbsoluteTime(requireContext()) - when (val e = event) { - is HistoryWithdrawnEvent -> bind(e) - is HistoryPaymentSentEvent -> bind(e) - is HistoryRefundedEvent -> bind(e) - else -> Toast.makeText( - requireContext(), - "event ${e.javaClass} not implement", - LENGTH_LONG - ).show() - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.history_event, menu) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.show_json -> { - JsonDialogFragment.new(event.json.toString(2)).show(parentFragmentManager, null) - true - } - else -> super.onOptionsItemSelected(item) - } - } - - private fun bind(event: HistoryWithdrawnEvent) { - effectiveAmountLabel.text = getString(R.string.withdraw_total) - effectiveAmountView.text = event.amountWithdrawnEffective.toString() - chosenAmountLabel.text = getString(R.string.amount_chosen) - chosenAmountView.text = - getString(R.string.amount_positive, event.amountWithdrawnRaw.toString()) - val fee = event.amountWithdrawnRaw - event.amountWithdrawnEffective - feeView.text = getString(R.string.amount_negative, fee.toString()) - exchangeView.text = cleanExchange(event.exchangeBaseUrl) - } - - private fun bind(event: HistoryPaymentSentEvent) { - amountPaidWithFeesView.text = event.amountPaidWithFees.toString() - val fee = event.amountPaidWithFees - event.orderShortInfo.amount - bindOrderAndFee(event.orderShortInfo, fee) - } - - private fun bind(event: HistoryRefundedEvent) { - amountPaidWithFeesLabel.text = getString(R.string.history_event_refund) - amountPaidWithFeesView.setTextColor(getColor(requireContext(), R.color.green)) - amountPaidWithFeesView.text = - getString(R.string.amount_positive, event.amountRefundedEffective.toString()) - val fee = event.orderShortInfo.amount - event.amountRefundedEffective - bindOrderAndFee(event.orderShortInfo, fee) - } - - private fun bindOrderAndFee(orderShortInfo: OrderShortInfo, fee: Amount) { - orderAmountView.text = orderShortInfo.amount.toString() - feeView.text = getString(R.string.amount_negative, fee.toString()) - orderSummaryView.text = orderShortInfo.summary - orderIdView.text = - getString(R.string.history_event_payment_sent_order_id, orderShortInfo.orderId) - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryFragment.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryFragment.kt deleted file mode 100644 index 9f83d5a..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/HistoryFragment.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.view.View -import android.view.View.INVISIBLE -import android.view.View.VISIBLE -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.Observer -import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager.VERTICAL -import kotlinx.android.synthetic.main.fragment_show_history.* -import net.taler.common.fadeIn -import net.taler.common.fadeOut -import net.taler.wallet.R -import net.taler.wallet.MainViewModel - -interface OnEventClickListener { - fun onEventClicked(event: HistoryEvent) -} - -class HistoryFragment : Fragment(), OnEventClickListener { - - private val model: MainViewModel by activityViewModels() - private val historyManager by lazy { model.historyManager } - private lateinit var showAllItem: MenuItem - private var reloadHistoryItem: MenuItem? = null - private val historyAdapter by lazy { HistoryAdapter(model.devMode.value == true, this) } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_show_history, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - historyList.apply { - layoutManager = LinearLayoutManager(context) - adapter = historyAdapter - addItemDecoration(DividerItemDecoration(context, VERTICAL)) - } - - model.devMode.observe(viewLifecycleOwner, Observer { enabled -> - reloadHistoryItem?.isVisible = enabled - }) - historyManager.progress.observe(viewLifecycleOwner, Observer { show -> - historyProgressBar.visibility = if (show) VISIBLE else INVISIBLE - }) - historyManager.history.observe(viewLifecycleOwner, Observer { history -> - onHistoryResult(history) - }) - - // kicks off initial load, needs to be adapted if showAll state is ever saved - if (savedInstanceState == null) historyManager.showAll.value = model.devMode.value - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.history, menu) - showAllItem = menu.findItem(R.id.show_all_history) - showAllItem.isChecked = historyManager.showAll.value == true - reloadHistoryItem = menu.findItem(R.id.reload_history).apply { - isVisible = model.devMode.value!! - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.show_all_history -> { - item.isChecked = !item.isChecked - historyManager.showAll.value = item.isChecked - true - } - R.id.reload_history -> { - historyManager.showAll.value = showAllItem.isChecked - true - } - else -> super.onOptionsItemSelected(item) - } - } - - override fun onEventClicked(event: HistoryEvent) { - if (event.detailPageLayout != 0) { - historyManager.selectedEvent = event - findNavController().navigate(R.id.action_walletHistory_to_historyEventFragment) - } else if (model.devMode.value == true) { - JsonDialogFragment.new(event.json.toString(2)) - .show(parentFragmentManager, null) - } - } - - private fun onHistoryResult(result: HistoryResult) = when (result) { - HistoryResult.Error -> { - historyList.fadeOut() - historyEmptyState.text = getString(R.string.history_error) - historyEmptyState.fadeIn() - } - is HistoryResult.Success -> { - historyEmptyState.visibility = if (result.history.isEmpty()) VISIBLE else INVISIBLE - historyAdapter.update(result.history) - } - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/history/HistoryManager.kt b/wallet/src/main/java/net/taler/wallet/history/HistoryManager.kt deleted file mode 100644 index 7ce4f5b..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/HistoryManager.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.asLiveData -import androidx.lifecycle.switchMap -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.flow.onStart -import net.taler.wallet.backend.WalletBackendApi - -sealed class HistoryResult { - object Error : HistoryResult() - class Success(val history: History) : HistoryResult() -} - -@Suppress("EXPERIMENTAL_API_USAGE") -class HistoryManager( - private val walletBackendApi: WalletBackendApi, - private val mapper: ObjectMapper -) { - - private val mProgress = MutableLiveData<Boolean>() - val progress: LiveData<Boolean> = mProgress - - val showAll = MutableLiveData<Boolean>() - - var selectedEvent: HistoryEvent? = null - - val history: LiveData<HistoryResult> = showAll.switchMap { showAll -> - loadHistory(showAll) - .onStart { mProgress.postValue(true) } - .onCompletion { mProgress.postValue(false) } - .asLiveData(Dispatchers.IO) - } - - private fun loadHistory(showAll: Boolean) = callbackFlow { - walletBackendApi.sendRequest("getHistory", null) { isError, result -> - if (isError) { - offer(HistoryResult.Error) - close() - return@sendRequest - } - val history = History() - val json = result.getJSONArray("history") - for (i in 0 until json.length()) { - val event: HistoryEvent = mapper.readValue(json.getString(i)) - event.json = json.getJSONObject(i) - history.add(event) - } - history.reverse() // show latest first - val filtered = if (showAll) history else history.filter { it.showToUser } as History - offer(HistoryResult.Success(filtered)) - close() - } - awaitClose() - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/history/JsonDialogFragment.kt b/wallet/src/main/java/net/taler/wallet/history/JsonDialogFragment.kt deleted file mode 100644 index 5421db3..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/JsonDialogFragment.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import androidx.fragment.app.DialogFragment -import kotlinx.android.synthetic.main.fragment_json.* -import net.taler.wallet.R - -class JsonDialogFragment : DialogFragment() { - - companion object { - fun new(json: String): JsonDialogFragment { - return JsonDialogFragment().apply { - arguments = Bundle().apply { putString("json", json) } - } - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_json, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val json = arguments!!.getString("json") - jsonView.text = json - } - - override fun onStart() { - super.onStart() - dialog?.window?.setLayout(MATCH_PARENT, WRAP_CONTENT) - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt b/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt deleted file mode 100644 index 6c8fdaa..0000000 --- a/wallet/src/main/java/net/taler/wallet/history/ReserveTransaction.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.history - -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.annotation.JsonSubTypes -import com.fasterxml.jackson.annotation.JsonTypeInfo -import com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY -import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME -import com.fasterxml.jackson.annotation.JsonTypeName -import net.taler.common.Timestamp - - -@JsonTypeInfo( - use = NAME, - include = PROPERTY, - property = "type" -) -@JsonSubTypes( - JsonSubTypes.Type(value = ReserveDepositTransaction::class, name = "DEPOSIT") -) -abstract class ReserveTransaction - - -@JsonTypeName("DEPOSIT") -class ReserveDepositTransaction( - /** - * Amount withdrawn. - */ - val amount: String, - /** - * Sender account payto://-URL - */ - @JsonProperty("sender_account_url") - val senderAccountUrl: String, - /** - * Transfer details uniquely identifying the transfer. - */ - @JsonProperty("wire_reference") - val wireReference: String, - /** - * Timestamp of the incoming wire transfer. - */ - val timestamp: Timestamp -) : ReserveTransaction() |