gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-android] branch master updated (d576e64 -> 056be53)


From: gnunet
Subject: [taler-taler-android] branch master updated (d576e64 -> 056be53)
Date: Thu, 30 Apr 2020 19:33:39 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a change to branch master
in repository taler-android.

    from d576e64  [wallet] manage Google Play data with fastlane
     new d284953  [wallet] Fix selection of refresh events (that are supposed 
to go away)
     new 0d4d635  [wallet] refresh transactions when certain notifications 
arrive
     new 056be53  [wallet] show ToS markdown in expandable sections

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 build.gradle                                       |  2 +-
 wallet/build.gradle                                |  8 +-
 .../main/java/net/taler/wallet/MainViewModel.kt    | 15 +++-
 .../wallet/transactions/TransactionAdapter.kt      |  6 +-
 .../wallet/withdraw/ReviewExchangeTosFragment.kt   | 29 ++++++-
 .../java/net/taler/wallet/withdraw/TosAdapter.kt   | 90 ++++++++++++++++++++++
 .../java/net/taler/wallet/withdraw/TosSection.kt   | 65 ++++++++++++++++
 .../main/res/drawable/ic_keyboard_arrow_down.xml   |  2 +-
 .../src/main/res/drawable/ic_keyboard_arrow_up.xml |  2 +-
 .../res/layout/fragment_review_exchange_tos.xml    | 37 +++++----
 .../src/main/res/layout/list_item_tos.xml          | 46 +++++++----
 wallet/src/main/res/values/strings.xml             |  1 +
 12 files changed, 260 insertions(+), 43 deletions(-)
 create mode 100644 wallet/src/main/java/net/taler/wallet/withdraw/TosAdapter.kt
 create mode 100644 wallet/src/main/java/net/taler/wallet/withdraw/TosSection.kt
 copy cashier/src/main/res/drawable/ic_clear.xml => 
wallet/src/main/res/drawable/ic_keyboard_arrow_down.xml (64%)
 copy cashier/src/main/res/drawable/ic_clear.xml => 
wallet/src/main/res/drawable/ic_keyboard_arrow_up.xml (64%)
 copy merchant-terminal/src/main/res/layout/list_item_product.xml => 
wallet/src/main/res/layout/list_item_tos.xml (51%)

diff --git a/build.gradle b/build.gradle
index 3955891..ec72fa3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,6 @@
 buildscript {
     ext.kotlin_version = '1.3.72'
-    ext.nav_version = "2.2.1"
+    ext.nav_version = "2.2.2"
     ext.build_tools_version = "29.0.2"
     repositories {
         google()
diff --git a/wallet/build.gradle b/wallet/build.gradle
index a872e8c..28431b3 100644
--- a/wallet/build.gradle
+++ b/wallet/build.gradle
@@ -67,7 +67,7 @@ dependencies {
     implementation project(":taler-kotlin-common")
     implementation 'net.taler:akono:0.1'
 
-    implementation 'androidx.preference:preference:1.1.0'
+    implementation 'androidx.preference:preference:1.1.1'
     implementation 'com.google.android.material:material:1.1.0'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
 
@@ -89,6 +89,12 @@ dependencies {
     // Nicer ProgressBar
     implementation 'me.zhanghai.android.materialprogressbar:library:1.6.1'
 
+    // Markdown rendering
+    final def  markwon_version =  '4.3.1'
+    implementation  "io.noties.markwon:core:$markwon_version"
+    implementation  "io.noties.markwon:ext-tables:$markwon_version"
+    implementation  "io.noties.markwon:recycler:$markwon_version"
+
     // JSON parsing and serialization
     implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2'
 
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt 
b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index 907278c..159540b 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -37,6 +37,12 @@ import org.json.JSONObject
 
 const val TAG = "taler-wallet"
 
+private val transactionNotifications = listOf(
+    "proposal-accepted",
+    "refresh-revealed",
+    "withdraw-group-finished"
+)
+
 data class BalanceItem(val available: Amount, val pendingIncoming: Amount)
 
 class MainViewModel(val app: Application) : AndroidViewModel(app) {
@@ -56,6 +62,13 @@ class MainViewModel(val app: Application) : 
AndroidViewModel(app) {
         ) {
             Log.i(TAG, "Received notification from wallet-core: 
${payload.toString(2)}")
             loadBalances()
+            if (payload.optString("type") in transactionNotifications) {
+                // update transaction list
+                // TODO do this in a better way
+                transactionManager.showAll.value?.let {
+                    transactionManager.showAll.postValue(it)
+                }
+            }
         }
     }
 
@@ -66,7 +79,7 @@ class MainViewModel(val app: Application) : 
AndroidViewModel(app) {
     val withdrawManager = WithdrawManager(walletBackendApi)
     val paymentManager = PaymentManager(walletBackendApi, mapper)
     val pendingOperationsManager = PendingOperationsManager(walletBackendApi)
-    val transactionManager = TransactionManager(walletBackendApi, mapper)
+    val transactionManager: TransactionManager = 
TransactionManager(walletBackendApi, mapper)
     val refundManager = RefundManager(walletBackendApi)
 
     override fun onCleared() {
diff --git 
a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt 
b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
index a72b8a8..440d07f 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt
@@ -81,15 +81,15 @@ internal class TransactionAdapter(
         private val time: TextView = v.findViewById(R.id.time)
         private val amount: TextView = v.findViewById(R.id.amount)
 
-        private val selectableBackground = v.background
+        private val selectableForeground = v.foreground
         private val amountColor = amount.currentTextColor
 
         open fun bind(transaction: Transaction, selected: Boolean) {
             if (devMode || transaction.detailPageLayout != 0) {
-                v.background = selectableBackground
+                v.foreground = selectableForeground
                 v.setOnClickListener { 
listener.onTransactionClicked(transaction) }
             } else {
-                v.background = null
+                v.foreground = null
                 v.setOnClickListener(null)
             }
             v.isActivated = selected
diff --git 
a/wallet/src/main/java/net/taler/wallet/withdraw/ReviewExchangeTosFragment.kt 
b/wallet/src/main/java/net/taler/wallet/withdraw/ReviewExchangeTosFragment.kt
index 47b6f14..ffaef5a 100644
--- 
a/wallet/src/main/java/net/taler/wallet/withdraw/ReviewExchangeTosFragment.kt
+++ 
b/wallet/src/main/java/net/taler/wallet/withdraw/ReviewExchangeTosFragment.kt
@@ -16,7 +16,6 @@
 
 package net.taler.wallet.withdraw
 
-
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -25,16 +24,20 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.Observer
 import androidx.navigation.fragment.findNavController
+import io.noties.markwon.Markwon
 import kotlinx.android.synthetic.main.fragment_review_exchange_tos.*
 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 java.text.ParseException
 
 class ReviewExchangeTosFragment : Fragment() {
 
     private val model: MainViewModel by activityViewModels()
     private val withdrawManager by lazy { model.withdrawManager }
+    private val markwon by lazy { Markwon.builder(requireContext()).build() }
+    private val adapter by lazy { TosAdapter(markwon) }
 
     override fun onCreateView(
         inflater: LayoutInflater,
@@ -53,8 +56,18 @@ class ReviewExchangeTosFragment : Fragment() {
         withdrawManager.withdrawStatus.observe(viewLifecycleOwner, Observer {
             when (it) {
                 is WithdrawStatus.TermsOfServiceReviewRequired -> {
-                    tosTextView.text = it.tosText
-                    tosTextView.fadeIn()
+                    val sections = try {
+                        // TODO remove next line once exchange delivers proper 
markdown
+                        val text = it.tosText.replace("****************", 
"================")
+                        parseTos(markwon, text)
+                    } catch (e: ParseException) {
+                        onTosError(e.message ?: "Unknown Error")
+                        return@Observer
+                    }
+                    adapter.setSections(sections)
+                    tosList.adapter = adapter
+                    tosList.fadeIn()
+
                     acceptTosCheckBox.fadeIn()
                     progressBar.fadeOut()
                 }
@@ -68,4 +81,12 @@ class ReviewExchangeTosFragment : Fragment() {
         })
     }
 
+    private fun onTosError(msg: String) {
+        tosList.fadeIn()
+        progressBar.fadeOut()
+        buttonCard.fadeOut()
+        errorView.text = getString(R.string.exchange_tos_error, "\n\n$msg")
+        errorView.fadeIn()
+    }
+
 }
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/TosAdapter.kt 
b/wallet/src/main/java/net/taler/wallet/withdraw/TosAdapter.kt
new file mode 100644
index 0000000..74a798f
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/TosAdapter.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.transition.TransitionManager.beginDelayedTransition
+import android.view.LayoutInflater
+import android.view.View
+import android.view.View.GONE
+import android.view.View.VISIBLE
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import io.noties.markwon.Markwon
+import net.taler.wallet.R
+
+class TosAdapter(
+    private val markwon: Markwon
+) : RecyclerView.Adapter<TosAdapter.TosSectionViewHolder>() {
+
+    private val items = ArrayList<TosSection>()
+
+    init {
+        setHasStableIds(true)
+    }
+
+    override fun getItemCount() = items.size
+
+    override fun getItemId(position: Int): Long {
+        return items[position].node.hashCode().toLong()
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
TosSectionViewHolder {
+        val v = 
LayoutInflater.from(parent.context).inflate(R.layout.list_item_tos, parent, 
false)
+        return TosSectionViewHolder(v)
+    }
+
+    override fun onBindViewHolder(holder: TosSectionViewHolder, position: Int) 
{
+        holder.bind(items[position])
+    }
+
+    fun setSections(sections: List<TosSection>) {
+        items.clear()
+        items.addAll(sections)
+        notifyDataSetChanged()
+    }
+
+    inner class TosSectionViewHolder(private val v: View) : 
RecyclerView.ViewHolder(v) {
+        private val sectionTitle: TextView = v.findViewById(R.id.sectionTitle)
+        private val expandButton: ImageView = v.findViewById(R.id.expandButton)
+        private val sectionText: TextView = v.findViewById(R.id.sectionText)
+
+        fun bind(item: TosSection) {
+            sectionTitle.text = item.title
+            showSection(item, item.expanded)
+            val onClickListener = View.OnClickListener {
+                if (!item.expanded) beginDelayedTransition(v as ViewGroup)
+                item.expanded = !item.expanded
+                showSection(item, item.expanded)
+            }
+            sectionTitle.setOnClickListener(onClickListener)
+        }
+
+        private fun showSection(item: TosSection, show: Boolean) {
+            if (show) {
+                expandButton.setImageResource(R.drawable.ic_keyboard_arrow_up)
+                markwon.setParsedMarkdown(sectionText, 
markwon.render(item.node))
+                sectionText.visibility = VISIBLE
+            } else {
+                
expandButton.setImageResource(R.drawable.ic_keyboard_arrow_down)
+                sectionText.visibility = GONE
+            }
+        }
+    }
+
+}
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/TosSection.kt 
b/wallet/src/main/java/net/taler/wallet/withdraw/TosSection.kt
new file mode 100644
index 0000000..72a9e34
--- /dev/null
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/TosSection.kt
@@ -0,0 +1,65 @@
+/*
+ * 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 io.noties.markwon.Markwon
+import org.commonmark.node.Document
+import org.commonmark.node.Heading
+import org.commonmark.node.Node
+import org.commonmark.node.Text
+import java.text.ParseException
+
+data class TosSection(
+    val title: String,
+    val node: Node,
+    var expanded: Boolean = false
+)
+
+@Throws(ParseException::class)
+internal fun parseTos(markwon: Markwon, text: String): List<TosSection> {
+    var node: Node? =
+        markwon.parse(text).firstChild ?: throw ParseException("Invalid 
markdown", 0)
+    var lastHeading: String? = null
+    var section = Document()
+    val sections = ArrayList<TosSection>()
+    while (node != null) {
+        val next: Node? = node.next
+        if (node is Heading && node.level == 1) {
+            // if lastHeading exists, close previous section
+            if (lastHeading != null) {
+                sections.add(TosSection(lastHeading, section))
+                section = Document()
+            }
+            // check that this is a plain heading
+            if (node.firstChild !is Text || node.firstChild.next != null) {
+                throw ParseException(
+                    "Primary heading includes more than just text", 
sections.size
+                )
+            }
+            // start new section
+            lastHeading = (node.firstChild as Text).literal
+        } else if (lastHeading == null) {
+            throw ParseException("Found text before first primary heading", 0)
+        } else {
+            section.appendChild(node)
+        }
+        node = next
+    }
+    check(lastHeading != null)
+    sections.add(TosSection(lastHeading, section))
+    return sections
+}
diff --git a/cashier/src/main/res/drawable/ic_clear.xml 
b/wallet/src/main/res/drawable/ic_keyboard_arrow_down.xml
similarity index 64%
copy from cashier/src/main/res/drawable/ic_clear.xml
copy to wallet/src/main/res/drawable/ic_keyboard_arrow_down.xml
index f50fd99..c7ba402 100644
--- a/cashier/src/main/res/drawable/ic_clear.xml
+++ b/wallet/src/main/res/drawable/ic_keyboard_arrow_down.xml
@@ -5,5 +5,5 @@
     android:viewportHeight="24.0">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 
5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
+        android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z" 
/>
 </vector>
diff --git a/cashier/src/main/res/drawable/ic_clear.xml 
b/wallet/src/main/res/drawable/ic_keyboard_arrow_up.xml
similarity index 64%
copy from cashier/src/main/res/drawable/ic_clear.xml
copy to wallet/src/main/res/drawable/ic_keyboard_arrow_up.xml
index f50fd99..328e17c 100644
--- a/cashier/src/main/res/drawable/ic_clear.xml
+++ b/wallet/src/main/res/drawable/ic_keyboard_arrow_up.xml
@@ -5,5 +5,5 @@
     android:viewportHeight="24.0">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 
5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
+        android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z" />
 </vector>
diff --git a/wallet/src/main/res/layout/fragment_review_exchange_tos.xml 
b/wallet/src/main/res/layout/fragment_review_exchange_tos.xml
index 2587c1a..ec8d996 100644
--- a/wallet/src/main/res/layout/fragment_review_exchange_tos.xml
+++ b/wallet/src/main/res/layout/fragment_review_exchange_tos.xml
@@ -21,36 +21,43 @@
     android:layout_height="match_parent"
     tools:context=".withdraw.ReviewExchangeTosFragment">
 
-    <ScrollView
-        android:id="@+id/tosScrollView"
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/tosList"
         android:layout_width="0dp"
         android:layout_height="0dp"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
         app:layout_constraintBottom_toTopOf="@+id/buttonCard"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <TextView
-            android:id="@+id/tosTextView"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:padding="16dp"
-            android:visibility="invisible"
-            tools:text="@tools:sample/lorem/random"
-            tools:visibility="visible" />
-
-    </ScrollView>
+        app:layout_constraintTop_toTopOf="parent"
+        tools:listitem="@layout/list_item_tos" />
 
     <ProgressBar
         android:id="@+id/progressBar"
         style="?android:attr/progressBarStyleLarge"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        app:layout_constraintBottom_toBottomOf="@+id/tosScrollView"
+        app:layout_constraintBottom_toBottomOf="@+id/tosList"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <TextView
+        android:id="@+id/errorView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:gravity="center"
+        android:textColor="@color/red"
+        android:textSize="16sp"
+        android:visibility="invisible"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="@string/exchange_tos_error"
+        tools:visibility="visible" />
+
     <com.google.android.material.card.MaterialCardView
         android:id="@+id/buttonCard"
         style="@style/BottomCard"
diff --git a/merchant-terminal/src/main/res/layout/list_item_product.xml 
b/wallet/src/main/res/layout/list_item_tos.xml
similarity index 51%
copy from merchant-terminal/src/main/res/layout/list_item_product.xml
copy to wallet/src/main/res/layout/list_item_tos.xml
index 6ef3611..7a584dc 100644
--- a/merchant-terminal/src/main/res/layout/list_item_product.xml
+++ b/wallet/src/main/res/layout/list_item_tos.xml
@@ -14,42 +14,56 @@
   ~ GNU Taler; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
   -->
 
-<com.google.android.material.card.MaterialCardView 
xmlns:android="http://schemas.android.com/apk/res/android";
+<androidx.cardview.widget.CardView 
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="wrap_content"
-    android:layout_margin="4dp"
-    android:clickable="true"
-    android:focusable="true"
     app:cardUseCompatPadding="true">
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="8dp">
+        android:layout_height="wrap_content">
 
         <TextView
-            android:id="@+id/name"
+            android:id="@+id/sectionTitle"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:textColor="?android:textColorPrimary"
-            android:textStyle="bold"
+            android:background="?attr/selectableItemBackground"
+            android:paddingStart="8dp"
+            android:paddingTop="8dp"
+            android:paddingEnd="56dp"
+            android:paddingBottom="8dp"
+            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
-            tools:text="Steak and two Eggs" />
+            tools:text="A Terms of Service section title that might be rather 
long in some cases" />
+
+        <ImageView
+            android:id="@+id/expandButton"
+            android:layout_width="48dp"
+            android:layout_height="0dp"
+            android:padding="8dp"
+            android:scaleType="center"
+            android:src="@drawable/ic_keyboard_arrow_up"
+            app:layout_constraintBottom_toBottomOf="@+id/sectionTitle"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/sectionTitle"
+            app:tint="?android:attr/textColorPrimary"
+            tools:ignore="ContentDescription" />
 
         <TextView
-            android:id="@+id/price"
+            android:id="@+id/sectionText"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:textColor="?android:textColorSecondary"
+            android:padding="8dp"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/name"
-            tools:text="7.95" />
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/sectionTitle"
+            tools:text="@tools:sample/lorem/random" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 
-</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
+</androidx.cardview.widget.CardView>
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index cc846cd..dd3a810 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -128,6 +128,7 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="exchange_fee_wire_fee_wire_fee">Wire Fee: %s</string>
     <string name="exchange_fee_wire_fee_closing_fee">Closing Fee: %s</string>
     <string name="exchange_tos_accept">Accept Terms of Service</string>
+    <string name="exchange_tos_error">Error showing Terms of Service: 
%s</string>
 
     <string name="pending_operations_title">Pending Operations</string>
     <string name="pending_operations_refuse">Refuse Proposal</string>

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]