diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt index edef3c66c..0f4d3fc1a 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt @@ -17,7 +17,7 @@ package com.geeksville.mesh.ui.map -import com.geeksville.mesh.android.prefs.UiPrefs +import com.geeksville.mesh.android.prefs.MapPrefs import com.geeksville.mesh.database.NodeRepository import com.geeksville.mesh.database.PacketRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -27,14 +27,14 @@ import javax.inject.Inject class MapViewModel @Inject constructor( - uiPrefs: UiPrefs, + mapPrefs: MapPrefs, packetRepository: PacketRepository, nodeRepository: NodeRepository, -) : BaseMapViewModel(uiPrefs, nodeRepository, packetRepository) { +) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository) { var mapStyleId: Int - get() = uiPrefs.mapStyle + get() = mapPrefs.mapStyle set(value) { - uiPrefs.mapStyle = value + mapPrefs.mapStyle = value } } diff --git a/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt b/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt index 307dfd5ce..ff6ce2f30 100644 --- a/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt +++ b/app/src/google/java/com/geeksville/mesh/MeshUtilApplication.kt @@ -18,7 +18,6 @@ package com.geeksville.mesh import android.os.Debug -import com.geeksville.mesh.android.AppPrefs import com.geeksville.mesh.android.BuildUtils.isEmulator import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.prefs.AnalyticsPrefs @@ -41,8 +40,7 @@ class MeshUtilApplication : GeeksvilleApplication() { // leave off when running in the debugger if (!isEmulator && (!BuildConfig.DEBUG || !Debug.isDebuggerConnected())) { val crashlytics = FirebaseCrashlytics.getInstance() - val pref = AppPrefs(this) - crashlytics.setUserId(pref.getInstallId()) // be able to group all bugs per anonymous user + crashlytics.setUserId(analyticsPrefs.installId) // be able to group all bugs per anonymous user fun sendCrashReports() { if (isAnalyticsAllowed) { diff --git a/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt b/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt index b8456e377..f8976f556 100644 --- a/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt +++ b/app/src/google/java/com/geeksville/mesh/analytics/FirebaseAnalytics.kt @@ -17,9 +17,7 @@ package com.geeksville.mesh.analytics -import android.content.Context import android.os.Bundle -import com.geeksville.mesh.android.AppPrefs import com.geeksville.mesh.android.Logging import com.google.firebase.Firebase import com.google.firebase.analytics.FirebaseAnalytics @@ -36,16 +34,11 @@ class DataPair(val name: String, valueIn: Any?) { } /** Implement our analytics API using Firebase Analytics */ -class FirebaseAnalytics(context: Context) : +class FirebaseAnalytics(installId: String) : AnalyticsProvider, Logging { - val t = Firebase.analytics - - init { - val pref = AppPrefs(context) - t.setUserId(pref.getInstallId()) - } + val t = Firebase.analytics.apply { setUserId(installId) } override fun setEnabled(on: Boolean) { t.setAnalyticsCollectionEnabled(on) diff --git a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt index c63c09bc0..c183b3384 100644 --- a/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt +++ b/app/src/google/java/com/geeksville/mesh/android/GeeksvilleApplication.kt @@ -133,7 +133,7 @@ abstract class GeeksvilleApplication : override fun onCreate() { super.onCreate() - val firebaseAnalytics = FirebaseAnalytics(this) + val firebaseAnalytics = FirebaseAnalytics(analyticsPrefs.installId) analytics = firebaseAnalytics // Set analytics per prefs diff --git a/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsModule.kt b/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsModule.kt new file mode 100644 index 000000000..56328c08a --- /dev/null +++ b/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsModule.kt @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.geeksville.mesh.android.prefs + +import android.content.Context +import android.content.SharedPreferences +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Qualifier +import javax.inject.Singleton + +// Pref store qualifiers are private to prevent prefs stores from being injected directly. +// Consuming code should always inject one of the prefs repositories. + +@Qualifier +@Retention(AnnotationRetention.BINARY) +private annotation class GoogleMapsSharedPreferences + +@InstallIn(SingletonComponent::class) +@Module +object GoogleMapsModule { + + @Provides + @Singleton + @GoogleMapsSharedPreferences + fun provideGoogleMapsSharedPreferences(@ApplicationContext context: Context): SharedPreferences = + context.getSharedPreferences("google_maps_prefs", Context.MODE_PRIVATE) + + @Provides + @Singleton + fun provideGoogleMapsPrefs(@GoogleMapsSharedPreferences sharedPreferences: SharedPreferences): GoogleMapsPrefs = + GoogleMapsPrefsImpl(sharedPreferences) +} diff --git a/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsPrefs.kt b/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsPrefs.kt new file mode 100644 index 000000000..3365f8129 --- /dev/null +++ b/app/src/google/java/com/geeksville/mesh/android/prefs/GoogleMapsPrefs.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.geeksville.mesh.android.prefs + +import android.content.SharedPreferences +import com.google.maps.android.compose.MapType + +/** Interface for prefs specific to Google Maps. For general map prefs, see MapPrefs. */ +interface GoogleMapsPrefs { + var selectedGoogleMapType: String? + var selectedCustomTileUrl: String? +} + +class GoogleMapsPrefsImpl(prefs: SharedPreferences) : GoogleMapsPrefs { + override var selectedGoogleMapType: String? by + NullableStringPrefDelegate(prefs, "selected_google_map_type", MapType.NORMAL.name) + override var selectedCustomTileUrl: String? by NullableStringPrefDelegate(prefs, "selected_custom_tile_url", null) +} diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt b/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt index 56a3ea7dc..2fa3f1337 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt @@ -18,13 +18,12 @@ package com.geeksville.mesh.ui.map import android.app.Application -import android.content.SharedPreferences import android.net.Uri -import androidx.core.content.edit import androidx.lifecycle.viewModelScope import com.geeksville.mesh.ConfigProtos import com.geeksville.mesh.android.BuildUtils.debug -import com.geeksville.mesh.android.prefs.UiPrefs +import com.geeksville.mesh.android.prefs.GoogleMapsPrefs +import com.geeksville.mesh.android.prefs.MapPrefs import com.geeksville.mesh.database.NodeRepository import com.geeksville.mesh.database.PacketRepository import com.geeksville.mesh.repository.datastore.RadioConfigRepository @@ -61,8 +60,6 @@ import java.util.UUID import javax.inject.Inject private const val TILE_SIZE = 256 -private const val PREF_SELECTED_GOOGLE_MAP_TYPE = "selected_google_map_type" -private const val PREF_SELECTED_CUSTOM_TILE_URL = "selected_custom_tile_url" @Serializable data class MapCameraPosition( @@ -79,13 +76,13 @@ class MapViewModel @Inject constructor( private val application: Application, - uiPrefs: UiPrefs, - private val preferences: SharedPreferences, + mapPrefs: MapPrefs, + private val googleMapsPrefs: GoogleMapsPrefs, nodeRepository: NodeRepository, packetRepository: PacketRepository, radioConfigRepository: RadioConfigRepository, private val customTileProviderRepository: CustomTileProviderRepository, -) : BaseMapViewModel(uiPrefs, nodeRepository, packetRepository) { +) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository) { private val _errorFlow = MutableSharedFlow() val errorFlow: SharedFlow = _errorFlow.asSharedFlow() @@ -187,7 +184,7 @@ constructor( if (configToRemove != null && _selectedCustomTileProviderUrl.value == configToRemove.urlTemplate) { _selectedCustomTileProviderUrl.value = null // Also clear from prefs - preferences.edit { remove(PREF_SELECTED_CUSTOM_TILE_URL) } + googleMapsPrefs.selectedCustomTileUrl = null } } } @@ -197,26 +194,24 @@ constructor( if (!isValidTileUrlTemplate(config.urlTemplate)) { Timber.tag("MapViewModel").w("Attempted to select invalid URL template: ${config.urlTemplate}") _selectedCustomTileProviderUrl.value = null - preferences.edit { remove(PREF_SELECTED_CUSTOM_TILE_URL) } + googleMapsPrefs.selectedCustomTileUrl = null return } _selectedCustomTileProviderUrl.value = config.urlTemplate _selectedGoogleMapType.value = MapType.NORMAL // Reset to a default or keep last? For now, reset. - preferences.edit { - putString(PREF_SELECTED_CUSTOM_TILE_URL, config.urlTemplate).remove(PREF_SELECTED_GOOGLE_MAP_TYPE) - } + googleMapsPrefs.selectedCustomTileUrl = config.urlTemplate + googleMapsPrefs.selectedGoogleMapType = null } else { _selectedCustomTileProviderUrl.value = null - preferences.edit { remove(PREF_SELECTED_CUSTOM_TILE_URL) } + googleMapsPrefs.selectedCustomTileUrl = null } } fun setSelectedGoogleMapType(mapType: MapType) { _selectedGoogleMapType.value = mapType _selectedCustomTileProviderUrl.value = null // Clear custom selection - preferences.edit { - putString(PREF_SELECTED_GOOGLE_MAP_TYPE, mapType.name).remove(PREF_SELECTED_CUSTOM_TILE_URL) - } + googleMapsPrefs.selectedGoogleMapType = mapType.name + googleMapsPrefs.selectedCustomTileUrl = null } fun createUrlTileProvider(urlString: String): TileProvider? { @@ -254,7 +249,7 @@ constructor( } private fun loadPersistedMapType() { - val savedCustomUrl = preferences.getString(PREF_SELECTED_CUSTOM_TILE_URL, null) + val savedCustomUrl = googleMapsPrefs.selectedCustomTileUrl if (savedCustomUrl != null) { // Check if this custom provider still exists if ( @@ -265,18 +260,18 @@ constructor( _selectedGoogleMapType.value = MapType.NORMAL // Default, as custom is active } else { // The saved custom URL is no longer valid or doesn't exist, remove preference - preferences.edit { remove(PREF_SELECTED_CUSTOM_TILE_URL) } + googleMapsPrefs.selectedCustomTileUrl = null // Fallback to default Google Map type _selectedGoogleMapType.value = MapType.NORMAL } } else { - val savedGoogleMapTypeName = preferences.getString(PREF_SELECTED_GOOGLE_MAP_TYPE, MapType.NORMAL.name) + val savedGoogleMapTypeName = googleMapsPrefs.selectedGoogleMapType try { _selectedGoogleMapType.value = MapType.valueOf(savedGoogleMapTypeName ?: MapType.NORMAL.name) } catch (e: IllegalArgumentException) { Timber.e(e, "Invalid saved Google Map type: $savedGoogleMapTypeName") _selectedGoogleMapType.value = MapType.NORMAL // Fallback in case of invalid stored name - preferences.edit { remove(PREF_SELECTED_GOOGLE_MAP_TYPE) } + googleMapsPrefs.selectedGoogleMapType = null } } } diff --git a/app/src/main/java/com/geeksville/mesh/ApplicationModule.kt b/app/src/main/java/com/geeksville/mesh/ApplicationModule.kt index 720d15b4d..2954c562a 100644 --- a/app/src/main/java/com/geeksville/mesh/ApplicationModule.kt +++ b/app/src/main/java/com/geeksville/mesh/ApplicationModule.kt @@ -18,8 +18,6 @@ package com.geeksville.mesh import android.app.Application -import android.content.Context -import android.content.SharedPreferences import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner @@ -32,9 +30,6 @@ import dagger.hilt.components.SingletonComponent @InstallIn(SingletonComponent::class) @Module object ApplicationModule { - @Provides - fun provideSharedPreferences(application: Application): SharedPreferences = - application.getSharedPreferences("ui-prefs", Context.MODE_PRIVATE) @Provides fun provideProcessLifecycleOwner(): LifecycleOwner = ProcessLifecycleOwner.get() diff --git a/app/src/main/java/com/geeksville/mesh/android/AppPrefs.kt b/app/src/main/java/com/geeksville/mesh/android/AppPrefs.kt deleted file mode 100644 index 3824f29cc..000000000 --- a/app/src/main/java/com/geeksville/mesh/android/AppPrefs.kt +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2025 Meshtastic LLC - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.geeksville.mesh.android - -import android.content.Context -import android.content.SharedPreferences -import java.util.UUID -import kotlin.reflect.KProperty - -/** - * Created by kevinh on 1/4/15. - */ - - -/** - * A delegate for "foo by FloatPref" - */ -class FloatPref { - fun get(thisRef: AppPrefs, prop: KProperty): Float = thisRef.getPrefs().getFloat(thisRef.makeName(prop.name), java.lang.Float.MIN_VALUE) - - fun set(thisRef: AppPrefs, prop: KProperty, value: Float) { - thisRef.setPrefs { e -> e.putFloat(thisRef.makeName(prop.name), value)} - } -} - -/** - * A delegate for "foo by StringPref" - */ -class StringPref(val default: String) { - fun get(thisRef: AppPrefs, prop: KProperty): String = thisRef.getPrefs().getString(thisRef.makeName(prop.name), default)!! - - fun set(thisRef: AppPrefs, prop: KProperty, value: String) { - thisRef.setPrefs { e -> - e.putString(thisRef.makeName(prop.name), value) - } - } -} - -/** - * A mixin for accessing android prefs for the app - */ -public open class AppPrefs(val context: Context) { - - companion object { - private val baseName = "appPrefs_" - } - - fun makeName(s: String) = baseName + s - - fun getPrefs() = context.getSharedPreferences("prefs", Context.MODE_PRIVATE) - - fun setPrefs(body: (SharedPreferences.Editor) -> Unit) { - val e = getPrefs().edit() - body(e) - e.commit() - } - - fun incPref(name: String) { - setPrefs { e -> - e.putInt(name, 1 + getPrefs().getInt(name, 0)) - } - } - - fun removePref(name: String) { - setPrefs { e -> - e.remove(name) - } - } - - fun putPref(name: String, b: Boolean) { - setPrefs { e -> - e.putBoolean(name, b) - } - } - - fun putPref(name: String, b: Float) { - setPrefs { e -> - e.putFloat(name, b) - } - } - - fun putPref(name: String, b: Int) { - setPrefs { e -> - e.putInt(name, b) - } - } - - fun putPref(name: String, b: Set) { - setPrefs { e -> - e.putStringSet(name, b) - } - } - - fun putPref(name: String, b: String) { - setPrefs { e -> - e.putString(name, b) - } - } - - /** - * Return a persistent installation ID - */ - fun getInstallId(): String { - var r = getPrefs().getString(makeName("installId"), "")!! - if(r == "") { - r = UUID.randomUUID().toString() - putPref(makeName("installId"), r) - } - - return r - } -} \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/android/prefs/AnalyticsPrefs.kt b/app/src/main/java/com/geeksville/mesh/android/prefs/AnalyticsPrefs.kt index a0bc2dda9..445c66cfc 100644 --- a/app/src/main/java/com/geeksville/mesh/android/prefs/AnalyticsPrefs.kt +++ b/app/src/main/java/com/geeksville/mesh/android/prefs/AnalyticsPrefs.kt @@ -18,11 +18,19 @@ package com.geeksville.mesh.android.prefs import android.content.SharedPreferences +import java.util.UUID interface AnalyticsPrefs { var analyticsAllowed: Boolean + val installId: String } -class AnalyticsPrefsImpl(prefs: SharedPreferences) : AnalyticsPrefs { - override var analyticsAllowed: Boolean by PrefDelegate(prefs, "allowed", true) +// Having an additional app prefs store is maintaining the existing behavior. +class AnalyticsPrefsImpl(analyticsPrefs: SharedPreferences, appPrefs: SharedPreferences) : AnalyticsPrefs { + override var analyticsAllowed: Boolean by PrefDelegate(analyticsPrefs, "allowed", true) + + private var _installId: String? by NullableStringPrefDelegate(appPrefs, "appPrefs_install_id", null) + + override val installId: String + get() = _installId ?: UUID.randomUUID().toString().also { _installId = it } } diff --git a/app/src/main/java/com/geeksville/mesh/android/prefs/MapPrefs.kt b/app/src/main/java/com/geeksville/mesh/android/prefs/MapPrefs.kt new file mode 100644 index 000000000..f095639bd --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/android/prefs/MapPrefs.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.geeksville.mesh.android.prefs + +import android.content.SharedPreferences + +/** Interface for general map prefs. For Google-specific prefs, see GoogleMapsPrefs. */ +interface MapPrefs { + var mapStyle: Int + var showOnlyFavorites: Boolean + var showWaypointsOnMap: Boolean + var showPrecisionCircleOnMap: Boolean +} + +class MapPrefsImpl(prefs: SharedPreferences) : MapPrefs { + override var mapStyle: Int by PrefDelegate(prefs, "map_style_id", 0) + override var showOnlyFavorites: Boolean by PrefDelegate(prefs, "show_only_favorites", false) + override var showWaypointsOnMap: Boolean by PrefDelegate(prefs, "show_waypoints", true) + override var showPrecisionCircleOnMap: Boolean by PrefDelegate(prefs, "show_precision_circle", true) +} diff --git a/app/src/main/java/com/geeksville/mesh/android/prefs/PrefsModule.kt b/app/src/main/java/com/geeksville/mesh/android/prefs/PrefsModule.kt index 8fcd0d62b..e4eff087d 100644 --- a/app/src/main/java/com/geeksville/mesh/android/prefs/PrefsModule.kt +++ b/app/src/main/java/com/geeksville/mesh/android/prefs/PrefsModule.kt @@ -34,10 +34,18 @@ import javax.inject.Singleton @Retention(AnnotationRetention.BINARY) private annotation class AnalyticsSharedPreferences +@Qualifier +@Retention(AnnotationRetention.BINARY) +private annotation class AppSharedPreferences + @Qualifier @Retention(AnnotationRetention.BINARY) private annotation class CustomEmojiSharedPreferences +@Qualifier +@Retention(AnnotationRetention.BINARY) +private annotation class MapSharedPreferences + @Qualifier @Retention(AnnotationRetention.BINARY) private annotation class MapConsentSharedPreferences @@ -69,12 +77,24 @@ object PrefsModule { fun provideAnalyticsSharedPreferences(@ApplicationContext context: Context): SharedPreferences = context.getSharedPreferences("analytics-prefs", Context.MODE_PRIVATE) + @Provides + @Singleton + @AppSharedPreferences + fun provideAppSharedPreferences(@ApplicationContext context: Context): SharedPreferences = + context.getSharedPreferences("prefs", Context.MODE_PRIVATE) + @Provides @Singleton @CustomEmojiSharedPreferences fun provideCustomEmojiSharedPreferences(@ApplicationContext context: Context): SharedPreferences = context.getSharedPreferences("org.geeksville.emoji.prefs", Context.MODE_PRIVATE) + @Provides + @Singleton + @MapSharedPreferences + fun provideMapSharedPreferences(@ApplicationContext context: Context): SharedPreferences = + context.getSharedPreferences("map_prefs", Context.MODE_PRIVATE) + @Provides @Singleton @MapConsentSharedPreferences @@ -107,14 +127,21 @@ object PrefsModule { @Provides @Singleton - fun provideAnalyticsPrefs(@AnalyticsSharedPreferences sharedPreferences: SharedPreferences): AnalyticsPrefs = - AnalyticsPrefsImpl(sharedPreferences) + fun provideAnalyticsPrefs( + @AnalyticsSharedPreferences analyticsPreferences: SharedPreferences, + @AppSharedPreferences appPreferences: SharedPreferences, + ): AnalyticsPrefs = AnalyticsPrefsImpl(analyticsPreferences, appPreferences) @Provides @Singleton fun provideCustomEmojiPrefs(@CustomEmojiSharedPreferences sharedPreferences: SharedPreferences): CustomEmojiPrefs = CustomEmojiPrefsImpl(sharedPreferences) + @Provides + @Singleton + fun provideMapPrefs(@MapSharedPreferences sharedPreferences: SharedPreferences): MapPrefs = + MapPrefsImpl(sharedPreferences) + @Provides @Singleton fun provideMapConsentPrefs(@MapConsentSharedPreferences sharedPreferences: SharedPreferences): MapConsentPrefs = diff --git a/app/src/main/java/com/geeksville/mesh/android/prefs/UiPrefs.kt b/app/src/main/java/com/geeksville/mesh/android/prefs/UiPrefs.kt index 52d4328b7..74e81c183 100644 --- a/app/src/main/java/com/geeksville/mesh/android/prefs/UiPrefs.kt +++ b/app/src/main/java/com/geeksville/mesh/android/prefs/UiPrefs.kt @@ -36,15 +36,6 @@ interface UiPrefs { var showIgnored: Boolean var showQuickChat: Boolean - // region Map prefs - - var showOnlyFavorites: Boolean - var showWaypointsOnMap: Boolean - var showPrecisionCircleOnMap: Boolean - var mapStyle: Int - - // endregion - fun shouldProvideNodeLocation(nodeNum: Int?): Boolean fun setShouldProvideNodeLocation(nodeNum: Int?, value: Boolean) @@ -62,10 +53,6 @@ class UiPrefsImpl(private val prefs: SharedPreferences) : UiPrefs { override var onlyDirect: Boolean by PrefDelegate(prefs, "only-direct", false) override var showIgnored: Boolean by PrefDelegate(prefs, "show-ignored", false) override var showQuickChat: Boolean by PrefDelegate(prefs, "show-quick-chat", false) - override var showOnlyFavorites: Boolean by PrefDelegate(prefs, "only-favorites", false) - override var showWaypointsOnMap: Boolean by PrefDelegate(prefs, "show-waypoints-on-map", true) - override var showPrecisionCircleOnMap: Boolean by PrefDelegate(prefs, "show-precision-circle-on-map", true) - override var mapStyle: Int by PrefDelegate(prefs, "map_style_id", 0) override fun shouldProvideNodeLocation(nodeNum: Int?): Boolean = prefs.getBoolean(provideLocationKey(nodeNum), false) diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt index 083e21179..560691acc 100644 --- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt @@ -37,7 +37,7 @@ import com.geeksville.mesh.Portnums.PortNum import com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.android.Logging -import com.geeksville.mesh.android.prefs.UiPrefs +import com.geeksville.mesh.android.prefs.MapPrefs import com.geeksville.mesh.database.MeshLogRepository import com.geeksville.mesh.database.entity.FirmwareRelease import com.geeksville.mesh.database.entity.MeshLog @@ -203,7 +203,7 @@ constructor( private val radioConfigRepository: RadioConfigRepository, private val deviceHardwareRepository: DeviceHardwareRepository, private val firmwareReleaseRepository: FirmwareReleaseRepository, - private val uiPrefs: UiPrefs, + private val mapPrefs: MapPrefs, ) : ViewModel(), Logging { private val destNum = savedStateHandle.toRoute().destNum @@ -233,7 +233,7 @@ constructor( fun getUser(nodeNum: Int) = radioConfigRepository.getUser(nodeNum) val tileSource - get() = CustomTileSource.getTileSource(uiPrefs.mapStyle) + get() = CustomTileSource.getTileSource(mapPrefs.mapStyle) fun deleteLog(uuid: String) = viewModelScope.launch(dispatchers.io) { meshLogRepository.deleteLog(uuid) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt index 08a122b2e..4de3fe2e3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt @@ -19,7 +19,7 @@ package com.geeksville.mesh.ui.map import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.geeksville.mesh.android.prefs.UiPrefs +import com.geeksville.mesh.android.prefs.MapPrefs import com.geeksville.mesh.database.NodeRepository import com.geeksville.mesh.database.PacketRepository import com.geeksville.mesh.database.entity.Packet @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.stateIn @Suppress("TooManyFunctions") abstract class BaseMapViewModel( - protected val uiPrefs: UiPrefs, + protected val mapPrefs: MapPrefs, nodeRepository: NodeRepository, packetRepository: PacketRepository, ) : ViewModel() { @@ -61,27 +61,27 @@ abstract class BaseMapViewModel( } .stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), initialValue = emptyMap()) - private val showOnlyFavorites = MutableStateFlow(uiPrefs.showOnlyFavorites) + private val showOnlyFavorites = MutableStateFlow(mapPrefs.showOnlyFavorites) - private val showWaypointsOnMap = MutableStateFlow(uiPrefs.showWaypointsOnMap) + private val showWaypointsOnMap = MutableStateFlow(mapPrefs.showWaypointsOnMap) - private val showPrecisionCircleOnMap = MutableStateFlow(uiPrefs.showPrecisionCircleOnMap) + private val showPrecisionCircleOnMap = MutableStateFlow(mapPrefs.showPrecisionCircleOnMap) fun toggleOnlyFavorites() { val current = showOnlyFavorites.value - uiPrefs.showOnlyFavorites = !current + mapPrefs.showOnlyFavorites = !current showOnlyFavorites.value = !current } fun toggleShowWaypointsOnMap() { val current = showWaypointsOnMap.value - uiPrefs.showWaypointsOnMap = !current + mapPrefs.showWaypointsOnMap = !current showWaypointsOnMap.value = !current } fun toggleShowPrecisionCircleOnMap() { val current = showPrecisionCircleOnMap.value - uiPrefs.showPrecisionCircleOnMap = !current + mapPrefs.showPrecisionCircleOnMap = !current showPrecisionCircleOnMap.value = !current }