fobo66 / WearMMR

WearOS app and watchface for displaying your Dota 2 MMR
Apache License 2.0
4 stars 0 forks source link

Crash during Play Store review #165

Closed fobo66 closed 2 years ago

fobo66 commented 2 years ago

Describe the bug Looks like app crashed multiple times during Play Store review on the real device.

Link to the Crashlytics

Stacktrace:

Caused by kotlinx.serialization.MissingFieldException: Field 'estimate' is required for type with serial name 'io.github.fobo66.data.entities.MmrEstimate', but it was missing at path: $.mmr_estimate at path: $.mmr_estimate
       at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:40)
       at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100)
       at io.ktor.serialization.kotlinx.KotlinxSerializationConverter.deserialize(KotlinxSerializationConverter.kt:71)
       at io.ktor.serialization.ContentConverterKt$deserialize$$inlined$map$1$2.emit(Emitters.kt:224)
       at kotlinx.coroutines.flow.FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3.collect(FlowKt__BuildersKt.java:115)
       at kotlinx.coroutines.flow.AbstractFlow.collect$bridge(AbstractFlow.java:176)
       at io.ktor.serialization.ContentConverterKt$deserialize$$inlined$map$1.collect(SafeCollector.common.kt:13)
       at kotlinx.coroutines.flow.FlowKt__ReduceKt.firstOrNull(FlowKt__ReduceKt.java:243)
       at kotlinx.coroutines.flow.FlowKt.firstOrNull(FlowKt.java:1)
       at io.ktor.serialization.ContentConverterKt.deserialize(ContentConverterKt.java:128)
       at io.ktor.client.plugins.contentnegotiation.ContentNegotiation.convertResponse$ktor_client_content_negotiation(ContentNegotiation.java:185)
       at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invokeSuspend(ContentNegotiation.java:210)
       at io.ktor.client.HttpClient$2.invokeSuspend$bridge(HttpClient.kt:1156)
       at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invoke(ContentNegotiation.java:36)
       at io.ktor.client.plugins.DefaultTransformKt$defaultTransformers$2.invoke$bridge(DefaultTransformKt.java:36)
       at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invoke(ContentNegotiation.java:41)
       at io.ktor.client.HttpClient$2.invoke$bridge(HttpClient.kt:41)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:123)
       at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:81)
       at io.ktor.client.HttpClient$4.invokeSuspend(HttpClient.kt:173)
       at io.ktor.client.HttpClient$4.invokeSuspend$bridge(HttpClient.kt:176)
       at io.ktor.client.HttpClient$4.invoke(HttpClient.kt:35)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:123)
       at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:81)
       at io.ktor.util.pipeline.SuspendFunctionGun.proceedWith(SuspendFunctionGun.kt:91)
       at io.ktor.client.plugins.HttpCallValidator$Companion$install$2.invokeSuspend(HttpCallValidator.java:138)
       at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invokeSuspend$bridge(HttpCallValidator.kt:63)
       at io.ktor.client.plugins.HttpCallValidator$Companion$install$2.invoke(HttpCallValidator.java:26)
       at io.ktor.client.plugins.HttpCallValidator$Companion$install$1.invoke$bridge(HttpCallValidator.kt:26)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:123)
       at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:81)
       at io.ktor.util.pipeline.SuspendFunctionGun.execute$ktor_utils(SuspendFunctionGun.kt:101)
       at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
       at io.ktor.client.call.HttpClientCall.bodyNullable(HttpClientCall.kt:88)
       at io.github.fobo66.data.api._MatchmakingRatingApiImpl.fetchPlayerProfile(_MatchmakingRatingApiImpl.kt:58)
       at io.github.fobo66.data.api._MatchmakingRatingApiImpl$fetchPlayerProfile$1.invokeSuspend(_MatchmakingRatingApiImpl.kt:13)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:138)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:112)
       at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.java:14)
       at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:62)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
       at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:138)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:112)
       at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.java:14)
       at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:62)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
       at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:138)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:112)
       at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.java:14)
       at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:62)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
       at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:138)
       at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:112)
       at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.java:14)
       at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:62)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
       at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
       at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:2)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.java:570)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

To Reproduce

  1. Go to settings
  2. Enter player id
  3. Go back to the home screen
  4. See error

Expected behavior App displays player info and MMR

Smartphone (please complete the following information):

Additional context

Crash seems to originate from kotlinx.serialization

fobo66 commented 2 years ago

Investigate crash