summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-07-22 16:47:05 -0300
committerTorsten Grote <t@grobox.de>2020-07-22 16:47:05 -0300
commitb9d7d6edb7cc12e5238168c4446a28c0ae98c729 (patch)
treed462a3c4487a017956e684028ecc5ae5b69919a1
parent4bd0b7a75344b08cf5f84c360a28fc3f575b8501 (diff)
downloadtaler-android-b9d7d6edb7cc12e5238168c4446a28c0ae98c729.tar.gz
taler-android-b9d7d6edb7cc12e5238168c4446a28c0ae98c729.tar.bz2
taler-android-b9d7d6edb7cc12e5238168c4446a28c0ae98c729.zip
[common] also support multi-platform serialization/deserialization
-rw-r--r--build.gradle1
-rw-r--r--merchant-lib/build.gradle14
-rw-r--r--taler-kotlin-common/build.gradle10
-rw-r--r--taler-kotlin-common/src/main/java/net/taler/common/Amount.kt17
-rw-r--r--taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt23
5 files changed, 50 insertions, 15 deletions
diff --git a/build.gradle b/build.gradle
index 3067d221..dc530bf6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,6 +11,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
}
diff --git a/merchant-lib/build.gradle b/merchant-lib/build.gradle
index 08da35db..93e2d4d2 100644
--- a/merchant-lib/build.gradle
+++ b/merchant-lib/build.gradle
@@ -15,13 +15,12 @@
*/
plugins {
- id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
+ id 'com.android.library'
+ id 'kotlin-android'
+ id 'kotlin-android-extensions'
+ id 'kotlinx-serialization'
}
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-
android {
compileSdkVersion 29
//noinspection GradleDependency
@@ -46,6 +45,8 @@ android {
}
dependencies {
+ implementation project(":taler-kotlin-common")
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
def ktor_version = "1.3.2"
@@ -54,5 +55,6 @@ dependencies {
implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version"
testImplementation 'junit:junit:4.13'
- testApi "io.ktor:ktor-client-mock-jvm:$ktor_version"
+ testImplementation "io.ktor:ktor-client-mock-jvm:$ktor_version"
+ testImplementation "io.ktor:ktor-client-logging-jvm:$ktor_version"
}
diff --git a/taler-kotlin-common/build.gradle b/taler-kotlin-common/build.gradle
index 573a329d..df4b65f6 100644
--- a/taler-kotlin-common/build.gradle
+++ b/taler-kotlin-common/build.gradle
@@ -14,9 +14,12 @@
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
+plugins {
+ id 'com.android.library'
+ id 'kotlin-android'
+ id 'kotlin-android-extensions'
+ id 'kotlinx-serialization'
+}
android {
compileSdkVersion 29
@@ -59,6 +62,7 @@ dependencies {
implementation 'com.google.zxing:core:3.4.0' // needs minSdkVersion 24+
// JSON parsing and serialization
+ implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0"
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2"
lintChecks 'com.github.thirdegg:lint-rules:0.0.4-alpha'
diff --git a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
index 76cd2945..992f93bb 100644
--- a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
+++ b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt
@@ -26,6 +26,11 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
import com.fasterxml.jackson.databind.ser.std.StdSerializer
+import kotlinx.serialization.Decoder
+import kotlinx.serialization.Encoder
+import kotlinx.serialization.KSerializer
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.Serializer
import org.json.JSONObject
import java.lang.Math.floorDiv
import kotlin.math.pow
@@ -34,6 +39,7 @@ import kotlin.math.roundToInt
class AmountParserException(msg: String? = null, cause: Throwable? = null) : Exception(msg, cause)
class AmountOverflowException(msg: String? = null, cause: Throwable? = null) : Exception(msg, cause)
+@Serializable(with = KotlinXAmountSerializer::class)
@JsonSerialize(using = AmountSerializer::class)
@JsonDeserialize(using = AmountDeserializer::class)
data class Amount(
@@ -211,6 +217,17 @@ data class Amount(
}
+@Serializer(forClass = Amount::class)
+object KotlinXAmountSerializer: KSerializer<Amount> {
+ override fun serialize(encoder: Encoder, value: Amount) {
+ encoder.encodeString(value.toJSONString())
+ }
+
+ override fun deserialize(decoder: Decoder): Amount {
+ return Amount.fromJSONString(decoder.decodeString())
+ }
+}
+
class AmountSerializer : StdSerializer<Amount>(Amount::class.java) {
override fun serialize(value: Amount, gen: JsonGenerator, provider: SerializerProvider) {
gen.writeString(value.toJSONString())
diff --git a/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt b/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt
index 8b8e02d7..c07127a7 100644
--- a/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt
+++ b/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt
@@ -23,13 +23,20 @@ import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY
import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL
import com.fasterxml.jackson.annotation.JsonProperty
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
import net.taler.common.TalerUtils.getLocalizedString
+@Serializable
@JsonIgnoreProperties(ignoreUnknown = true)
data class ContractTerms(
val summary: String,
- val products: List<ContractProduct>,
- val amount: Amount
+ @SerialName("summary_i18n")
+ val summaryI18n: Map<String, String>? = null,
+ val amount: Amount,
+ @SerialName("fulfillment_url")
+ val fulfillmentUrl: String,
+ val products: List<ContractProduct>
)
@JsonInclude(NON_NULL)
@@ -52,13 +59,17 @@ abstract class Product {
get() = getLocalizedString(descriptionI18n, description)
}
+@Serializable
data class ContractProduct(
- override val productId: String?,
+ @SerialName("product_id")
+ override val productId: String? = null,
override val description: String,
- override val descriptionI18n: Map<String, String>?,
+ @SerialName("description_i18n")
+ override val descriptionI18n: Map<String, String>? = null,
override val price: Amount,
- override val location: String?,
- override val image: String?,
+ @SerialName("delivery_location")
+ override val location: String? = null,
+ override val image: String? = null,
val quantity: Int
) : Product() {
@get:JsonIgnore