From 62086eaa5f16bd08ce6798559635daac68066e9b Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 6 Jan 2025 17:16:47 +0000 Subject: [PATCH] Refactor change to make it clearer when the deserialization workaround is required. --- .../network/demo/DemoNiaNetworkDataSource.kt | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt b/core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt index 5d04ee4c8..328cc4e0f 100644 --- a/core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt +++ b/core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/demo/DemoNiaNetworkDataSource.kt @@ -18,7 +18,7 @@ package com.google.samples.apps.nowinandroid.core.network.demo import JvmUnitTestDemoAssetManager import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.N +import android.os.Build.VERSION_CODES.M import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource @@ -43,10 +43,10 @@ class DemoNiaNetworkDataSource @Inject constructor( ) : NiaNetworkDataSource { override suspend fun getTopics(ids: List?): List = - getDemoDataFromJson(TOPICS_ASSET) + getDataFromJsonFile(TOPICS_ASSET) override suspend fun getNewsResources(ids: List?): List = - getDemoDataFromJson(NEWS_ASSET) + getDataFromJsonFile(NEWS_ASSET) override suspend fun getTopicChangeList(after: Int?): List = getTopics().mapToChangeList(NetworkTopic::id) @@ -55,18 +55,22 @@ class DemoNiaNetworkDataSource @Inject constructor( getNewsResources().mapToChangeList(NetworkNewsResource::id) /** - * Get Demo data form a [fileName] Json file. + * Get data from the given JSON [fileName]. */ @OptIn(ExperimentalSerializationApi::class) - private suspend inline fun getDemoDataFromJson(fileName: String): List = + private suspend inline fun getDataFromJsonFile(fileName: String): List = withContext(ioDispatcher) { assets.open(fileName).use { inputStream -> - if (SDK_INT >= N) { - networkJson.decodeFromStream(inputStream) - } // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342 - else { + if (SDK_INT <= M) { + /** + * On API 23 (M) and below we must use a workaround to avoid an exception being + * thrown during deserialization. See: + * https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342 + */ inputStream.bufferedReader().use(BufferedReader::readText) .let(networkJson::decodeFromString) + } else { + networkJson.decodeFromStream(inputStream) } } }