diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-12-20 01:52:22 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-12-20 01:52:22 +0100 |
commit | ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca (patch) | |
tree | 8b22d6a2092a4c637eba3f96e66399fb4ec8b264 /app/src/main/java | |
parent | 47b7eab07140dd20710e84b47b43da1de8123fb4 (diff) | |
download | wallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.tar.gz wallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.tar.bz2 wallet-android-ab6effe9e2fb7fab1f310689ca5ae3ae7b7099ca.zip |
UI tweaks in progress
Diffstat (limited to 'app/src/main/java')
-rw-r--r-- | app/src/main/java/net/taler/wallet/PromptPayment.kt | 5 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/Settings.kt | 50 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/ShowBalance.kt | 81 | ||||
-rw-r--r-- | app/src/main/java/net/taler/wallet/WalletViewModel.kt | 22 |
4 files changed, 145 insertions, 13 deletions
diff --git a/app/src/main/java/net/taler/wallet/PromptPayment.kt b/app/src/main/java/net/taler/wallet/PromptPayment.kt index 2714a7f..aa7512d 100644 --- a/app/src/main/java/net/taler/wallet/PromptPayment.kt +++ b/app/src/main/java/net/taler/wallet/PromptPayment.kt @@ -154,6 +154,11 @@ class PromptPayment : Fragment() { errorTextView.visibility = View.GONE abortPaymentButton.setOnClickListener { + when (val ps = model.payStatus.value) { + is PayStatus.Prepared -> { + model.abortProposal(ps.proposalId) + } + } model.payStatus.value = PayStatus.None() requireActivity().findNavController(R.id.nav_host_fragment).navigateUp() } diff --git a/app/src/main/java/net/taler/wallet/Settings.kt b/app/src/main/java/net/taler/wallet/Settings.kt index ab3fec4..7087e78 100644 --- a/app/src/main/java/net/taler/wallet/Settings.kt +++ b/app/src/main/java/net/taler/wallet/Settings.kt @@ -19,7 +19,10 @@ package net.taler.wallet import android.app.Dialog import android.content.Context import android.content.DialogInterface +import android.content.Intent import android.os.Bundle +import android.provider.DocumentsContract +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -76,6 +79,25 @@ class ResetDialogFragment : DialogFragment() { */ class Settings : Fragment() { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { + CREATE_FILE -> { + if (data == null) { + return + } + Log.i(TAG, "got createFile result with URL ${data.data}") + } + PICK_FILE -> { + if (data == null) { + return + } + Log.i(TAG, "got pickFile result with URL ${data.data}") + } + else -> { + + } + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -87,6 +109,34 @@ class Settings : Fragment() { val d = ResetDialogFragment() d.show(requireActivity().supportFragmentManager, "walletResetDialog") } + view.findViewById<Button>(R.id.button_backup_export).setOnClickListener { + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/json" + putExtra(Intent.EXTRA_TITLE, "taler-wallet-backup.json") + + // Optionally, specify a URI for the directory that should be opened in + // the system file picker before your app creates the document. + //putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri) + } + startActivityForResult(intent, CREATE_FILE) + } + view.findViewById<Button>(R.id.button_backup_import).setOnClickListener { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/json" + + //putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri) + } + + startActivityForResult(intent, PICK_FILE) + } return view } + + companion object { + private const val TAG = "taler-wallet" + private const val CREATE_FILE = 1 + private const val PICK_FILE = 2 + } } diff --git a/app/src/main/java/net/taler/wallet/ShowBalance.kt b/app/src/main/java/net/taler/wallet/ShowBalance.kt index f8faef9..c4c96d6 100644 --- a/app/src/main/java/net/taler/wallet/ShowBalance.kt +++ b/app/src/main/java/net/taler/wallet/ShowBalance.kt @@ -20,25 +20,30 @@ package net.taler.wallet import android.os.Bundle import android.util.Log import android.view.* -import androidx.fragment.app.Fragment import android.widget.Button +import android.widget.LinearLayout import android.widget.TextView +import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.snackbar.Snackbar import com.google.zxing.integration.android.IntentIntegrator import me.zhanghai.android.materialprogressbar.MaterialProgressBar +import org.json.JSONObject -class WalletBalanceAdapter(private var myDataset: WalletBalances) : RecyclerView.Adapter<WalletBalanceAdapter.MyViewHolder>() { +class WalletBalanceAdapter(private var myDataset: WalletBalances, private var model: WalletViewModel) : + RecyclerView.Adapter<WalletBalanceAdapter.MyViewHolder>() { init { setHasStableIds(false) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { - val rowView = LayoutInflater.from(parent.context).inflate(R.layout.balance_row, parent, false) + val rowView = + LayoutInflater.from(parent.context).inflate(R.layout.balance_row, parent, false) return MyViewHolder(rowView) } @@ -73,14 +78,23 @@ class WalletBalanceAdapter(private var myDataset: WalletBalances) : RecyclerView class MyViewHolder(val rowView: View) : RecyclerView.ViewHolder(rowView) } -class PendingOperationsAdapter(private var myDataset: PendingOperations) : RecyclerView.Adapter<PendingOperationsAdapter.MyViewHolder>() { +class PendingOperationsAdapter(private var myDataset: PendingOperations) : + RecyclerView.Adapter<PendingOperationsAdapter.MyViewHolder>() { + + private var listener: PendingOperationClickListener? = null + init { setHasStableIds(false) } + fun setPendingOperationClickListener(listener: PendingOperationClickListener) { + this.listener = listener + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { - val rowView = LayoutInflater.from(parent.context).inflate(R.layout.pending_row, parent, false) + val rowView = + LayoutInflater.from(parent.context).inflate(R.layout.pending_row, parent, false) return MyViewHolder(rowView) } @@ -90,6 +104,26 @@ class PendingOperationsAdapter(private var myDataset: PendingOperations) : Recyc override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val p = myDataset.pending[position] + val pendingContainer = holder.rowView.findViewById<LinearLayout>(R.id.pending_container) + pendingContainer.setOnClickListener { + this.listener?.onPendingOperationClick(p.type, p.detail) + } + when (p.type) { + "proposal-choice" -> { + val btn1 = holder.rowView.findViewById<TextView>(R.id.button_pending_action_1) + btn1.text = "Refuse Proposal" + btn1.visibility = View.VISIBLE + btn1.setOnClickListener { + this.listener?.onPendingOperationActionClick(p.type, p.detail) + } + } + else -> { + val btn1 = holder.rowView.findViewById<TextView>(R.id.button_pending_action_1) + btn1.text = "(no action)" + btn1.visibility = View.GONE + btn1.setOnClickListener {} + } + } val textView = holder.rowView.findViewById<TextView>(R.id.pending_text) val subTextView = holder.rowView.findViewById<TextView>(R.id.pending_subtext) subTextView.text = p.detail.toString(1) @@ -104,12 +138,16 @@ class PendingOperationsAdapter(private var myDataset: PendingOperations) : Recyc class MyViewHolder(val rowView: View) : RecyclerView.ViewHolder(rowView) } +interface PendingOperationClickListener { + fun onPendingOperationClick(type: String, detail: JSONObject) + fun onPendingOperationActionClick(type: String, detail: JSONObject) +} /** * A simple [Fragment] subclass. * */ -class ShowBalance : Fragment() { +class ShowBalance : Fragment(), PendingOperationClickListener { private lateinit var pendingOperationsLabel: View lateinit var balancesView: RecyclerView @@ -209,10 +247,9 @@ class ShowBalance : Fragment() { this.balancesView = view.findViewById(R.id.list_balances) this.balancesPlaceholderView = view.findViewById(R.id.list_balances_placeholder) - val balances = model.balances.value!! - balancesAdapter = WalletBalanceAdapter(balances) + balancesAdapter = WalletBalanceAdapter(balances, model) view.findViewById<RecyclerView>(R.id.list_balances).apply { val myLayoutManager = LinearLayoutManager(context) @@ -242,6 +279,7 @@ class ShowBalance : Fragment() { }) pendingAdapter = PendingOperationsAdapter(PendingOperations(listOf())) + pendingAdapter.setPendingOperationClickListener(this) this.pendingOperationsLabel = view.findViewById<View>(R.id.pending_operations_label) @@ -259,4 +297,31 @@ class ShowBalance : Fragment() { return view } + + override fun onPendingOperationClick(type: String, detail: JSONObject) { + val v = view ?: return + when (type) { + else -> { + val bar = Snackbar.make( + v, + "No detail view for ${type} implemented yet.", + Snackbar.LENGTH_SHORT + ) + bar.show() + } + } + } + + override fun onPendingOperationActionClick(type: String, detail: JSONObject) { + when (type) { + "proposal-choice" -> { + Log.v(TAG, "got action click on proposal-choice") + val proposalId = detail.optString("proposalId", "") + if (proposalId == "") { + return + } + model.abortProposal(proposalId) + } + } + } } diff --git a/app/src/main/java/net/taler/wallet/WalletViewModel.kt b/app/src/main/java/net/taler/wallet/WalletViewModel.kt index e5e888d..b933bf1 100644 --- a/app/src/main/java/net/taler/wallet/WalletViewModel.kt +++ b/app/src/main/java/net/taler/wallet/WalletViewModel.kt @@ -275,8 +275,8 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) { if (result.has("proposalId")) { proposalId = result.getString("proposalId") } - if (result.has("contractTerms")) { - val ctJson = result.getJSONObject("contractTerms") + if (result.has("contractTermsRaw")) { + val ctJson = JSONObject(result.getString("contractTermsRaw")) val amount = Amount.fromString(ctJson.getString("amount")) val summary = ctJson.getString("summary") contractTerms = ContractTerms(summary, amount) @@ -301,10 +301,22 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) { } } - fun confirmPay(proposalId: String) { - val msg = JSONObject() - msg.put("operation", "confirmPay") + fun abortProposal(proposalId: String) { + val args = JSONObject() + args.put("proposalId", proposalId) + Log.i(TAG, "aborting proposal") + + walletBackendApi.sendRequest("abortProposal", args) { isError, _ -> + if (isError) { + Log.e(TAG, "received error response to abortProposal") + return@sendRequest + } + payStatus.postValue(PayStatus.None()) + } + } + + fun confirmPay(proposalId: String) { val args = JSONObject() args.put("proposalId", proposalId) |