diff --git a/app/src/google/java/net/vonforst/evmap/auto/MapScreen.kt b/app/src/google/java/net/vonforst/evmap/auto/MapScreen.kt index 3caa2c4d..be1c531b 100644 --- a/app/src/google/java/net/vonforst/evmap/auto/MapScreen.kt +++ b/app/src/google/java/net/vonforst/evmap/auto/MapScreen.kt @@ -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 diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/Common.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/Common.kt index 45180845..34f61df8 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/Common.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/Common.kt @@ -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.getFilters( - referenceData: LiveData, - stringProvider: StringProvider -) = MediatorLiveData>>().apply { - addSource(referenceData) { data -> - value = getFilters(data, stringProvider) - } -} - fun FilterValueDao.getFilterValues(filterStatus: LiveData, dataSource: String) = MediatorLiveData>().apply { var source: LiveData>? = null diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt index 6e059720..7c9a86d9 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -45,13 +45,15 @@ internal fun getClusterDistance(zoom: Float): Int? { class MapViewModel(application: Application, private val state: SavedStateHandle) : AndroidViewModel(application) { val apiType: Class> - 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 = createApi(prefs.dataSource, application) + private var api = MutableLiveData>().apply { + value = createApi(prefs.dataSource, application) + } val bottomSheetState: MutableLiveData by lazy { state.getLiveData("bottomSheetState") @@ -71,8 +73,14 @@ class MapViewModel(application: Application, private val state: SavedStateHandle } private val filterValues: LiveData> = 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 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