diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt index e027a0d257..0a737d5e64 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt @@ -32,7 +32,6 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent import org.matrix.android.sdk.api.session.room.model.message.MessageType import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationRequestContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent -import org.matrix.android.sdk.internal.network.parsing.CheckNumberType import org.matrix.android.sdk.internal.network.parsing.CipherSuiteMoshiAdapter import org.matrix.android.sdk.internal.network.parsing.ForceToBooleanJsonAdapter import org.matrix.android.sdk.internal.network.parsing.RuntimeJsonAdapterFactory @@ -43,9 +42,6 @@ import org.matrix.android.sdk.internal.session.sync.parsing.DefaultLazyRoomSyncE internal object MoshiProvider { private val moshi: Moshi = Moshi.Builder() - // By default all numbers are transformed into floats by moshi - // this adapter tries to see first if it's a natural number before using float - .add(CheckNumberType.JSON_ADAPTER_FACTORY) .add(UriMoshiAdapter()) .add(ForceToBooleanJsonAdapter()) .add(CipherSuiteMoshiAdapter()) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/parsing/CheckNumberType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/parsing/CheckNumberType.kt index 8b54978279..3bb5172b4a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/parsing/CheckNumberType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/parsing/CheckNumberType.kt @@ -24,6 +24,8 @@ import com.squareup.moshi.Moshi import java.io.IOException import java.lang.reflect.Type import java.math.BigDecimal +import kotlin.math.ceil +import kotlin.math.floor /** * This is used to check if NUMBER in json is integer or double, so we can preserve typing when serializing/deserializing in a row. @@ -56,7 +58,16 @@ internal interface CheckNumberType { } override fun toJson(writer: JsonWriter, value: Any?) { - delegate.toJson(writer, value) + if (value is Number) { + val double = value.toDouble() + if (ceil(double) == floor(double)) { + writer.value(value.toLong()) + } else { + writer.value(value.toDouble()) + } + } else { + delegate.toJson(writer, value) + } } } } diff --git a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt index 05f4aab536..a86b3af910 100644 --- a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt +++ b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/OlmMachine.kt @@ -261,16 +261,17 @@ internal class OlmMachine @Inject constructor( val devices = DeviceLists(deviceChanges?.changed.orEmpty(), deviceChanges?.left.orEmpty()) - val adapter = MoshiProvider.providesMoshi().adapter(ToDeviceSyncResponse::class.java) - val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse()).also { - Timber.w("## VALR events: $it") - } + val adapter = MoshiProvider.providesMoshi() + .newBuilder() + .add(CheckNumberType.JSON_ADAPTER_FACTORY) + .build() + .adapter(ToDeviceSyncResponse::class.java) + val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse()) // TODO once our sync response type parses the unused fallback key // field pass in the list of unused fallback keys here - val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, unusedFallbackKeys = null).also { - Timber.w("## VALR $it") - } + val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, unusedFallbackKeys = null) + val outAdapter = moshi.adapter>( Types.newParameterizedType( List::class.java, diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/crypto/MoshiNumbersAsInt.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/crypto/MoshiNumbersAsInt.kt index a326c133ec..7e10e92f82 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/crypto/MoshiNumbersAsInt.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/crypto/MoshiNumbersAsInt.kt @@ -21,6 +21,7 @@ import org.junit.Test import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.sync.model.ToDeviceSyncResponse import org.matrix.android.sdk.internal.di.MoshiProvider +import org.matrix.android.sdk.internal.network.parsing.CheckNumberType class MoshiNumbersAsInt { @@ -51,4 +52,26 @@ class MoshiNumbersAsInt { jsonString shouldNotContain "1.0" } + + @Test + fun testParseThenSerialize() { + val raw = """ + {"events":[{"type":"m.room.encrypted","content":{"algorithm":"m.olm.v1.curve25519-aes-sha2","ciphertext":{"cfA3dINwtmMW0DbJmnT6NiGAbOSa299Hxs6KxHgbDBw":{"body":"Awogc5L3QuIyvkluB1O/UAJp0","type":1}},"sender_key":"fqhBEOHXSSQ7ZKt1xlBg+hSTY1NEM8hezMXZ5lyBR1M"},"sender":"@web:localhost:8481"}]} + """.trimIndent() + + val moshi = MoshiProvider.providesMoshi() + val adapter = moshi.adapter(ToDeviceSyncResponse::class.java) + + val content = adapter.fromJson(raw) + + val serialized = MoshiProvider.providesMoshi() + .newBuilder() + .add(CheckNumberType.JSON_ADAPTER_FACTORY) + .build() + .adapter(ToDeviceSyncResponse::class.java).toJson(content) + + serialized shouldNotContain "1.0" + + println(serialized) + } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationController.kt index aee26922ca..67224a65df 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationController.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/self/SelfVerificationController.kt @@ -41,7 +41,6 @@ import im.vector.app.features.html.EventHtmlRenderer import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState -import timber.log.Timber import javax.inject.Inject class SelfVerificationController @Inject constructor( @@ -61,7 +60,7 @@ class SelfVerificationController @Inject constructor( var state: SelfVerificationViewState? = null fun update(state: SelfVerificationViewState) { - Timber.w("VALR controller updated $state") +// Timber.w("VALR controller updated $state") this.state = state requestModelBuild() }