From a7427f3632d0a3add1daeaa6ad03c0aed9785b0d Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Mon, 7 Feb 2022 17:50:03 +0000 Subject: [PATCH] Extracted ContentResolver into LocalSource.kt --- .../look4sat/framework/local/LocalSource.kt | 14 +++++++++++++- .../com/rtbishop/look4sat/injection/CoreModule.kt | 5 +++-- .../settingsScreen/SettingsFragment.kt | 2 +- .../settingsScreen/SettingsViewModel.kt | 14 ++------------ .../com/rtbishop/look4sat/data/DataRepository.kt | 11 +++++++---- .../com/rtbishop/look4sat/data/ILocalSource.kt | 3 +++ .../rtbishop/look4sat/domain/IDataRepository.kt | 3 +-- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt index 025d88ac..8f600c0b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt @@ -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> { 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 { return entriesDao.getSelectedSatellites().map { entry -> entry.tle.createSat() } } diff --git a/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt index 5091f6f9..9424bb58 100644 --- a/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt @@ -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) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt index c14a0e5d..16b5eb88 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt @@ -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?) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt index 04039f9a..1754a2c7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt @@ -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) { diff --git a/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt b/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt index f224df5f..3c8d2bb4 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt @@ -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) } } diff --git a/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt index 573845c1..1cff87f7 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt @@ -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> + suspend fun getFileStream(uri: String): InputStream? + suspend fun getSelectedSatellites(): List suspend fun getTransmitters(catnum: Int): List diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt b/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt index fc594003..3959e87b 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt @@ -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)