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 package com.rtbishop.look4sat.framework.local
import android.content.ContentResolver
import android.net.Uri
import com.rtbishop.look4sat.data.ILocalSource import com.rtbishop.look4sat.data.ILocalSource
import com.rtbishop.look4sat.domain.model.SatEntry import com.rtbishop.look4sat.domain.model.SatEntry
import com.rtbishop.look4sat.domain.model.SatItem 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.toDomainItems
import com.rtbishop.look4sat.framework.toFramework import com.rtbishop.look4sat.framework.toFramework
import com.rtbishop.look4sat.framework.toFrameworkEntries import com.rtbishop.look4sat.framework.toFrameworkEntries
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import java.io.InputStream
class LocalSource( class LocalSource(
private val resolver: ContentResolver,
private val ioDispatcher: CoroutineDispatcher,
private val entriesDao: EntriesDao, private val entriesDao: EntriesDao,
private val transmittersDao: TransmittersDao private val transmittersDao: TransmittersDao,
) : ILocalSource { ) : ILocalSource {
override fun getSatelliteItems(): Flow<List<SatItem>> { override fun getSatelliteItems(): Flow<List<SatItem>> {
return entriesDao.getSatelliteItems().map { items -> items.toDomainItems() } 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> { override suspend fun getSelectedSatellites(): List<Satellite> {
return entriesDao.getSelectedSatellites().map { entry -> entry.tle.createSat() } return entriesDao.getSelectedSatellites().map { entry -> entry.tle.createSat() }
} }

Wyświetl plik

@ -53,11 +53,12 @@ object CoreModule {
@IoDispatcher ioDispatcher: CoroutineDispatcher, @IoDispatcher ioDispatcher: CoroutineDispatcher,
@DefaultDispatcher defaultDispatcher: CoroutineDispatcher @DefaultDispatcher defaultDispatcher: CoroutineDispatcher
): IDataRepository { ): IDataRepository {
val dataParser = DataParser(defaultDispatcher)
val db = Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb") val db = Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5) .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5)
.fallbackToDestructiveMigration().build() .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 remoteSource = RemoteSource(ioDispatcher)
val repositoryScope = CoroutineScope(SupervisorJob()) val repositoryScope = CoroutineScope(SupervisorJob())
return DataRepository(dataParser, settings, localSource, remoteSource, repositoryScope) 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 contentContract = ActivityResultContracts.GetContent()
private val contentRequest = registerForActivityResult(contentContract) { uri -> private val contentRequest = registerForActivityResult(contentContract) { uri ->
uri?.let { viewModel.updateDataFromFile(uri) } uri?.let { viewModel.updateDataFromFile(uri.toString()) }
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

Wyświetl plik

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

Wyświetl plik

@ -49,12 +49,15 @@ class DataRepository(
_updateState.value = DataState.Handled _updateState.value = DataState.Handled
} }
override fun updateDataFromFile(stream: InputStream) { override fun updateDataFromFile(uri: String) {
repositoryScope.launch(exceptionHandler) { repositoryScope.launch(exceptionHandler) {
_updateState.value = DataState.Loading _updateState.value = DataState.Loading
val importedSatellites = importSatellites(stream) val updateTimeMillis = measureTimeMillis {
localSource.updateEntries(importedSatellites) localSource.getFileStream(uri)?.let { fileStream ->
_updateState.value = DataState.Success(0L) 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.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import java.io.InputStream
interface ILocalSource { interface ILocalSource {
fun getSatelliteItems(): Flow<List<SatItem>> fun getSatelliteItems(): Flow<List<SatItem>>
suspend fun getFileStream(uri: String): InputStream?
suspend fun getSelectedSatellites(): List<Satellite> suspend fun getSelectedSatellites(): List<Satellite>
suspend fun getTransmitters(catnum: Int): List<Transmitter> 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 com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import java.io.InputStream
interface IDataRepository { interface IDataRepository {
@ -31,7 +30,7 @@ interface IDataRepository {
fun setDataUpdateHandled() fun setDataUpdateHandled()
fun updateDataFromFile(stream: InputStream) fun updateDataFromFile(uri: String)
fun updateDataFromWeb(sources: List<String>) fun updateDataFromWeb(sources: List<String>)