Major fixes for DataSources. Fixed NPE in Transmitter entity.

This commit is contained in:
Arty Bishop committed 2019-10-30 20:26:58 +00:00
1 parent 4e7325d08f
commit be20786a18
7 files changed
+29 -34

No files matched your search

@@ -18,16 +18,12 @@ object Injector {
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(TransmittersApi::class.java)
val client = OkHttpClient()
return RemoteDataSource(api, client)
}
private fun provideLocalDataSource(context: Context): LocalDataSource {
val dao = TransmittersDatabase.getInstance(context).transmittersDao()
return LocalDataSource(dao)
return LocalDataSource(TransmittersDatabase.getInstance(context).transmittersDao())
}
fun provideRepository(context: Context): Repository {
@@ -1,30 +1,24 @@
package com.rtbishop.lookingsat.api
import com.rtbishop.lookingsat.repo.Transmitter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
private const val TLE_AMATEUR = "https://celestrak.com/NORAD/elements/amateur.txt"
private const val TLE_WEATHER = "https://celestrak.com/NORAD/elements/weather.txt"
import java.io.InputStream
import java.io.SequenceInputStream
class RemoteDataSource(private val api: TransmittersApi, private val client: OkHttpClient) {
private val requestAmateur = Request.Builder().url(TLE_AMATEUR).build()
private val requestWeather = Request.Builder().url(TLE_WEATHER).build()
suspend fun fetchTles(): ByteArray {
var streamAmateur: ByteArray? = null
var streamWeather: ByteArray? = null
withContext(Dispatchers.IO) {
streamAmateur = client.newCall(requestAmateur).execute().body()?.bytes()
streamWeather = client.newCall(requestWeather).execute().body()?.bytes()
}
return streamAmateur ?: ByteArray(0).plus(streamWeather ?: ByteArray(0))
fun fetchTleStream(): InputStream {
val requestAmateur =
Request.Builder().url("https://celestrak.com/NORAD/elements/amateur.txt").build()
val requestWeather =
Request.Builder().url("https://celestrak.com/NORAD/elements/weather.txt").build()
val streamAmateur = client.newCall(requestAmateur).execute().body()?.byteStream()
val streamWeather = client.newCall(requestWeather).execute().body()?.byteStream()
return SequenceInputStream(streamAmateur, streamWeather)
}
suspend fun fetchTransmitters(): List<Transmitter> {
suspend fun fetchTransmittersList(): List<Transmitter> {
return api.fetchTransmittersList()
}
}
@@ -4,8 +4,8 @@ import com.rtbishop.lookingsat.repo.Transmitter
class LocalDataSource(private val transmittersDao: TransmittersDao) {
suspend fun insert(transmitters: List<Transmitter>) {
transmittersDao.insert(transmitters)
suspend fun insertTransmitters(transmitters: List<Transmitter>) {
transmittersDao.insertTransmitters(transmitters)
}
suspend fun getTransmittersForSat(id: Int): List<Transmitter> {
@@ -10,8 +10,8 @@ import com.rtbishop.lookingsat.repo.Transmitter
interface TransmittersDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(transmitters: List<Transmitter>)
suspend fun insertTransmitters(transmitters: List<Transmitter>)
@Query("SELECT * FROM transmitters WHERE noradCatId = :id")
@Query("SELECT * FROM transmitters WHERE isAlive = 1 and noradCatId = :id")
suspend fun getTransmittersForSat(id: Int): List<Transmitter>
}
@@ -19,7 +19,7 @@ abstract class TransmittersDatabase : RoomDatabase() {
fun getInstance(context: Context): TransmittersDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: Room.databaseBuilder(
context.applicationContext,
context,
TransmittersDatabase::class.java,
"transmitters"
).build()
@@ -1,23 +1,28 @@
package com.rtbishop.lookingsat.repo
import android.util.Log
import com.rtbishop.lookingsat.api.RemoteDataSource
import com.rtbishop.lookingsat.db.LocalDataSource
import java.io.IOException
import java.io.InputStream
class Repository(
private val localSource: LocalDataSource,
private val remoteSource: RemoteDataSource
) {
suspend fun fetchTles(): ByteArray {
return remoteSource.fetchTles()
fun fetchTleStream(): InputStream {
return remoteSource.fetchTleStream()
}
suspend fun updateTransmitters() {
val transmitters = remoteSource.fetchTransmitters()
localSource.insert(transmitters)
suspend fun updateTransmittersDatabase() {
try {
localSource.insertTransmitters(remoteSource.fetchTransmittersList())
} catch (exception: IOException) {
Log.d(this.javaClass.simpleName, exception.toString())
}
}
suspend fun getTransmittersForSat(id: Int): List<Transmitter> {
updateTransmitters()
return localSource.getTransmittersForSat(id)
}
}
@@ -13,7 +13,7 @@ data class Transmitter(
@SerializedName("uplink_high") val uplinkHigh: Long?,
@SerializedName("downlink_low") val downlinkLow: Long?,
@SerializedName("downlink_high") val downlinkHigh: Long?,
@SerializedName("mode") val mode: String,
@SerializedName("mode") val mode: String?,
@SerializedName("invert") val isInverted: Boolean,
@SerializedName("norad_cat_id") val noradCatId: Int
)