Expose per-setting SettingsService getters/setters and wire map offline visibility to GraphQL.
This moves offline filtering to the API query path so map data respects settings at source instead of client-side post-filtering. Made-with: Cursor
This commit is contained in:
@@ -23,10 +23,12 @@ import org.db3.airmq.features.map.MapScreenContract.State
|
||||
import org.db3.airmq.features.map.MapScreenContract.TimeRange
|
||||
import org.db3.airmq.sdk.map.MapService
|
||||
import org.db3.airmq.sdk.map.domain.MapItem
|
||||
import org.db3.airmq.sdk.settings.SettingsService
|
||||
|
||||
@HiltViewModel
|
||||
class MapViewModel @Inject constructor(
|
||||
private val mapService: MapService
|
||||
private val mapService: MapService,
|
||||
private val settingsService: SettingsService
|
||||
) : ViewModel() {
|
||||
|
||||
private val _uiState = MutableStateFlow(State(isLoading = true))
|
||||
@@ -141,7 +143,10 @@ class MapViewModel @Inject constructor(
|
||||
private fun refreshMapItems() {
|
||||
_uiState.value = _uiState.value.copy(isLoading = true)
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
val result = runCatching { mapService.fetchMapItems() }
|
||||
val result = runCatching {
|
||||
val showOfflineDevices = settingsService.getOfflineDevicesVisible()
|
||||
mapService.fetchMapItems(showOfflineDevices = showOfflineDevices)
|
||||
}
|
||||
_uiState.value = result.fold(
|
||||
onSuccess = { items ->
|
||||
domainItems = items
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
query MapMarkers {
|
||||
locations {
|
||||
query MapMarkers($isOnline: Boolean) {
|
||||
locations(filter: { isOnline: $isOnline }) {
|
||||
_id
|
||||
name
|
||||
city
|
||||
|
||||
@@ -9,6 +9,8 @@ import dagger.hilt.components.SingletonComponent
|
||||
import javax.inject.Singleton
|
||||
import org.db3.airmq.sdk.map.MapServiceImpl
|
||||
import org.db3.airmq.sdk.map.MapService
|
||||
import org.db3.airmq.sdk.settings.SettingsService
|
||||
import org.db3.airmq.sdk.settings.SettingsServiceImpl
|
||||
import org.db3.airmq.sdk.network.ApolloLoggingInterceptor
|
||||
|
||||
@Module
|
||||
@@ -32,4 +34,8 @@ abstract class SDKBindModule {
|
||||
@Binds
|
||||
@Singleton
|
||||
abstract fun bindMapService(impl: MapServiceImpl): MapService
|
||||
|
||||
@Binds
|
||||
@Singleton
|
||||
abstract fun bindSettingsService(impl: SettingsServiceImpl): SettingsService
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@ package org.db3.airmq.sdk.map
|
||||
import org.db3.airmq.sdk.map.domain.MapItem
|
||||
|
||||
interface MapService {
|
||||
suspend fun fetchMapItems(): List<MapItem>
|
||||
suspend fun fetchMapItems(showOfflineDevices: Boolean): List<MapItem>
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.db3.airmq.sdk.map
|
||||
|
||||
import android.util.Log
|
||||
import com.apollographql.apollo.ApolloClient
|
||||
import com.apollographql.apollo.api.Optional
|
||||
import javax.inject.Inject
|
||||
import org.db3.airmq.sdk.MapMarkersQuery
|
||||
import org.db3.airmq.sdk.map.domain.MapItem
|
||||
@@ -10,10 +11,19 @@ class MapServiceImpl @Inject constructor(
|
||||
private val apolloClient: ApolloClient,
|
||||
private val mapper: ApolloMapItemMapper
|
||||
) : MapService {
|
||||
override suspend fun fetchMapItems(): List<MapItem> {
|
||||
override suspend fun fetchMapItems(showOfflineDevices: Boolean): List<MapItem> {
|
||||
Log.d(TAG, "Executing MapMarkers Apollo query")
|
||||
val isOnlineFilter: Optional<Boolean?> = if (showOfflineDevices) {
|
||||
Optional.Absent
|
||||
} else {
|
||||
Optional.Present(true)
|
||||
}
|
||||
val response = apolloClient
|
||||
.query(MapMarkersQuery())
|
||||
.query(
|
||||
MapMarkersQuery(
|
||||
isOnline = isOnlineFilter
|
||||
)
|
||||
)
|
||||
.execute()
|
||||
|
||||
response.errors?.firstOrNull()?.let { gqlError ->
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.db3.airmq.sdk.settings
|
||||
|
||||
import org.db3.airmq.sdk.settings.model.Settings
|
||||
|
||||
interface SettingsService {
|
||||
suspend fun fetchSettings(): Settings
|
||||
suspend fun updateSettings(settings: Settings): Result<Settings>
|
||||
suspend fun setAdvancedEnabled(enabled: Boolean): Result<Unit>
|
||||
suspend fun getCity(): String?
|
||||
suspend fun setCity(city: String?): Result<Unit>
|
||||
suspend fun getOfflineDevicesVisible(): Boolean
|
||||
suspend fun setOfflineDevicesVisible(visible: Boolean): Result<Unit>
|
||||
suspend fun getAdvancedEnabled(): Boolean
|
||||
suspend fun setAdvancedEnabled(enabled: Boolean): Result<Unit>
|
||||
suspend fun getDeviceStatusNotificationsEnabled(): Boolean
|
||||
suspend fun setDeviceStatusNotificationsEnabled(enabled: Boolean): Result<Unit>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package org.db3.airmq.sdk.settings
|
||||
|
||||
import javax.inject.Inject
|
||||
|
||||
class SettingsServiceImpl @Inject constructor() : SettingsService {
|
||||
override suspend fun getCity(): String? = throw NotImplementedError("getCity is not implemented yet")
|
||||
|
||||
override suspend fun setCity(city: String?): Result<Unit> = throw NotImplementedError("setCity is not implemented yet")
|
||||
|
||||
override suspend fun getOfflineDevicesVisible(): Boolean = false
|
||||
|
||||
override suspend fun setOfflineDevicesVisible(visible: Boolean): Result<Unit> =
|
||||
throw NotImplementedError("setOfflineDevicesVisible is not implemented yet")
|
||||
|
||||
override suspend fun getAdvancedEnabled(): Boolean = throw NotImplementedError("getAdvancedEnabled is not implemented yet")
|
||||
|
||||
override suspend fun setAdvancedEnabled(enabled: Boolean): Result<Unit> =
|
||||
throw NotImplementedError("setAdvancedEnabled is not implemented yet")
|
||||
|
||||
override suspend fun getDeviceStatusNotificationsEnabled(): Boolean =
|
||||
throw NotImplementedError("getDeviceStatusNotificationsEnabled is not implemented yet")
|
||||
|
||||
override suspend fun setDeviceStatusNotificationsEnabled(enabled: Boolean): Result<Unit> =
|
||||
throw NotImplementedError("setDeviceStatusNotificationsEnabled is not implemented yet")
|
||||
}
|
||||
Reference in New Issue
Block a user