From c155a3cc2e7a25f68fd4bd1b1d19e25d4ac78f5e Mon Sep 17 00:00:00 2001 From: beetzung Date: Sun, 1 Mar 2026 00:28:43 +0100 Subject: [PATCH] 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 --- .../db3/airmq/features/map/MapViewModel.kt | 9 +++++-- sdk/src/main/graphql/MapLocations.graphql | 4 +-- .../kotlin/org/db3/airmq/sdk/di/SDKModule.kt | 6 +++++ .../org/db3/airmq/sdk/map/MapService.kt | 2 +- .../org/db3/airmq/sdk/map/MapServiceImpl.kt | 14 +++++++++-- .../db3/airmq/sdk/settings/SettingsService.kt | 12 +++++---- .../airmq/sdk/settings/SettingsServiceImpl.kt | 25 +++++++++++++++++++ 7 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsServiceImpl.kt diff --git a/app/src/main/kotlin/org/db3/airmq/features/map/MapViewModel.kt b/app/src/main/kotlin/org/db3/airmq/features/map/MapViewModel.kt index 4741c16..2d87284 100644 --- a/app/src/main/kotlin/org/db3/airmq/features/map/MapViewModel.kt +++ b/app/src/main/kotlin/org/db3/airmq/features/map/MapViewModel.kt @@ -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 diff --git a/sdk/src/main/graphql/MapLocations.graphql b/sdk/src/main/graphql/MapLocations.graphql index 461c207..7bb00c9 100644 --- a/sdk/src/main/graphql/MapLocations.graphql +++ b/sdk/src/main/graphql/MapLocations.graphql @@ -1,5 +1,5 @@ -query MapMarkers { - locations { +query MapMarkers($isOnline: Boolean) { + locations(filter: { isOnline: $isOnline }) { _id name city diff --git a/sdk/src/main/kotlin/org/db3/airmq/sdk/di/SDKModule.kt b/sdk/src/main/kotlin/org/db3/airmq/sdk/di/SDKModule.kt index b8460b7..4b265d5 100644 --- a/sdk/src/main/kotlin/org/db3/airmq/sdk/di/SDKModule.kt +++ b/sdk/src/main/kotlin/org/db3/airmq/sdk/di/SDKModule.kt @@ -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 } diff --git a/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapService.kt b/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapService.kt index d32646e..7228cdf 100644 --- a/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapService.kt +++ b/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapService.kt @@ -3,5 +3,5 @@ package org.db3.airmq.sdk.map import org.db3.airmq.sdk.map.domain.MapItem interface MapService { - suspend fun fetchMapItems(): List + suspend fun fetchMapItems(showOfflineDevices: Boolean): List } diff --git a/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapServiceImpl.kt b/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapServiceImpl.kt index 3f57bc7..9ace738 100644 --- a/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapServiceImpl.kt +++ b/sdk/src/main/kotlin/org/db3/airmq/sdk/map/MapServiceImpl.kt @@ -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 { + override suspend fun fetchMapItems(showOfflineDevices: Boolean): List { Log.d(TAG, "Executing MapMarkers Apollo query") + val isOnlineFilter: Optional = if (showOfflineDevices) { + Optional.Absent + } else { + Optional.Present(true) + } val response = apolloClient - .query(MapMarkersQuery()) + .query( + MapMarkersQuery( + isOnline = isOnlineFilter + ) + ) .execute() response.errors?.firstOrNull()?.let { gqlError -> diff --git a/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsService.kt b/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsService.kt index f68cb46..745d417 100644 --- a/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsService.kt +++ b/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsService.kt @@ -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 - suspend fun setAdvancedEnabled(enabled: Boolean): Result + suspend fun getCity(): String? + suspend fun setCity(city: String?): Result + suspend fun getOfflineDevicesVisible(): Boolean suspend fun setOfflineDevicesVisible(visible: Boolean): Result + suspend fun getAdvancedEnabled(): Boolean + suspend fun setAdvancedEnabled(enabled: Boolean): Result + suspend fun getDeviceStatusNotificationsEnabled(): Boolean + suspend fun setDeviceStatusNotificationsEnabled(enabled: Boolean): Result } diff --git a/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsServiceImpl.kt b/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsServiceImpl.kt new file mode 100644 index 0000000..5f5a536 --- /dev/null +++ b/sdk/src/main/kotlin/org/db3/airmq/sdk/settings/SettingsServiceImpl.kt @@ -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 = throw NotImplementedError("setCity is not implemented yet") + + override suspend fun getOfflineDevicesVisible(): Boolean = false + + override suspend fun setOfflineDevicesVisible(visible: Boolean): Result = + 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 = + 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 = + throw NotImplementedError("setDeviceStatusNotificationsEnabled is not implemented yet") +}