only check moshi numbers for rust-sdk

This commit is contained in:
valere 2022-11-29 11:21:54 +01:00
parent d9342707fd
commit fb1995e9c9
5 changed files with 44 additions and 14 deletions

View File

@ -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.MessageType
import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationRequestContent 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.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.CipherSuiteMoshiAdapter
import org.matrix.android.sdk.internal.network.parsing.ForceToBooleanJsonAdapter import org.matrix.android.sdk.internal.network.parsing.ForceToBooleanJsonAdapter
import org.matrix.android.sdk.internal.network.parsing.RuntimeJsonAdapterFactory 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 { internal object MoshiProvider {
private val moshi: Moshi = Moshi.Builder() 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(UriMoshiAdapter())
.add(ForceToBooleanJsonAdapter()) .add(ForceToBooleanJsonAdapter())
.add(CipherSuiteMoshiAdapter()) .add(CipherSuiteMoshiAdapter())

View File

@ -24,6 +24,8 @@ import com.squareup.moshi.Moshi
import java.io.IOException import java.io.IOException
import java.lang.reflect.Type import java.lang.reflect.Type
import java.math.BigDecimal 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. * 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,6 +58,14 @@ internal interface CheckNumberType {
} }
override fun toJson(writer: JsonWriter, value: Any?) { override fun toJson(writer: JsonWriter, value: Any?) {
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) delegate.toJson(writer, value)
} }
} }
@ -63,3 +73,4 @@ internal interface CheckNumberType {
} }
} }
} }
}

View File

@ -261,16 +261,17 @@ internal class OlmMachine @Inject constructor(
val devices = val devices =
DeviceLists(deviceChanges?.changed.orEmpty(), deviceChanges?.left.orEmpty()) DeviceLists(deviceChanges?.changed.orEmpty(), deviceChanges?.left.orEmpty())
val adapter = MoshiProvider.providesMoshi().adapter(ToDeviceSyncResponse::class.java) val adapter = MoshiProvider.providesMoshi()
val events = adapter.toJson(toDevice ?: ToDeviceSyncResponse()).also { .newBuilder()
Timber.w("## VALR events: $it") .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 // TODO once our sync response type parses the unused fallback key
// field pass in the list of unused fallback keys here // field pass in the list of unused fallback keys here
val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, unusedFallbackKeys = null).also { val receiveSyncChanges = inner.receiveSyncChanges(events, devices, counts, unusedFallbackKeys = null)
Timber.w("## VALR $it")
}
val outAdapter = moshi.adapter<List<Event>>( val outAdapter = moshi.adapter<List<Event>>(
Types.newParameterizedType( Types.newParameterizedType(
List::class.java, List::class.java,

View File

@ -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.events.model.Event
import org.matrix.android.sdk.api.session.sync.model.ToDeviceSyncResponse import org.matrix.android.sdk.api.session.sync.model.ToDeviceSyncResponse
import org.matrix.android.sdk.internal.di.MoshiProvider import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.network.parsing.CheckNumberType
class MoshiNumbersAsInt { class MoshiNumbersAsInt {
@ -51,4 +52,26 @@ class MoshiNumbersAsInt {
jsonString shouldNotContain "1.0" 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)
}
} }

View File

@ -41,7 +41,6 @@ import im.vector.app.features.html.EventHtmlRenderer
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence 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.CancelCode
import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class SelfVerificationController @Inject constructor( class SelfVerificationController @Inject constructor(
@ -61,7 +60,7 @@ class SelfVerificationController @Inject constructor(
var state: SelfVerificationViewState? = null var state: SelfVerificationViewState? = null
fun update(state: SelfVerificationViewState) { fun update(state: SelfVerificationViewState) {
Timber.w("VALR controller updated $state") // Timber.w("VALR controller updated $state")
this.state = state this.state = state
requestModelBuild() requestModelBuild()
} }