diff options
author | Torsten Grote <t@grobox.de> | 2020-05-14 14:13:18 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-05-15 14:26:42 -0300 |
commit | 69093aa9055da501fd14103ac772d730850cb7b4 (patch) | |
tree | 4886bd05b7790df295902ed44fcca93146fd06fc | |
parent | 171a1ae228b801d5c0d54c6c7e7ad8aa458d6bce (diff) | |
download | taler-android-69093aa9055da501fd14103ac772d730850cb7b4.tar.gz taler-android-69093aa9055da501fd14103ac772d730850cb7b4.tar.bz2 taler-android-69093aa9055da501fd14103ac772d730850cb7b4.zip |
[wallet] Remove success pages for withdrawal and payment
The user is now brought the the transaction list where both are shown
directly as pending transactions.
13 files changed, 49 insertions, 255 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt index b880036..485df73 100644 --- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt +++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt @@ -34,6 +34,7 @@ import net.taler.wallet.payment.PaymentManager import net.taler.wallet.pending.PendingOperationsManager import net.taler.wallet.refund.RefundManager import net.taler.wallet.transactions.TransactionManager +import net.taler.wallet.transactions.TransactionsResult import net.taler.wallet.withdraw.WithdrawManager import org.json.JSONObject @@ -121,6 +122,14 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) { val amountIncoming = Amount.fromJsonObject(jsonAmountIncoming) balanceMap[currency] = BalanceItem(amount, amountIncoming) } + // TODO remove when wallet-core supports 0 balance for pending transactions + if (balanceMap.isEmpty()) { + val transactionsResult = transactionManager.transactions.value + if (transactionsResult is TransactionsResult.Success && transactionsResult.transactions.isNotEmpty()) { + val currency = transactionsResult.transactions[0].amountRaw.currency + balanceMap[currency] = BalanceItem(Amount.zero(currency), Amount.zero(currency)) + } + } mBalances.postValue(balanceMap) showProgressBar.postValue(false) } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt index 8aaebbc..5c73d6c 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -107,11 +107,11 @@ class PaymentManager( mDetailsShown.value = !oldValue } - fun confirmPay(proposalId: String) { + fun confirmPay(proposalId: String, currency: String) { val args = JSONObject(mapOf("proposalId" to proposalId)) walletBackendApi.sendRequest("confirmPay", args) { _, _ -> - mPayStatus.postValue(PayStatus.Success) + mPayStatus.postValue(PayStatus.Success(currency)) } } @@ -157,5 +157,5 @@ sealed class PayStatus { data class InsufficientBalance(val contractTerms: ContractTerms) : PayStatus() data class AlreadyPaid(val contractTerms: ContractTerms) : PayStatus() data class Error(val error: String) : PayStatus() - object Success : PayStatus() + data class Success(val currency: String) : PayStatus() } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentSuccessfulFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentSuccessfulFragment.kt deleted file mode 100644 index 2a868b0..0000000 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentSuccessfulFragment.kt +++ /dev/null @@ -1,49 +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.payment - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import kotlinx.android.synthetic.main.fragment_payment_successful.* -import net.taler.common.fadeIn -import net.taler.wallet.R - -/** - * Fragment that shows the success message for a payment. - */ -class PaymentSuccessfulFragment : Fragment() { - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_payment_successful, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - successImageView.fadeIn() - successTextView.fadeIn() - backButton.setOnClickListener { - findNavController().navigateUp() - } - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt index 6d31879..ab109bc 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt @@ -30,14 +30,16 @@ import androidx.lifecycle.observe import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.transition.TransitionManager.beginDelayedTransition +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import kotlinx.android.synthetic.main.payment_bottom_bar.* import kotlinx.android.synthetic.main.payment_details.* import net.taler.common.Amount import net.taler.common.ContractTerms import net.taler.common.fadeIn import net.taler.common.fadeOut -import net.taler.wallet.R import net.taler.wallet.MainViewModel +import net.taler.wallet.R /** * Show a payment and ask the user to accept/decline. @@ -97,7 +99,10 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { confirmButton.isEnabled = true confirmButton.setOnClickListener { model.showProgressBar.value = true - paymentManager.confirmPay(payStatus.proposalId) + paymentManager.confirmPay( + payStatus.proposalId, + payStatus.contractTerms.amount.currency + ) confirmButton.fadeOut() confirmProgressBar.fadeIn() } @@ -111,7 +116,10 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { is PayStatus.Success -> { showLoading(false) paymentManager.resetPayStatus() - findNavController().navigate(R.id.action_promptPayment_to_paymentSuccessful) + // TODO bring the user to the currency's transaction page, if there's more than one currency + model.transactionManager.selectedCurrency = payStatus.currency + findNavController().navigate(R.id.action_promptPayment_to_nav_main) + Snackbar.make(requireView(), R.string.payment_initiated, LENGTH_LONG).show() } is PayStatus.AlreadyPaid -> { showLoading(false) diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt index 81d53b9..c6c1ecd 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -45,6 +45,7 @@ class TransactionManager( var selectedCurrency: String? = null var selectedTransaction: Transaction? = null + // TODO maybe cache transactions per currency? private val mTransactions = MutableLiveData<TransactionsResult>() val transactions: LiveData<TransactionsResult> = mTransactions diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt index 7310142..7f573ef 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt @@ -73,9 +73,7 @@ class TransactionWithdrawal( val exchangeBaseUrl: String = "unknown", // TODO fix in wallet-core val confirmed: Boolean, val bankConfirmationUrl: String?, - @JsonProperty("amountEffective") // TODO remove when fixed in wallet-core amountRaw: Amount, - @JsonProperty("amountRaw") // TODO remove when fixed in wallet-core amountEffective: Amount? ) : Transaction(transactionId, timestamp, pending, amountRaw, amountEffective) { override val icon = R.drawable.transaction_withdrawal diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt index 747551b..e700f67 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt @@ -24,12 +24,14 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import kotlinx.android.synthetic.main.fragment_prompt_withdraw.* import net.taler.common.Amount import net.taler.common.fadeIn import net.taler.common.fadeOut -import net.taler.wallet.R import net.taler.wallet.MainViewModel +import net.taler.wallet.R import net.taler.wallet.cleanExchange import net.taler.wallet.withdraw.WithdrawStatus.Loading import net.taler.wallet.withdraw.WithdrawStatus.TermsOfServiceReviewRequired @@ -63,7 +65,11 @@ class PromptWithdrawFragment : Fragment() { setOnClickListener { it.fadeOut() confirmProgressBar.fadeIn() - withdrawManager.acceptWithdrawal(status.talerWithdrawUri, status.exchange) + withdrawManager.acceptWithdrawal( + status.talerWithdrawUri, + status.exchange, + status.amount.currency + ) } isEnabled = true } @@ -71,7 +77,10 @@ class PromptWithdrawFragment : Fragment() { is WithdrawStatus.Success -> { model.showProgressBar.value = false withdrawManager.withdrawStatus.value = null - findNavController().navigate(R.id.action_promptWithdraw_to_withdrawSuccessful) + // TODO bring the user to the currency's transaction page, if there's more than one currency + model.transactionManager.selectedCurrency = status.currency + findNavController().navigate(R.id.action_promptWithdraw_to_nav_main) + Snackbar.make(requireView(), R.string.withdraw_initiated, LENGTH_LONG).show() } is Loading -> { model.showProgressBar.value = true diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt index 6bcd013..75e4daa 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -43,8 +43,7 @@ sealed class WithdrawStatus { ) : WithdrawStatus() data class Withdrawing(val talerWithdrawUri: String) : WithdrawStatus() - - object Success : WithdrawStatus() + data class Success(val currency: String) : WithdrawStatus() data class Error(val message: String?) : WithdrawStatus() } @@ -145,7 +144,7 @@ class WithdrawManager(private val walletBackendApi: WalletBackendApi) { } } - fun acceptWithdrawal(talerWithdrawUri: String, selectedExchange: String) { + fun acceptWithdrawal(talerWithdrawUri: String, selectedExchange: String, currency: String) { val args = JSONObject() args.put("talerWithdrawUri", talerWithdrawUri) args.put("selectedExchange", selectedExchange) @@ -154,7 +153,7 @@ class WithdrawManager(private val walletBackendApi: WalletBackendApi) { walletBackendApi.sendRequest("acceptWithdrawal", args) { isError, result -> if (isError) { - Log.v(TAG, "got acceptWithdrawal error result: ${result.toString(4)}") + Log.v(TAG, "got acceptWithdrawal error result: ${result.toString(2)}") return@sendRequest } Log.v(TAG, "got acceptWithdrawal result") @@ -163,7 +162,7 @@ class WithdrawManager(private val walletBackendApi: WalletBackendApi) { Log.w(TAG, "ignoring acceptWithdrawal result, invalid state: $status") return@sendRequest } - withdrawStatus.postValue(WithdrawStatus.Success) + withdrawStatus.postValue(WithdrawStatus.Success(currency)) } } diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawSuccessfulFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawSuccessfulFragment.kt deleted file mode 100644 index 5daeff1..0000000 --- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawSuccessfulFragment.kt +++ /dev/null @@ -1,44 +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.withdraw - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import kotlinx.android.synthetic.main.fragment_withdraw_successful.* -import net.taler.wallet.R - -class WithdrawSuccessfulFragment : Fragment() { - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_withdraw_successful, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - backButton.setOnClickListener { - findNavController().navigateUp() - } - } - -} diff --git a/wallet/src/main/res/layout/fragment_payment_successful.xml b/wallet/src/main/res/layout/fragment_payment_successful.xml deleted file mode 100644 index 1c45622..0000000 --- a/wallet/src/main/res/layout/fragment_payment_successful.xml +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ 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/> - --> - -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/frameLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_margin="16dp" - tools:context=".payment.PaymentSuccessfulFragment"> - - <ImageView - android:id="@+id/successImageView" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="32dp" - android:src="@drawable/ic_check_circle" - app:layout_constraintBottom_toTopOf="@+id/successTextView" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:ignore="ContentDescription" /> - - <androidx.appcompat.widget.AppCompatTextView - android:id="@+id/successTextView" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_marginBottom="16dp" - android:text="@string/payment_successful" - android:textAlignment="center" - android:textColor="@color/green" - app:autoSizeMaxTextSize="48sp" - app:autoSizeMinTextSize="10sp" - app:autoSizeTextType="uniform" - app:layout_constraintBottom_toTopOf="@+id/backButton" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/successImageView" /> - - <Button - android:id="@+id/backButton" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:text="@string/payment_back_button" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - -</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/wallet/src/main/res/layout/fragment_withdraw_successful.xml b/wallet/src/main/res/layout/fragment_withdraw_successful.xml deleted file mode 100644 index a422492..0000000 --- a/wallet/src/main/res/layout/fragment_withdraw_successful.xml +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ 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/> - --> - -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".withdraw.WithdrawSuccessfulFragment"> - - <TextView - android:id="@+id/withdrawHeadlineView" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="16dp" - android:gravity="center_horizontal|bottom" - android:text="@string/withdraw_accepted" - android:textColor="@color/green" - app:autoSizeMaxTextSize="40sp" - app:autoSizeTextType="uniform" - app:layout_constraintBottom_toTopOf="@+id/withdrawInfoView" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/withdrawInfoView" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="16dp" - android:text="@string/withdraw_success_info" - android:textAlignment="center" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" - app:layout_constraintBottom_toTopOf="@+id/backButton" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/withdrawHeadlineView" /> - - <Button - android:id="@+id/backButton" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_margin="16dp" - android:text="@string/button_continue" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/withdrawInfoView" /> - -</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/wallet/src/main/res/navigation/nav_graph.xml b/wallet/src/main/res/navigation/nav_graph.xml index 5523d8b..a06abad 100644 --- a/wallet/src/main/res/navigation/nav_graph.xml +++ b/wallet/src/main/res/navigation/nav_graph.xml @@ -42,19 +42,14 @@ android:label="Review Payment" tools:layout="@layout/fragment_prompt_payment"> <action - android:id="@+id/action_promptPayment_to_paymentSuccessful" - app:destination="@id/paymentSuccessful" + android:id="@+id/action_promptPayment_to_nav_main" + app:destination="@id/nav_main" app:popUpTo="@id/nav_main" /> <action android:id="@+id/action_promptPayment_to_alreadyPaid" app:destination="@id/alreadyPaid" app:popUpTo="@id/nav_main" /> </fragment> - <fragment - android:id="@+id/paymentSuccessful" - android:name="net.taler.wallet.payment.PaymentSuccessfulFragment" - android:label="Payment Successful" - tools:layout="@layout/fragment_payment_successful" /> <fragment android:id="@+id/nav_settings" @@ -85,28 +80,22 @@ android:label="@string/nav_prompt_withdraw" tools:layout="@layout/fragment_prompt_withdraw"> <action + android:id="@+id/action_promptWithdraw_to_selectExchangeFragment" + app:destination="@id/selectExchangeFragment" /> + <action android:id="@+id/action_promptWithdraw_to_reviewExchangeTOS" app:destination="@id/reviewExchangeTOS" /> <action - android:id="@+id/action_promptWithdraw_to_withdrawSuccessful" - app:destination="@id/withdrawSuccessful" + android:id="@+id/action_promptWithdraw_to_nav_main" + app:destination="@id/nav_main" app:popUpTo="@id/nav_main" /> <action android:id="@+id/action_promptWithdraw_to_errorFragment" app:destination="@id/errorFragment" app:popUpTo="@id/nav_main" /> - <action - android:id="@+id/action_promptWithdraw_to_selectExchangeFragment" - app:destination="@id/selectExchangeFragment" /> </fragment> <fragment - android:id="@+id/withdrawSuccessful" - android:name="net.taler.wallet.withdraw.WithdrawSuccessfulFragment" - android:label="@string/withdraw_accepted" - tools:layout="@layout/fragment_withdraw_successful" /> - - <fragment android:id="@+id/reviewExchangeTOS" android:name="net.taler.wallet.withdraw.ReviewExchangeTosFragment" android:label="@string/nav_exchange_tos" diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index 44b2dad..58b432a 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -99,12 +99,12 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card <string name="payment_balance_insufficient">Balance insufficient!</string> <string name="payment_show_details">Show Details</string> <string name="payment_hide_details">Hide Details</string> - <string name="payment_successful">Payment was successful</string> + <string name="payment_initiated">Payment initiated</string> <string name="payment_back_button">OK</string> <string name="payment_already_paid_title">Already paid</string> <string name="payment_already_paid">You\'ve already paid for this purchase.</string> - <string name="withdraw_accepted">Withdrawal accepted</string> + <string name="withdraw_initiated">Withdrawal initiated</string> <string name="withdraw_success_info">The wire transfer now needs to be confirmed with the bank. Once the wire transfer is complete, the digital cash will automatically show in this wallet.</string> <string name="withdraw_total">Withdraw</string> <string name="withdraw_fees">Fee</string> |