|
|
@ -17,6 +17,8 @@
|
|
|
|
package com.google.samples.apps.nowinandroid.core.network.demo
|
|
|
|
package com.google.samples.apps.nowinandroid.core.network.demo
|
|
|
|
|
|
|
|
|
|
|
|
import JvmUnitTestDemoAssetManager
|
|
|
|
import JvmUnitTestDemoAssetManager
|
|
|
|
|
|
|
|
import android.os.Build.VERSION.SDK_INT
|
|
|
|
|
|
|
|
import android.os.Build.VERSION_CODES.M
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
|
|
|
|
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.NiaDispatchers.IO
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource
|
|
|
@ -28,6 +30,7 @@ import kotlinx.coroutines.withContext
|
|
|
|
import kotlinx.serialization.ExperimentalSerializationApi
|
|
|
|
import kotlinx.serialization.ExperimentalSerializationApi
|
|
|
|
import kotlinx.serialization.json.Json
|
|
|
|
import kotlinx.serialization.json.Json
|
|
|
|
import kotlinx.serialization.json.decodeFromStream
|
|
|
|
import kotlinx.serialization.json.decodeFromStream
|
|
|
|
|
|
|
|
import java.io.BufferedReader
|
|
|
|
import javax.inject.Inject
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -39,17 +42,11 @@ class DemoNiaNetworkDataSource @Inject constructor(
|
|
|
|
private val assets: DemoAssetManager = JvmUnitTestDemoAssetManager,
|
|
|
|
private val assets: DemoAssetManager = JvmUnitTestDemoAssetManager,
|
|
|
|
) : NiaNetworkDataSource {
|
|
|
|
) : NiaNetworkDataSource {
|
|
|
|
|
|
|
|
|
|
|
|
@OptIn(ExperimentalSerializationApi::class)
|
|
|
|
|
|
|
|
override suspend fun getTopics(ids: List<String>?): List<NetworkTopic> =
|
|
|
|
override suspend fun getTopics(ids: List<String>?): List<NetworkTopic> =
|
|
|
|
withContext(ioDispatcher) {
|
|
|
|
getDataFromJsonFile(TOPICS_ASSET)
|
|
|
|
assets.open(TOPICS_ASSET).use(networkJson::decodeFromStream)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@OptIn(ExperimentalSerializationApi::class)
|
|
|
|
|
|
|
|
override suspend fun getNewsResources(ids: List<String>?): List<NetworkNewsResource> =
|
|
|
|
override suspend fun getNewsResources(ids: List<String>?): List<NetworkNewsResource> =
|
|
|
|
withContext(ioDispatcher) {
|
|
|
|
getDataFromJsonFile(NEWS_ASSET)
|
|
|
|
assets.open(NEWS_ASSET).use(networkJson::decodeFromStream)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getTopicChangeList(after: Int?): List<NetworkChangeList> =
|
|
|
|
override suspend fun getTopicChangeList(after: Int?): List<NetworkChangeList> =
|
|
|
|
getTopics().mapToChangeList(NetworkTopic::id)
|
|
|
|
getTopics().mapToChangeList(NetworkTopic::id)
|
|
|
@ -57,6 +54,27 @@ class DemoNiaNetworkDataSource @Inject constructor(
|
|
|
|
override suspend fun getNewsResourceChangeList(after: Int?): List<NetworkChangeList> =
|
|
|
|
override suspend fun getNewsResourceChangeList(after: Int?): List<NetworkChangeList> =
|
|
|
|
getNewsResources().mapToChangeList(NetworkNewsResource::id)
|
|
|
|
getNewsResources().mapToChangeList(NetworkNewsResource::id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Get data from the given JSON [fileName].
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@OptIn(ExperimentalSerializationApi::class)
|
|
|
|
|
|
|
|
private suspend inline fun <reified T> getDataFromJsonFile(fileName: String): List<T> =
|
|
|
|
|
|
|
|
withContext(ioDispatcher) {
|
|
|
|
|
|
|
|
assets.open(fileName).use { inputStream ->
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
companion object {
|
|
|
|
private const val NEWS_ASSET = "news.json"
|
|
|
|
private const val NEWS_ASSET = "news.json"
|
|
|
|
private const val TOPICS_ASSET = "topics.json"
|
|
|
|
private const val TOPICS_ASSET = "topics.json"
|
|
|
|