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:
2026-03-01 00:28:43 +01:00
parent 920a832424
commit c155a3cc2e
7 changed files with 60 additions and 12 deletions

View File

@@ -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

View File

@@ -1,5 +1,5 @@
query MapMarkers {
locations {
query MapMarkers($isOnline: Boolean) {
locations(filter: { isOnline: $isOnline }) {
_id
name
city

View File

@@ -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
}

View File

@@ -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>
}

View File

@@ -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 ->

View File

@@ -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>
}

View File

@@ -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")
}