From 788c2bdff4099864997e14910d6b9da34f295afa Mon Sep 17 00:00:00 2001 From: Jaehwa Noh Date: Sat, 21 Dec 2024 16:12:12 +0900 Subject: [PATCH] Create `getDemoDataFromJson` method and use it. Change-Id: I19336b061e74a378cc70470fbd6af8ee4c7533e0 --- .../network/demo/DemoNiaNetworkDataSource.kt | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 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 abb2a4b72..5d04ee4c8 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 @@ -17,7 +17,8 @@ package com.google.samples.apps.nowinandroid.core.network.demo import JvmUnitTestDemoAssetManager -import android.os.Build +import android.os.Build.VERSION.SDK_INT +import android.os.Build.VERSION_CODES.N 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 @@ -29,6 +30,7 @@ import kotlinx.coroutines.withContext import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream +import java.io.BufferedReader import javax.inject.Inject /** @@ -40,31 +42,11 @@ class DemoNiaNetworkDataSource @Inject constructor( private val assets: DemoAssetManager = JvmUnitTestDemoAssetManager, ) : NiaNetworkDataSource { - @OptIn(ExperimentalSerializationApi::class) override suspend fun getTopics(ids: List?): List = - withContext(ioDispatcher) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - assets.open(TOPICS_ASSET).use(networkJson::decodeFromStream) - } else { - // Use decodeFromString to capability with API 24 below. - // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342 - val topicsJsonString = assets.readText(TOPICS_ASSET) - networkJson.decodeFromString(topicsJsonString) - } - } + getDemoDataFromJson(TOPICS_ASSET) - @OptIn(ExperimentalSerializationApi::class) override suspend fun getNewsResources(ids: List?): List = - withContext(ioDispatcher) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - assets.open(NEWS_ASSET).use(networkJson::decodeFromStream) - } else { - // Use decodeFromString to capability with API 24 below. - // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342 - val newsJsonString = assets.readText(NEWS_ASSET) - networkJson.decodeFromString(newsJsonString) - } - } + getDemoDataFromJson(NEWS_ASSET) override suspend fun getTopicChangeList(after: Int?): List = getTopics().mapToChangeList(NetworkTopic::id) @@ -72,6 +54,23 @@ class DemoNiaNetworkDataSource @Inject constructor( override suspend fun getNewsResourceChangeList(after: Int?): List = getNewsResources().mapToChangeList(NetworkNewsResource::id) + /** + * Get Demo data form a [fileName] Json file. + */ + @OptIn(ExperimentalSerializationApi::class) + private suspend inline fun getDemoDataFromJson(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 { + inputStream.bufferedReader().use(BufferedReader::readText) + .let(networkJson::decodeFromString) + } + } + } + companion object { private const val NEWS_ASSET = "news.json" private const val TOPICS_ASSET = "topics.json"