summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt
diff options
context:
space:
mode:
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt')
-rw-r--r--wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt180
1 files changed, 180 insertions, 0 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt b/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt
new file mode 100644
index 00000000..946e5ba7
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsFragment.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.pending
+
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import android.view.View
+import android.view.View.GONE
+import android.view.View.VISIBLE
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.Observer
+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.android.material.snackbar.Snackbar.LENGTH_SHORT
+import kotlinx.android.synthetic.main.fragment_pending_operations.*
+import net.taler.wallet.R
+import net.taler.wallet.TAG
+import net.taler.wallet.WalletViewModel
+import org.json.JSONObject
+
+interface PendingOperationClickListener {
+ fun onPendingOperationClick(type: String, detail: JSONObject)
+ fun onPendingOperationActionClick(type: String, detail: JSONObject)
+}
+
+class PendingOperationsFragment : Fragment(), PendingOperationClickListener {
+
+ private val model: WalletViewModel by activityViewModels()
+ private val pendingOperationsManager by lazy { model.pendingOperationsManager }
+
+ private val pendingAdapter = PendingOperationsAdapter(emptyList(), 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_pending_operations, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ list_pending.apply {
+ val myLayoutManager = LinearLayoutManager(requireContext())
+ val myItemDecoration =
+ DividerItemDecoration(requireContext(), myLayoutManager.orientation)
+ layoutManager = myLayoutManager
+ adapter = pendingAdapter
+ addItemDecoration(myItemDecoration)
+ }
+
+ pendingOperationsManager.pendingOperations.observe(viewLifecycleOwner, Observer {
+ updatePending(it)
+ })
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ return when (item.itemId) {
+ R.id.retry_pending -> {
+ pendingOperationsManager.retryPendingNow()
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+ inflater.inflate(R.menu.pending_operations, menu)
+ super.onCreateOptionsMenu(menu, inflater)
+ }
+
+ private fun updatePending(pendingOperations: List<PendingOperationInfo>) {
+ pendingAdapter.update(pendingOperations)
+ }
+
+ override fun onPendingOperationClick(type: String, detail: JSONObject) {
+ Snackbar.make(view!!, "No detail view for $type implemented yet.", LENGTH_SHORT).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.paymentManager.abortProposal(proposalId)
+ }
+ }
+ }
+
+}
+
+class PendingOperationsAdapter(
+ private var items: List<PendingOperationInfo>,
+ private val listener: PendingOperationClickListener
+) :
+ RecyclerView.Adapter<PendingOperationsAdapter.MyViewHolder>() {
+
+ init {
+ setHasStableIds(false)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
+ val rowView =
+ LayoutInflater.from(parent.context).inflate(R.layout.pending_row, parent, false)
+ return MyViewHolder(rowView)
+ }
+
+ override fun getItemCount(): Int {
+ return items.size
+ }
+
+ override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
+ val p = items[position]
+ val pendingContainer = holder.rowView.findViewById<LinearLayout>(R.id.pending_container)
+ pendingContainer.setOnClickListener {
+ 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 = btn1.context.getString(R.string.pending_operations_refuse)
+ btn1.visibility = VISIBLE
+ btn1.setOnClickListener {
+ listener.onPendingOperationActionClick(p.type, p.detail)
+ }
+ }
+ else -> {
+ val btn1 = holder.rowView.findViewById<TextView>(R.id.button_pending_action_1)
+ btn1.text = btn1.context.getString(R.string.pending_operations_no_action)
+ btn1.visibility = 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)
+ textView.text = p.type
+ }
+
+ fun update(items: List<PendingOperationInfo>) {
+ this.items = items
+ this.notifyDataSetChanged()
+ }
+
+ class MyViewHolder(val rowView: View) : RecyclerView.ViewHolder(rowView)
+
+}