diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt index cb9e5922..7e396f0c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt @@ -80,6 +80,16 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences) return catnums?.sorted() ?: emptyList() } + override fun saveSatType(type: String, catnums: List) { + val stringList = catnums.map { catnum -> catnum.toString() } + prefs.edit { putStringSet("type$type", stringList.toSet()) } + } + + override fun loadSatType(type: String): List { + val catnums = prefs.getStringSet("type$type", emptySet())?.map { catnum -> catnum.toInt() } + return catnums ?: emptyList() + } + override fun getHoursAhead(): Int { return prefs.getInt(keyHoursAhead, 24) } diff --git a/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt index 25357594..a19cb8ea 100644 --- a/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt @@ -48,7 +48,10 @@ object BaseModule { @Provides @Singleton - fun provideDataRepository(@ApplicationContext context: Context): IDataRepository { + fun provideDataRepository( + @ApplicationContext context: Context, + settings: ISettingsManager + ): IDataRepository { val db = Room.databaseBuilder(context, LocalDatabase::class.java, "Look4SatDb") .addMigrations(MIGRATION_1_2).fallbackToDestructiveMigration().build() val parser = DataParser(Dispatchers.Default) @@ -56,8 +59,8 @@ object BaseModule { val entries = LocalEntrySource(db.entriesDao()) val radios = LocalRadioSource(db.radiosDao()) val remoteSource = RemoteDataSource(Dispatchers.IO) - val repositoryScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) - return DataRepository(parser, fileSource, entries, radios, remoteSource, repositoryScope) + val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + return DataRepository(parser, fileSource, entries, radios, remoteSource, scope, settings) } @Provides diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt b/base/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt index 5388d73d..fe356c44 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt @@ -42,6 +42,8 @@ interface IDataRepository { fun updateFromWeb(urls: List) + fun updateFromWebNew() + fun setUpdateStateHandled() fun clearAllData() diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt index ffd8830c..9a37d97a 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt @@ -93,6 +93,10 @@ interface ISettingsManager { fun loadEntriesSelection(): List + fun saveSatType(type: String, catnums: List) + + fun loadSatType(type: String): List + fun getRotatorEnabled(): Boolean fun setRotatorEnabled(value: Boolean) diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt b/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt index a9a30deb..cf358659 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt @@ -18,6 +18,7 @@ package com.rtbishop.look4sat.domain.data import com.rtbishop.look4sat.domain.IDataRepository +import com.rtbishop.look4sat.domain.ISettingsManager import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.model.SatEntry import com.rtbishop.look4sat.utility.DataParser @@ -33,7 +34,8 @@ class DataRepository( private val entrySource: ILocalEntrySource, private val radioSource: ILocalRadioSource, private val remoteSource: IRemoteDataSource, - private val repositoryScope: CoroutineScope + private val repositoryScope: CoroutineScope, + private val settingsManager: ISettingsManager ) : IDataRepository { private val exceptionHandler = CoroutineExceptionHandler { _, exception -> @@ -95,6 +97,51 @@ class DataRepository( } } + override fun updateFromWebNew() { + _updateState.value = DataState.Loading + repositoryScope.launch(exceptionHandler) { + val importedEntries = mutableListOf() + val sourcesMap = settingsManager.sourcesMap + val jobsMap = sourcesMap.mapValues { async { remoteSource.getDataStream(it.value) } } + jobsMap.mapValues { job -> job.value.await() }.forEach { entry -> + entry.value?.let { stream -> + when (val type = entry.key) { + "AMSAT" -> { + // parse tle stream + val satellites = importSatellites(stream) + val catnums = satellites.map { it.data.catnum } + settingsManager.saveSatType(type, catnums) + importedEntries.addAll(satellites) + } + "McCants", "Classified" -> { + // unzip and parse tle stream + val unzipped = ZipInputStream(stream).apply { nextEntry } + val satellites = importSatellites(unzipped) + val catnums = satellites.map { it.data.catnum } + settingsManager.saveSatType(type, catnums) + importedEntries.addAll(satellites) + } + else -> { + // parse csv stream + val parsed = dataParser.parseCSVStream(stream) + val satellites = parsed.map { data -> SatEntry(data) } + val catnums = satellites.map { it.data.catnum } + settingsManager.saveSatType(type, catnums) + importedEntries.addAll(satellites) + } + } + } + } + entrySource.insertEntries(importedEntries) + _updateState.value = DataState.Success(0L) + } + repositoryScope.launch(exceptionHandler) { + remoteSource.getDataStream(remoteSource.radioApi)?.let { stream -> + radioSource.insertRadios(dataParser.parseJSONStream(stream)) + } + } + } + override fun setUpdateStateHandled() { _updateState.value = DataState.Handled }