kopia lustrzana https://github.com/rt-bishop/Look4Sat
Extracted ContentResolver into LocalSource.kt
rodzic
9b38e2c63e
commit
a7427f3632
|
@ -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() }
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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?) {
|
||||
|
|
|
@ -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>) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>)
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue