Extracted ContentResolver into LocalSource.kt

pull/87/head
Arty Bishop 2022-02-07 17:50:03 +00:00
rodzic 9b38e2c63e
commit a7427f3632
7 zmienionych plików z 30 dodań i 22 usunięć

Wyświetl plik

@ -17,6 +17,8 @@
*/
package com.rtbishop.look4sat.framework.local
import android.content.ContentResolver
import android.net.Uri
import com.rtbishop.look4sat.data.ILocalSource
import com.rtbishop.look4sat.domain.model.SatEntry
import com.rtbishop.look4sat.domain.model.SatItem
@ -26,18 +28,28 @@ import com.rtbishop.look4sat.framework.toDomain
import com.rtbishop.look4sat.framework.toDomainItems
import com.rtbishop.look4sat.framework.toFramework
import com.rtbishop.look4sat.framework.toFrameworkEntries
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import java.io.InputStream
class LocalSource(
private val resolver: ContentResolver,
private val ioDispatcher: CoroutineDispatcher,
private val entriesDao: EntriesDao,
private val transmittersDao: TransmittersDao
private val transmittersDao: TransmittersDao,
) : ILocalSource {
override fun getSatelliteItems(): Flow<List<SatItem>> {
return entriesDao.getSatelliteItems().map { items -> items.toDomainItems() }
}
@Suppress("BlockingMethodInNonBlockingContext")
override suspend fun getFileStream(uri: String): InputStream? {
return withContext(ioDispatcher) { resolver.openInputStream(Uri.parse(uri)) }
}
override suspend fun getSelectedSatellites(): List<Satellite> {
return entriesDao.getSelectedSatellites().map { entry -> entry.tle.createSat() }
}

Wyświetl plik

@ -53,11 +53,12 @@ object CoreModule {
@IoDispatcher ioDispatcher: CoroutineDispatcher,
@DefaultDispatcher defaultDispatcher: CoroutineDispatcher
): IDataRepository {
val dataParser = DataParser(defaultDispatcher)
val db = Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5)
.fallbackToDestructiveMigration().build()
val localSource = LocalSource(db.entriesDao(), db.transmittersDao())
val dataParser = DataParser(defaultDispatcher)
val resolver = context.contentResolver
val localSource = LocalSource(resolver, ioDispatcher, db.entriesDao(), db.transmittersDao())
val remoteSource = RemoteSource(ioDispatcher)
val repositoryScope = CoroutineScope(SupervisorJob())
return DataRepository(dataParser, settings, localSource, remoteSource, repositoryScope)

Wyświetl plik

@ -56,7 +56,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
}
private val contentContract = ActivityResultContracts.GetContent()
private val contentRequest = registerForActivityResult(contentContract) { uri ->
uri?.let { viewModel.updateDataFromFile(uri) }
uri?.let { viewModel.updateDataFromFile(uri.toString()) }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

Wyświetl plik

@ -1,9 +1,6 @@
package com.rtbishop.look4sat.presentation.settingsScreen
import android.content.ContentResolver
import android.net.Uri
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.rtbishop.look4sat.data.ISettingsHandler
import com.rtbishop.look4sat.domain.IDataRepository
import com.rtbishop.look4sat.domain.ILocationHandler
@ -11,24 +8,17 @@ import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.predict.GeoPos
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class SettingsViewModel @Inject constructor(
private val resolver: ContentResolver,
private val settings: ISettingsHandler,
private val repository: IDataRepository,
private val locationHandler: ILocationHandler
) : ViewModel() {
fun updateDataFromFile(uri: Uri) {
viewModelScope.launch {
@Suppress("BlockingMethodInNonBlockingContext")
resolver.openInputStream(uri)?.use { fileUri ->
repository.updateDataFromFile(fileUri)
}
}
fun updateDataFromFile(uri: String) {
repository.updateDataFromFile(uri)
}
fun updateDataFromWeb(sources: List<String>) {

Wyświetl plik

@ -49,12 +49,15 @@ class DataRepository(
_updateState.value = DataState.Handled
}
override fun updateDataFromFile(stream: InputStream) {
override fun updateDataFromFile(uri: String) {
repositoryScope.launch(exceptionHandler) {
_updateState.value = DataState.Loading
val importedSatellites = importSatellites(stream)
localSource.updateEntries(importedSatellites)
_updateState.value = DataState.Success(0L)
val updateTimeMillis = measureTimeMillis {
localSource.getFileStream(uri)?.let { fileStream ->
localSource.updateEntries(importSatellites(fileStream))
}
}
_updateState.value = DataState.Success(updateTimeMillis)
}
}

Wyświetl plik

@ -22,11 +22,14 @@ import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow
import java.io.InputStream
interface ILocalSource {
fun getSatelliteItems(): Flow<List<SatItem>>
suspend fun getFileStream(uri: String): InputStream?
suspend fun getSelectedSatellites(): List<Satellite>
suspend fun getTransmitters(catnum: Int): List<Transmitter>

Wyświetl plik

@ -23,7 +23,6 @@ import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import java.io.InputStream
interface IDataRepository {
@ -31,7 +30,7 @@ interface IDataRepository {
fun setDataUpdateHandled()
fun updateDataFromFile(stream: InputStream)
fun updateDataFromFile(uri: String)
fun updateDataFromWeb(sources: List<String>)