[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.
- [taler-taler-android] branch master updated (64cd56e -> c9fb036),
gnunet <=