gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-android] branch master updated (64cd56e -> c9fb036)


From: gnunet
Subject: [taler-taler-android] branch master updated (64cd56e -> c9fb036)
Date: Mon, 20 Jul 2020 21:38:29 +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 64cd56e  [wallet] adapt code to new TransactionWithdrawal API
     new 35fb368  [wallet] manual withdrawals are confirmed when not pending 
anymore
     new de69768  [wallet] move withdrawal code to withdraw package
     new c9fb036  [pos] create merchant-lib and move first v1 API endpoint there

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:
 .gitlab-ci.yml                                     |  1 +
 .idea/gradle.xml                                   |  1 +
 {anastasis-ui => merchant-lib}/.gitignore          |  0
 merchant-lib/.gitlab-ci.yml                        | 11 ++++
 {anastasis-ui => merchant-lib}/build.gradle        | 34 ++++---------
 {anastasis-ui => merchant-lib}/consumer-rules.pro  |  0
 {anastasis-ui => merchant-lib}/proguard-rules.pro  |  0
 .../src/main/AndroidManifest.xml                   |  3 +-
 .../java/net/taler/merchantlib/ConfigResponse.kt   | 23 +++++----
 .../main/java/net/taler/merchantlib/MerchantApi.kt | 43 ++++++++++++++++
 .../java/net/taler/merchantlib/MerchantApiTest.kt  | 35 +++++++------
 .../java/net/taler/merchantlib/MockHttpClient.kt   | 58 ++++++++++++++++++++++
 merchant-terminal/build.gradle                     |  8 ++-
 .../java/net/taler/merchantpos/MainViewModel.kt    |  4 +-
 .../net/taler/merchantpos/config/ConfigManager.kt  | 31 +++++++-----
 merchant-terminal/src/main/res/values/strings.xml  |  1 +
 settings.gradle                                    |  1 +
 .../net/taler/wallet/exchanges/ExchangeManager.kt  | 14 ------
 .../net/taler/wallet/transactions/Transactions.kt  |  7 ++-
 .../ManualWithdrawFragment.kt                      | 12 +++--
 .../net/taler/wallet/withdraw/WithdrawManager.kt   | 16 ++++++
 wallet/src/main/res/navigation/nav_graph.xml       |  2 +-
 wallet/src/main/res/values/strings.xml             |  2 +-
 23 files changed, 223 insertions(+), 84 deletions(-)
 copy {anastasis-ui => merchant-lib}/.gitignore (100%)
 create mode 100644 merchant-lib/.gitlab-ci.yml
 copy {anastasis-ui => merchant-lib}/build.gradle (64%)
 copy {anastasis-ui => merchant-lib}/consumer-rules.pro (100%)
 copy {anastasis-ui => merchant-lib}/proguard-rules.pro (100%)
 copy {taler-kotlin-common => merchant-lib}/src/main/AndroidManifest.xml (91%)
 copy anastasis-ui/src/main/java/org/gnu/anastasis/ui/identity/Locations.kt => 
merchant-lib/src/main/java/net/taler/merchantlib/ConfigResponse.kt (61%)
 create mode 100644 
merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt
 copy wallet/src/androidTest/java/net/taler/wallet/ExampleInstrumentedTest.kt 
=> merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt (54%)
 create mode 100644 
merchant-lib/src/test/java/net/taler/merchantlib/MockHttpClient.kt
 rename wallet/src/main/java/net/taler/wallet/{exchanges => 
withdraw}/ManualWithdrawFragment.kt (83%)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index da3611e..48f1aec 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,6 +11,7 @@ stages:
 
 include:
   - local: 'cashier/.gitlab-ci.yml'
+  - local: 'merchant-lib/.gitlab-ci.yml'
   - local: 'merchant-terminal/.gitlab-ci.yml'
   - local: 'taler-kotlin-common/.gitlab-ci.yml'
   - local: 'wallet/.gitlab-ci.yml'
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 697ff36..581abbf 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -12,6 +12,7 @@
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/anastasis-ui" />
             <option value="$PROJECT_DIR$/cashier" />
+            <option value="$PROJECT_DIR$/merchant-lib" />
             <option value="$PROJECT_DIR$/merchant-terminal" />
             <option value="$PROJECT_DIR$/taler-kotlin-common" />
             <option value="$PROJECT_DIR$/wallet" />
diff --git a/anastasis-ui/.gitignore b/merchant-lib/.gitignore
similarity index 100%
copy from anastasis-ui/.gitignore
copy to merchant-lib/.gitignore
diff --git a/merchant-lib/.gitlab-ci.yml b/merchant-lib/.gitlab-ci.yml
new file mode 100644
index 0000000..62a7516
--- /dev/null
+++ b/merchant-lib/.gitlab-ci.yml
@@ -0,0 +1,11 @@
+merchant_lib_test:
+  stage: test
+  only:
+    changes:
+      - merchant-lib/**/*
+      - build.gradle
+  script: ./gradlew :merchant-lib:check
+  artifacts:
+    paths:
+      - merchant-lib/build/reports/lint-results.html
+    expire_in: 1 week
diff --git a/anastasis-ui/build.gradle b/merchant-lib/build.gradle
similarity index 64%
copy from anastasis-ui/build.gradle
copy to merchant-lib/build.gradle
index 0391c7c..08da35d 100644
--- a/anastasis-ui/build.gradle
+++ b/merchant-lib/build.gradle
@@ -14,6 +14,10 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
+plugins {
+    id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
+}
+
 apply plugin: 'com.android.library'
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
@@ -24,7 +28,7 @@ android {
     buildToolsVersion "$build_tools_version"
 
     defaultConfig {
-        minSdkVersion 24
+        minSdkVersion 21
         targetSdkVersion 29
         versionCode 1
         versionName "0.1"
@@ -39,32 +43,16 @@ android {
             proguardFiles 
getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
-
-    compileOptions {
-        sourceCompatibility = 1.8
-        targetCompatibility = 1.8
-    }
-
-    kotlinOptions {
-        jvmTarget = "1.8"
-    }
 }
 
 dependencies {
-    implementation project(":taler-kotlin-common")
-
-    implementation 'com.google.android.material:material:1.2.0-beta01'
-    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
 
-    // Navigation Library
-    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
-    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
-
-    // ViewModel and LiveData
-    implementation 
"androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
+    def ktor_version = "1.3.2"
+    implementation "io.ktor:ktor-client:$ktor_version"
+    implementation "io.ktor:ktor-client-okhttp:$ktor_version"
+    implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version"
 
     testImplementation 'junit:junit:4.13'
-
-    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
-    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+    testApi "io.ktor:ktor-client-mock-jvm:$ktor_version"
 }
diff --git a/anastasis-ui/consumer-rules.pro b/merchant-lib/consumer-rules.pro
similarity index 100%
copy from anastasis-ui/consumer-rules.pro
copy to merchant-lib/consumer-rules.pro
diff --git a/anastasis-ui/proguard-rules.pro b/merchant-lib/proguard-rules.pro
similarity index 100%
copy from anastasis-ui/proguard-rules.pro
copy to merchant-lib/proguard-rules.pro
diff --git a/taler-kotlin-common/src/main/AndroidManifest.xml 
b/merchant-lib/src/main/AndroidManifest.xml
similarity index 91%
copy from taler-kotlin-common/src/main/AndroidManifest.xml
copy to merchant-lib/src/main/AndroidManifest.xml
index 902ddc1..7318c07 100644
--- a/taler-kotlin-common/src/main/AndroidManifest.xml
+++ b/merchant-lib/src/main/AndroidManifest.xml
@@ -15,10 +15,9 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android";
-    package="net.taler.common">
+    package="net.taler.merchantlib">
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.NFC" />
 
 </manifest>
diff --git 
a/anastasis-ui/src/main/java/org/gnu/anastasis/ui/identity/Locations.kt 
b/merchant-lib/src/main/java/net/taler/merchantlib/ConfigResponse.kt
similarity index 61%
copy from anastasis-ui/src/main/java/org/gnu/anastasis/ui/identity/Locations.kt
copy to merchant-lib/src/main/java/net/taler/merchantlib/ConfigResponse.kt
index 13658d2..49164e6 100644
--- a/anastasis-ui/src/main/java/org/gnu/anastasis/ui/identity/Locations.kt
+++ b/merchant-lib/src/main/java/net/taler/merchantlib/ConfigResponse.kt
@@ -14,16 +14,21 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package org.gnu.anastasis.ui.identity
+package net.taler.merchantlib
 
-import androidx.annotation.LayoutRes
-import org.gnu.anastasis.ui.R
+import kotlinx.serialization.Serializable
 
-data class Location(val name: String, @LayoutRes val layoutRes: Int)
+@Serializable
+data class ConfigResponse(
+    /**
+     * libtool-style representation of the Merchant protocol version, see
+     * 
https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+     * The format is "current:revision:age".
+     */
+    val version: String,
 
-val LOCATIONS = listOf(
-    Location("Switzerland", R.layout.country_switzerland),
-    Location("Germany", R.layout.country_germany),
-    Location("Unites States", R.layout.country_usa),
-    Location("India", R.layout.country_india)
+    /**
+    Currency supported by this backend.
+     */
+    val currency: String
 )
diff --git a/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt 
b/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt
new file mode 100644
index 0000000..656b093
--- /dev/null
+++ b/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt
@@ -0,0 +1,43 @@
+/*
+ * 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.merchantlib
+
+import io.ktor.client.HttpClient
+import io.ktor.client.engine.okhttp.OkHttp
+import io.ktor.client.features.json.JsonFeature
+import io.ktor.client.features.json.serializer.KotlinxSerializer
+import io.ktor.client.request.get
+import io.ktor.client.request.header
+import io.ktor.http.HttpHeaders.Authorization
+
+class MerchantApi(private val httpClient: HttpClient) {
+
+    constructor() : this(getDefaultHttpClient())
+
+    suspend fun getConfig(baseUrl: String, apiKey: String = "sandbox"): 
ConfigResponse {
+        return httpClient.get("$baseUrl/config") {
+            header(Authorization, "ApiKey $apiKey")
+        }
+    }
+
+}
+
+private fun getDefaultHttpClient(): HttpClient = HttpClient(OkHttp) {
+    install(JsonFeature) {
+        serializer = KotlinxSerializer()
+    }
+}
diff --git 
a/wallet/src/androidTest/java/net/taler/wallet/ExampleInstrumentedTest.kt 
b/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt
similarity index 54%
copy from 
wallet/src/androidTest/java/net/taler/wallet/ExampleInstrumentedTest.kt
copy to merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt
index 5f0c423..6b2199b 100644
--- a/wallet/src/androidTest/java/net/taler/wallet/ExampleInstrumentedTest.kt
+++ b/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt
@@ -14,25 +14,30 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet
+package net.taler.merchantlib
 
-import androidx.test.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
+import kotlinx.coroutines.runBlocking
+import net.taler.merchantlib.MockHttpClient.giveJsonResponse
+import net.taler.merchantlib.MockHttpClient.httpClient
 import org.junit.Assert.assertEquals
 import org.junit.Test
-import org.junit.runner.RunWith
 
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
+class MerchantApiTest {
+
+    private val api = MerchantApi(httpClient)
+
     @Test
-    fun useAppContext() {
-        // Context of the app under test.
-        val appContext = InstrumentationRegistry.getTargetContext()
-        assertEquals("net.taler.wallet", appContext.packageName)
+    fun testGetConfig() = runBlocking {
+        httpClient.giveJsonResponse("https://backend.int.taler.net/config";) {
+            """
+            {
+              "currency": "INTKUDOS",
+              "version": "0:0:0"
+            }
+            """.trimIndent()
+        }
+        val response = api.getConfig("https://backend.int.taler.net";)
+        assertEquals(ConfigResponse("0:0:0", "INTKUDOS"), response)
     }
+
 }
diff --git a/merchant-lib/src/test/java/net/taler/merchantlib/MockHttpClient.kt 
b/merchant-lib/src/test/java/net/taler/merchantlib/MockHttpClient.kt
new file mode 100644
index 0000000..076b77e
--- /dev/null
+++ b/merchant-lib/src/test/java/net/taler/merchantlib/MockHttpClient.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.merchantlib
+
+import io.ktor.client.HttpClient
+import io.ktor.client.engine.mock.MockEngine
+import io.ktor.client.engine.mock.MockEngineConfig
+import io.ktor.client.engine.mock.respond
+import io.ktor.client.features.json.JsonFeature
+import io.ktor.client.features.json.serializer.KotlinxSerializer
+import io.ktor.http.ContentType.Application.Json
+import io.ktor.http.Url
+import io.ktor.http.fullPath
+import io.ktor.http.headersOf
+import io.ktor.http.hostWithPort
+
+object MockHttpClient {
+
+    val httpClient = HttpClient(MockEngine) {
+        install(JsonFeature) {
+            serializer = KotlinxSerializer()
+        }
+        engine {
+            addHandler { error("No response handler set") }
+        }
+    }
+
+    fun HttpClient.giveJsonResponse(url: String, jsonProducer: () -> String) {
+        val httpConfig = engineConfig as MockEngineConfig
+        httpConfig.requestHandlers.removeAt(0)
+        httpConfig.requestHandlers.add { request ->
+            if (request.url.fullUrl == url) {
+                val headers = headersOf("Content-Type" to 
listOf(Json.toString()))
+                respond(jsonProducer(), headers = headers)
+            } else {
+                error("Unexpected URL: ${request.url.fullUrl}")
+            }
+        }
+    }
+
+    private val Url.hostWithPortIfRequired: String get() = if (port == 
protocol.defaultPort) host else hostWithPort
+    private val Url.fullUrl: String get() = 
"${protocol.name}://$hostWithPortIfRequired$fullPath"
+
+}
diff --git a/merchant-terminal/build.gradle b/merchant-terminal/build.gradle
index 8a7eac7..2ba1a66 100644
--- a/merchant-terminal/build.gradle
+++ b/merchant-terminal/build.gradle
@@ -46,10 +46,16 @@ android {
         //      
https://github.com/material-components/material-components-android/issues/504
         ignore "WrongConstant"
     }
+
+    packagingOptions {
+        exclude 'META-INF/common.kotlin_module'
+        exclude 'META-INF/*.kotlin_module'
+    }
 }
 
 dependencies {
     implementation project(":taler-kotlin-common")
+    implementation project(":merchant-lib")
 
     implementation 'com.google.android.material:material:1.1.0'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
@@ -63,7 +69,7 @@ dependencies {
     // HTTP Requests
     implementation 'com.android.volley:volley:1.1.1'
 
-    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
+    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
 
     // JSON parsing and serialization
     implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2"
diff --git 
a/merchant-terminal/src/main/java/net/taler/merchantpos/MainViewModel.kt 
b/merchant-terminal/src/main/java/net/taler/merchantpos/MainViewModel.kt
index 3fe472d..2dd2c24 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/MainViewModel.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/MainViewModel.kt
@@ -23,6 +23,7 @@ import com.android.volley.toolbox.Volley
 import 
com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.fasterxml.jackson.module.kotlin.KotlinModule
+import net.taler.merchantlib.MerchantApi
 import net.taler.merchantpos.config.ConfigManager
 import net.taler.merchantpos.history.HistoryManager
 import net.taler.merchantpos.history.RefundManager
@@ -31,13 +32,14 @@ import net.taler.merchantpos.payment.PaymentManager
 
 class MainViewModel(app: Application) : AndroidViewModel(app) {
 
+    private val api = MerchantApi()
     private val mapper = ObjectMapper()
         .registerModule(KotlinModule())
         .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
     private val queue = Volley.newRequestQueue(app)
 
     val orderManager = OrderManager(app, mapper)
-    val configManager = ConfigManager(app, viewModelScope, mapper, 
queue).apply {
+    val configManager = ConfigManager(app, viewModelScope, api, mapper, 
queue).apply {
         addConfigurationReceiver(orderManager)
     }
     val paymentManager = PaymentManager(configManager, queue, mapper)
diff --git 
a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt 
b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
index 171cf28..eee7905 100644
--- 
a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
+++ 
b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigManager.kt
@@ -34,10 +34,14 @@ import com.fasterxml.jackson.module.kotlin.readValue
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
+import net.taler.merchantlib.ConfigResponse
+import net.taler.merchantlib.MerchantApi
 import net.taler.merchantpos.LogErrorListener
 import net.taler.merchantpos.R
 import org.json.JSONObject
 
+private const val VERSION = "0:0:0"
+
 private const val SETTINGS_NAME = "taler-merchant-terminal"
 
 private const val SETTINGS_CONFIG_URL = "configUrl"
@@ -60,6 +64,7 @@ interface ConfigurationReceiver {
 class ConfigManager(
     private val context: Context,
     private val scope: CoroutineScope,
+    private val api: MerchantApi,
     private val mapper: ObjectMapper,
     private val queue: RequestQueue
 ) {
@@ -114,25 +119,27 @@ class ConfigManager(
             return
         }
 
-        val params = mapOf("instance" to merchantConfig.instance)
-        val req = MerchantRequest(GET, merchantConfig, "config", params, null,
-            Listener { onMerchantConfigReceived(config, json, merchantConfig, 
it) },
-            LogErrorListener { onNetworkError(it) }
-        )
-        queue.add(req)
+        scope.launch(Dispatchers.IO) {
+            val configResponse = api.getConfig(merchantConfig.baseUrl, 
merchantConfig.apiKey)
+            onMerchantConfigReceived(config, json, merchantConfig, 
configResponse)
+        }
     }
 
     private fun onMerchantConfigReceived(
         newConfig: Config?,
         configJson: JSONObject,
         merchantConfig: MerchantConfig,
-        json: JSONObject
+        configResponse: ConfigResponse
     ) = scope.launch(Dispatchers.Default) {
-        val currency = json.getString("currency")
-
+        // TODO do real matching
+        if (VERSION != configResponse.version) {
+            val str = context.getString(R.string.config_error_version)
+            mConfigUpdateResult.postValue(ConfigUpdateResult.Error(str))
+            return@launch
+        }
         for (receiver in configurationReceivers) {
             val result = try {
-                receiver.onConfigurationReceived(configJson, currency)
+                receiver.onConfigurationReceived(configJson, 
configResponse.currency)
             } catch (e: Exception) {
                 Log.e(TAG, "Error handling configuration by 
${receiver::class.java.simpleName}", e)
                 context.getString(R.string.config_error_unknown)
@@ -146,8 +153,8 @@ class ConfigManager(
             config = it
             saveConfig(it)
         }
-        this@ConfigManager.merchantConfig = merchantConfig.copy(currency = 
currency)
-        mConfigUpdateResult.postValue(ConfigUpdateResult.Success(currency))
+        this@ConfigManager.merchantConfig = merchantConfig.copy(currency = 
configResponse.currency)
+        
mConfigUpdateResult.postValue(ConfigUpdateResult.Success(configResponse.currency))
     }
 
     fun forgetPassword() {
diff --git a/merchant-terminal/src/main/res/values/strings.xml 
b/merchant-terminal/src/main/res/values/strings.xml
index b3dcd8d..931f31c 100644
--- a/merchant-terminal/src/main/res/values/strings.xml
+++ b/merchant-terminal/src/main/res/values/strings.xml
@@ -22,6 +22,7 @@
     <string name="config_password">Password</string>
     <string name="config_ok">Fetch configuration</string>
     <string name="config_auth_error">Error: Invalid username or 
password</string>
+    <string name="config_error_version">Error: Incompatible backend 
version</string>
     <string name="config_error_network">Error: Could not connect to 
configuration server</string>
     <string name="config_error_category">Error: No valid product category 
found</string>
     <string name="config_error_malformed">Error: The configuration JSON is 
malformed</string>
diff --git a/settings.gradle b/settings.gradle
index b45a276..14d898d 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,4 @@
 include ':cashier', ':merchant-terminal', ':wallet'
 include ':taler-kotlin-common'
+include ':merchant-lib'
 include ':anastasis-ui'
diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt 
b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt
index cdd5590..41c8f2c 100644
--- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt
@@ -74,18 +74,4 @@ class ExchangeManager(
         }
     }
 
-    fun getWithdrawalDetails(exchangeItem: ExchangeItem, amount: Amount) {
-        val args = JSONObject().apply {
-            put("exchangeBaseUrl", exchangeItem.exchangeBaseUrl)
-            put("amount", amount.toJSONString())
-        }
-        walletBackendApi.sendRequest("getWithdrawalDetailsForAmount", args) { 
isError, result ->
-            if (isError) {
-                Log.e(TAG, "$result")
-            } else {
-                Log.e(TAG, "$result")
-            }
-        }
-    }
-
 }
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 ccc40eb..1dc55dc 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -92,8 +92,11 @@ class TransactionWithdrawal(
     override val amountType = AmountType.Positive
     override fun getTitle(context: Context) = cleanExchange(exchangeBaseUrl)
     override val generalTitleRes = R.string.withdraw_title
-    val confirmed: Boolean =
-        withdrawalDetails is TalerBankIntegrationApi && 
withdrawalDetails.confirmed
+    val confirmed: Boolean
+        get() = !pending && (
+                (withdrawalDetails is TalerBankIntegrationApi && 
withdrawalDetails.confirmed) ||
+                        withdrawalDetails is ManualTransfer
+                )
 }
 
 @JsonTypeInfo(use = NAME, include = PROPERTY, property = "type")
diff --git 
a/wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt 
b/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
similarity index 83%
rename from 
wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt
rename to 
wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
index c3f201d..55f931d 100644
--- a/wallet/src/main/java/net/taler/wallet/exchanges/ManualWithdrawFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
@@ -14,8 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.exchanges
+package net.taler.wallet.withdraw
 
+import android.net.Uri
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -30,12 +31,14 @@ import net.taler.common.hideKeyboard
 import net.taler.wallet.MainViewModel
 import net.taler.wallet.R
 import net.taler.wallet.scanQrCode
+import java.util.Locale
 
 class ManualWithdrawFragment : Fragment() {
 
     private val model: MainViewModel by activityViewModels()
     private val exchangeManager by lazy { model.exchangeManager }
     private val exchangeItem by lazy { 
requireNotNull(exchangeManager.withdrawalExchange) }
+    private val withdrawManager by lazy { model.withdrawManager }
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -47,14 +50,17 @@ class ManualWithdrawFragment : Fragment() {
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         qrCodeButton.setOnClickListener { scanQrCode(requireActivity()) }
         currencyView.text = exchangeItem.currency
+        val paymentOptions = exchangeItem.paytoUris.mapNotNull {paytoUri ->
+            Uri.parse(paytoUri).authority?.toUpperCase(Locale.getDefault())
+        }.joinToString(separator = "\n", prefix = "• ")
         paymentOptionsLabel.text =
-            getString(R.string.withdraw_manual_payment_options, 
exchangeItem.name)
+            getString(R.string.withdraw_manual_payment_options, 
exchangeItem.name, paymentOptions)
         checkFeesButton.setOnClickListener {
             val value = amountView.text.toString().toLong()
             val amount = Amount(exchangeItem.currency, value, 0)
             amountView.hideKeyboard()
             Toast.makeText(view.context, "Not implemented: $amount", 
LENGTH_SHORT).show()
-            exchangeManager.getWithdrawalDetails(exchangeItem, amount)
+            withdrawManager.getWithdrawalDetails(exchangeItem, amount)
         }
     }
 
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 75e4daa..ea65e7c 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
@@ -21,6 +21,7 @@ import androidx.lifecycle.MutableLiveData
 import net.taler.common.Amount
 import net.taler.wallet.TAG
 import net.taler.wallet.backend.WalletBackendApi
+import net.taler.wallet.exchanges.ExchangeItem
 import net.taler.wallet.withdraw.WithdrawStatus.ReceivedDetails
 import org.json.JSONObject
 
@@ -63,6 +64,21 @@ class WithdrawManager(private val walletBackendApi: 
WalletBackendApi) {
         }
     }
 
+    fun getWithdrawalDetails(exchangeItem: ExchangeItem, amount: Amount) {
+        val args = JSONObject().apply {
+            put("exchangeBaseUrl", exchangeItem.exchangeBaseUrl)
+            put("amount", amount.toJSONString())
+        }
+        walletBackendApi.sendRequest("getWithdrawalDetailsForAmount", args) { 
isError, result ->
+            // 
{"rawAmount":"TESTKUDOS:5","effectiveAmount":"TESTKUDOS:4.8","paytoUris":["payto:\/\/x-taler-bank\/bank.test.taler.net\/Exchange"],"tosAccepted":false}
+            if (isError) {
+                Log.e(TAG, "$result")
+            } else {
+                Log.e(TAG, "$result")
+            }
+        }
+    }
+
     fun getWithdrawalInfo(talerWithdrawUri: String) {
         val args = JSONObject().apply {
             put("talerWithdrawUri", talerWithdrawUri)
diff --git a/wallet/src/main/res/navigation/nav_graph.xml 
b/wallet/src/main/res/navigation/nav_graph.xml
index c9a98f0..93db557 100644
--- a/wallet/src/main/res/navigation/nav_graph.xml
+++ b/wallet/src/main/res/navigation/nav_graph.xml
@@ -74,7 +74,7 @@
 
     <fragment
         android:id="@+id/nav_exchange_manual_withdrawal"
-        android:name="net.taler.wallet.exchanges.ManualWithdrawFragment"
+        android:name="net.taler.wallet.withdraw.ManualWithdrawFragment"
         android:label="@string/withdraw_title"/>
 
     <fragment
diff --git a/wallet/src/main/res/values/strings.xml 
b/wallet/src/main/res/values/strings.xml
index 7e8024f..421d4ab 100644
--- a/wallet/src/main/res/values/strings.xml
+++ b/wallet/src/main/res/values/strings.xml
@@ -114,7 +114,7 @@ GNU Taler is immune against many types of fraud, such as 
phishing of credit card
     <string name="withdraw_waiting_confirm">Waiting for confirmation</string>
     <string name="withdraw_manual_title">Make a manual transfer to the 
exchange</string>
     <string name="withdraw_amount">How much to withdraw?</string>
-    <string name="withdraw_manual_payment_options">Payment options supported 
by %s:</string>
+    <string name="withdraw_manual_payment_options">Payment options supported 
by %1$s:\n\n%2$s</string>
     <string name="withdraw_manual_check_fees">Check fees</string>
     <string name="withdraw_error_title">Withdrawal Error</string>
     <string name="withdraw_error_message">Withdrawing is currently not 
possible. Please try again later!</string>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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