Fix #167: Data source change only applied after app restart

This commit is contained in:
Johan von Forstner
2022-04-18 20:55:16 +02:00
parent 2434e5e75e
commit 95bff6d8d4
3 changed files with 20 additions and 24 deletions

View File

@@ -13,10 +13,7 @@ import androidx.car.app.hardware.info.EnergyLevel
import androidx.car.app.model.*
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.*
import com.car2go.maps.model.LatLng
import kotlinx.coroutines.*
import net.vonforst.evmap.R
@@ -35,7 +32,6 @@ import net.vonforst.evmap.ui.getMarkerTint
import net.vonforst.evmap.utils.distanceBetween
import net.vonforst.evmap.viewmodel.filtersWithValue
import net.vonforst.evmap.viewmodel.getFilterValues
import net.vonforst.evmap.viewmodel.getFilters
import net.vonforst.evmap.viewmodel.getReferenceData
import java.io.IOException
import java.time.Duration
@@ -75,7 +71,8 @@ class MapScreen(ctx: CarContext, val session: EVMapSession, val favorites: Boole
?: FILTERS_DISABLED
}
private val filterValues = db.filterValueDao().getFilterValues(filterStatus, prefs.dataSource)
private val filters = api.getFilters(referenceData, carContext.stringProvider())
private val filters =
Transformations.map(referenceData) { api.getFilters(it, carContext.stringProvider()) }
private val filtersWithValue = filtersWithValue(filters, filterValues)
private val hardwareMan = ctx.getCarService(CarContext.HARDWARE_SERVICE) as CarHardwareManager

View File

@@ -5,7 +5,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import kotlinx.coroutines.CoroutineScope
import net.vonforst.evmap.api.ChargepointApi
import net.vonforst.evmap.api.StringProvider
import net.vonforst.evmap.api.goingelectric.GoingElectricApiWrapper
import net.vonforst.evmap.api.openchargemap.OpenChargeMapApiWrapper
import net.vonforst.evmap.model.*
@@ -59,15 +58,6 @@ fun filtersWithValue(
}
}
fun ChargepointApi<ReferenceData>.getFilters(
referenceData: LiveData<out ReferenceData>,
stringProvider: StringProvider
) = MediatorLiveData<List<Filter<FilterValue>>>().apply {
addSource(referenceData) { data ->
value = getFilters(data, stringProvider)
}
}
fun FilterValueDao.getFilterValues(filterStatus: LiveData<Long>, dataSource: String) =
MediatorLiveData<List<FilterValue>>().apply {
var source: LiveData<List<FilterValue>>? = null

View File

@@ -45,13 +45,15 @@ internal fun getClusterDistance(zoom: Float): Int? {
class MapViewModel(application: Application, private val state: SavedStateHandle) :
AndroidViewModel(application) {
val apiType: Class<ChargepointApi<ReferenceData>>
get() = api.javaClass
get() = api.value!!.javaClass
val apiName: String
get() = api.getName()
get() = api.value!!.getName()
private var db = AppDatabase.getInstance(application)
private var prefs = PreferenceDataSource(application)
private var api: ChargepointApi<ReferenceData> = createApi(prefs.dataSource, application)
private var api = MutableLiveData<ChargepointApi<ReferenceData>>().apply {
value = createApi(prefs.dataSource, application)
}
val bottomSheetState: MutableLiveData<Int> by lazy {
state.getLiveData("bottomSheetState")
@@ -71,8 +73,14 @@ class MapViewModel(application: Application, private val state: SavedStateHandle
}
private val filterValues: LiveData<List<FilterValue>> =
db.filterValueDao().getFilterValues(filterStatus, prefs.dataSource)
private val referenceData = api.getReferenceData(viewModelScope, application)
private val filters = api.getFilters(referenceData, application.stringProvider())
private val referenceData =
Transformations.switchMap(api) { it.getReferenceData(viewModelScope, application) }
private val filters = Transformations.map(referenceData) {
api.value!!.getFilters(
it,
application.stringProvider()
)
}
private val filtersWithValue: LiveData<FilterValues> by lazy {
filtersWithValue(filters, filterValues)
@@ -250,6 +258,7 @@ class MapViewModel(application: Application, private val state: SavedStateHandle
fun reloadPrefs() {
filterStatus.value = prefs.filterStatus
api.value = createApi(prefs.dataSource, getApplication())
}
fun toggleFilters() {
@@ -306,7 +315,7 @@ class MapViewModel(application: Application, private val state: SavedStateHandle
val mapPosition = data.first
val filters = data.second
val api = api
val api = api.value!!
val refData = data.third
if (filterStatus.value == FILTERS_FAVORITES) {
@@ -379,7 +388,7 @@ class MapViewModel(application: Application, private val state: SavedStateHandle
chargerLoadingTask?.cancel()
chargerLoadingTask = viewModelScope.launch {
try {
chargerDetails.value = api.getChargepointDetail(referenceData, charger.id)
chargerDetails.value = api.value!!.getChargepointDetail(referenceData, charger.id)
} catch (e: IOException) {
chargerDetails.value = Resource.error(e.message, null)
e.printStackTrace()
@@ -394,7 +403,7 @@ class MapViewModel(application: Application, private val state: SavedStateHandle
override fun onChanged(refData: ReferenceData) {
referenceData.removeObserver(this)
viewModelScope.launch {
val response = api.getChargepointDetail(refData, chargerId)
val response = api.value!!.getChargepointDetail(refData, chargerId)
chargerDetails.value = response
if (response.status == Status.SUCCESS) {
chargerSparse.value = response.data