From 0d11e450acaaaca345f705756b593e621721edd3 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Thu, 8 Jun 2023 22:36:24 +0200 Subject: [PATCH] if location is not available, keep last map position across app restarts addresses #191 --- .../vonforst/evmap/fragment/MapFragment.kt | 11 +++- .../evmap/storage/PreferenceDataSource.kt | 51 +++++++++++++------ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index b1c75971..f295b18d 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -1038,9 +1038,12 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac positionSet = true } if (!positionSet) { - // center the camera on Europe + // use position saved in preferences, fall back to default (Europe) val cameraUpdate = - map.cameraUpdateFactory.newLatLngZoom(LatLng(50.113388, 9.252536), 3.5f) + map.cameraUpdateFactory.newLatLngZoom( + prefs.currentMapLocation, + prefs.currentMapZoom + ) map.moveCamera(cameraUpdate) } @@ -1378,6 +1381,10 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac override fun onPause() { super.onPause() removeLocationUpdates() + vm.mapPosition.value?.let { + prefs.currentMapLocation = it.bounds.center + prefs.currentMapZoom = it.zoom + } } override fun onDestroy() { diff --git a/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt b/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt index d593c53f..93308b23 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt @@ -1,6 +1,8 @@ package net.vonforst.evmap.storage import android.content.Context +import android.content.SharedPreferences +import android.content.SharedPreferences.Editor import androidx.preference.PreferenceManager import com.car2go.maps.AnyMap import com.car2go.maps.model.LatLng @@ -224,21 +226,9 @@ class PreferenceDataSource(val context: Context) { } var placeSearchResultAndroidAuto: LatLng? - get() = if (sp.contains("place_search_result_android_auto_lat")) { - LatLng( - Double.fromBits(sp.getLong("place_search_result_android_auto_lat", 0L)), - Double.fromBits(sp.getLong("place_search_result_android_auto_lng", 0L)) - ) - } else null + get() = sp.getLatLng("place_search_result_android_auto") set(value) { - if (value == null) { - sp.edit().remove("place_search_result_android_auto_lat") - .remove("place_search_result_android_auto_lng").apply() - } else { - sp.edit().putLong("place_search_result_android_auto_lat", value.latitude.toBits()) - .putLong("place_search_result_android_auto_lng", value.longitude.toBits()) - .apply() - } + sp.edit().putLatLng("place_search_result_android_auto", value).apply() } var placeSearchResultAndroidAutoName: String? @@ -264,4 +254,35 @@ class PreferenceDataSource(val context: Context) { val mapScale: String get() = sp.getString("map_scale", null) ?: "both" -} \ No newline at end of file + + var currentMapLocation: LatLng + get() = sp.getLatLng("current_map_location") ?: LatLng(50.113388, 9.252536) + set(value) { + sp.edit().putLatLng("current_map_location", value).apply() + } + + var currentMapZoom: Float + get() = sp.getFloat("current_map_zoom", 3.5f) + set(value) { + sp.edit().putFloat("current_map_zoom", value).apply() + } +} + +fun SharedPreferences.getLatLng(key: String): LatLng? = + if (contains("${key}_lat") && contains("${key}_lng")) { + LatLng( + Double.fromBits(getLong("${key}_lat", 0L)), + Double.fromBits(getLong("${key}_lng", 0L)) + ) + } else null + +fun Editor.putLatLng(key: String, value: LatLng?): Editor { + if (value == null) { + remove("${key}_lat") + remove("${key}_lng") + } else { + putLong("${key}_lat", value.latitude.toBits()) + putLong("${key}_lng", value.longitude.toBits()) + } + return this +}