1717package com.google.samples.apps.nowinandroid.core.network.demo
1818
1919import JvmUnitTestDemoAssetManager
20- import android.os.Build
20+ import android.os.Build.VERSION.SDK_INT
21+ import android.os.Build.VERSION_CODES.N
2122import com.google.samples.apps.nowinandroid.core.network.Dispatcher
2223import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO
2324import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource
@@ -29,6 +30,7 @@ import kotlinx.coroutines.withContext
2930import kotlinx.serialization.ExperimentalSerializationApi
3031import kotlinx.serialization.json.Json
3132import kotlinx.serialization.json.decodeFromStream
33+ import java.io.BufferedReader
3234import javax.inject.Inject
3335
3436/* *
@@ -40,38 +42,35 @@ class DemoNiaNetworkDataSource @Inject constructor(
4042 private val assets : DemoAssetManager = JvmUnitTestDemoAssetManager ,
4143) : NiaNetworkDataSource {
4244
43- @OptIn(ExperimentalSerializationApi ::class )
4445 override suspend fun getTopics (ids : List <String >? ): List <NetworkTopic > =
45- withContext(ioDispatcher) {
46- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
47- assets.open(TOPICS_ASSET ).use(networkJson::decodeFromStream)
48- } else {
49- // Use decodeFromString to capability with API 24 below.
50- // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342
51- val topicsJsonString = assets.readText(TOPICS_ASSET )
52- networkJson.decodeFromString(topicsJsonString)
53- }
54- }
46+ getDemoDataFromJson(TOPICS_ASSET )
5547
56- @OptIn(ExperimentalSerializationApi ::class )
5748 override suspend fun getNewsResources (ids : List <String >? ): List <NetworkNewsResource > =
58- withContext(ioDispatcher) {
59- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
60- assets.open(NEWS_ASSET ).use(networkJson::decodeFromStream)
61- } else {
62- // Use decodeFromString to capability with API 24 below.
63- // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342
64- val newsJsonString = assets.readText(NEWS_ASSET )
65- networkJson.decodeFromString(newsJsonString)
66- }
67- }
49+ getDemoDataFromJson(NEWS_ASSET )
6850
6951 override suspend fun getTopicChangeList (after : Int? ): List <NetworkChangeList > =
7052 getTopics().mapToChangeList(NetworkTopic ::id)
7153
7254 override suspend fun getNewsResourceChangeList (after : Int? ): List <NetworkChangeList > =
7355 getNewsResources().mapToChangeList(NetworkNewsResource ::id)
7456
57+ /* *
58+ * Get Demo data form a [fileName] Json file.
59+ */
60+ @OptIn(ExperimentalSerializationApi ::class )
61+ private suspend inline fun <reified T > getDemoDataFromJson (fileName : String ): List <T > =
62+ withContext(ioDispatcher) {
63+ assets.open(fileName).use { inputStream ->
64+ if (SDK_INT >= N ) {
65+ networkJson.decodeFromStream(inputStream)
66+ } // https://github.com/Kotlin/kotlinx.serialization/issues/2457#issuecomment-1786923342
67+ else {
68+ inputStream.bufferedReader().use(BufferedReader ::readText)
69+ .let (networkJson::decodeFromString)
70+ }
71+ }
72+ }
73+
7574 companion object {
7675 private const val NEWS_ASSET = " news.json"
7776 private const val TOPICS_ASSET = " topics.json"
0 commit comments