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.features.map.MapScreenContract.TimeRange
|
||||||
import org.db3.airmq.sdk.map.MapService
|
import org.db3.airmq.sdk.map.MapService
|
||||||
import org.db3.airmq.sdk.map.domain.MapItem
|
import org.db3.airmq.sdk.map.domain.MapItem
|
||||||
|
import org.db3.airmq.sdk.settings.SettingsService
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class MapViewModel @Inject constructor(
|
class MapViewModel @Inject constructor(
|
||||||
private val mapService: MapService
|
private val mapService: MapService,
|
||||||
|
private val settingsService: SettingsService
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val _uiState = MutableStateFlow(State(isLoading = true))
|
private val _uiState = MutableStateFlow(State(isLoading = true))
|
||||||
@@ -141,7 +143,10 @@ class MapViewModel @Inject constructor(
|
|||||||
private fun refreshMapItems() {
|
private fun refreshMapItems() {
|
||||||
_uiState.value = _uiState.value.copy(isLoading = true)
|
_uiState.value = _uiState.value.copy(isLoading = true)
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
val result = runCatching { mapService.fetchMapItems() }
|
val result = runCatching {
|
||||||
|
val showOfflineDevices = settingsService.getOfflineDevicesVisible()
|
||||||
|
mapService.fetchMapItems(showOfflineDevices = showOfflineDevices)
|
||||||
|
}
|
||||||
_uiState.value = result.fold(
|
_uiState.value = result.fold(
|
||||||
onSuccess = { items ->
|
onSuccess = { items ->
|
||||||
domainItems = items
|
domainItems = items
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
query MapMarkers {
|
query MapMarkers($isOnline: Boolean) {
|
||||||
locations {
|
locations(filter: { isOnline: $isOnline }) {
|
||||||
_id
|
_id
|
||||||
name
|
name
|
||||||
city
|
city
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import dagger.hilt.components.SingletonComponent
|
|||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
import org.db3.airmq.sdk.map.MapServiceImpl
|
import org.db3.airmq.sdk.map.MapServiceImpl
|
||||||
import org.db3.airmq.sdk.map.MapService
|
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
|
import org.db3.airmq.sdk.network.ApolloLoggingInterceptor
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@@ -32,4 +34,8 @@ abstract class SDKBindModule {
|
|||||||
@Binds
|
@Binds
|
||||||
@Singleton
|
@Singleton
|
||||||
abstract fun bindMapService(impl: MapServiceImpl): MapService
|
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
|
import org.db3.airmq.sdk.map.domain.MapItem
|
||||||
|
|
||||||
interface MapService {
|
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 android.util.Log
|
||||||
import com.apollographql.apollo.ApolloClient
|
import com.apollographql.apollo.ApolloClient
|
||||||
|
import com.apollographql.apollo.api.Optional
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.db3.airmq.sdk.MapMarkersQuery
|
import org.db3.airmq.sdk.MapMarkersQuery
|
||||||
import org.db3.airmq.sdk.map.domain.MapItem
|
import org.db3.airmq.sdk.map.domain.MapItem
|
||||||
@@ -10,10 +11,19 @@ class MapServiceImpl @Inject constructor(
|
|||||||
private val apolloClient: ApolloClient,
|
private val apolloClient: ApolloClient,
|
||||||
private val mapper: ApolloMapItemMapper
|
private val mapper: ApolloMapItemMapper
|
||||||
) : MapService {
|
) : MapService {
|
||||||
override suspend fun fetchMapItems(): List<MapItem> {
|
override suspend fun fetchMapItems(showOfflineDevices: Boolean): List<MapItem> {
|
||||||
Log.d(TAG, "Executing MapMarkers Apollo query")
|
Log.d(TAG, "Executing MapMarkers Apollo query")
|
||||||
|
val isOnlineFilter: Optional<Boolean?> = if (showOfflineDevices) {
|
||||||
|
Optional.Absent
|
||||||
|
} else {
|
||||||
|
Optional.Present(true)
|
||||||
|
}
|
||||||
val response = apolloClient
|
val response = apolloClient
|
||||||
.query(MapMarkersQuery())
|
.query(
|
||||||
|
MapMarkersQuery(
|
||||||
|
isOnline = isOnlineFilter
|
||||||
|
)
|
||||||
|
)
|
||||||
.execute()
|
.execute()
|
||||||
|
|
||||||
response.errors?.firstOrNull()?.let { gqlError ->
|
response.errors?.firstOrNull()?.let { gqlError ->
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package org.db3.airmq.sdk.settings
|
package org.db3.airmq.sdk.settings
|
||||||
|
|
||||||
import org.db3.airmq.sdk.settings.model.Settings
|
|
||||||
|
|
||||||
interface SettingsService {
|
interface SettingsService {
|
||||||
suspend fun fetchSettings(): Settings
|
suspend fun getCity(): String?
|
||||||
suspend fun updateSettings(settings: Settings): Result<Settings>
|
suspend fun setCity(city: String?): Result<Unit>
|
||||||
suspend fun setAdvancedEnabled(enabled: Boolean): Result<Unit>
|
suspend fun getOfflineDevicesVisible(): Boolean
|
||||||
suspend fun setOfflineDevicesVisible(visible: Boolean): Result<Unit>
|
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