Refactor preferences module

This commit is contained in:
MM20
2024-01-19 22:29:37 +01:00
parent 94aee6baba
commit 92ddc75060
171 changed files with 3202 additions and 2962 deletions
@@ -6,5 +6,5 @@ import org.koin.dsl.module
val unitConverterModule = module {
single { CurrencyRepository(androidContext()) }
single<UnitConverterRepository> { UnitConverterRepositoryImpl(androidContext(), get()) }
single<UnitConverterRepository> { UnitConverterRepositoryImpl(androidContext(), get(), get()) }
}
@@ -2,44 +2,55 @@ package de.mm20.launcher2.unitconverter
import android.content.Context
import de.mm20.launcher2.currencies.CurrencyRepository
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.search.UnitConverterSettings
import de.mm20.launcher2.search.data.UnitConverter
import de.mm20.launcher2.unitconverter.converters.*
import de.mm20.launcher2.unitconverter.converters.AreaConverter
import de.mm20.launcher2.unitconverter.converters.CurrencyConverter
import de.mm20.launcher2.unitconverter.converters.DataConverter
import de.mm20.launcher2.unitconverter.converters.LengthConverter
import de.mm20.launcher2.unitconverter.converters.MassConverter
import de.mm20.launcher2.unitconverter.converters.TemperatureConverter
import de.mm20.launcher2.unitconverter.converters.TimeConverter
import de.mm20.launcher2.unitconverter.converters.VelocityConverter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
interface UnitConverterRepository {
fun search(query: String, includeCurrencies: Boolean): Flow<UnitConverter?>
fun search(query: String): Flow<UnitConverter?>
}
internal class UnitConverterRepositoryImpl(
private val context: Context,
private val currencyRepository: CurrencyRepository,
private val settings: UnitConverterSettings,
) : UnitConverterRepository, KoinComponent {
private val dataStore: LauncherDataStore by inject()
private val scope = CoroutineScope(Job() + Dispatchers.Default)
init {
scope.launch {
dataStore.data.map { it.unitConverterSearch }.distinctUntilChanged().collectLatest {
if (it.enabled && it.currencies) currencyRepository.enableCurrencyUpdateWorker()
else currencyRepository.disableCurrencyUpdateWorker()
}
settings.map { it.enabled && it.currencies }
.distinctUntilChanged().collectLatest {
if (it) currencyRepository.enableCurrencyUpdateWorker()
else currencyRepository.disableCurrencyUpdateWorker()
}
}
}
override fun search(query: String, includeCurrencies: Boolean): Flow<UnitConverter?> = channelFlow {
if (query.isBlank()) {
send(null)
return@channelFlow
override fun search(query: String): Flow<UnitConverter?> {
if (query.isBlank()) return flowOf(null)
return settings.distinctUntilChanged().map {
if (!it.enabled) null
else queryUnitConverter(query, it.currencies)
}
send(queryUnitConverter(query, includeCurrencies))
}
private suspend fun queryUnitConverter(