From bd2951c845522d53f72d1cc99e47487ec35ffa5d Mon Sep 17 00:00:00 2001 From: PWRxPSYCHO Date: Wed, 24 Aug 2022 11:08:39 -0400 Subject: [PATCH] Setup switching of map source --- .../com/geeksville/mesh/ui/MapFragment.kt | 97 ++++++++++++------- 1 file changed, 61 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt index 753c4f1b0..9e650c2f2 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt @@ -2,6 +2,7 @@ package com.geeksville.mesh.ui import android.content.Context +import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -32,6 +33,7 @@ class MapFragment : ScreenFragment("Map"), Logging { private lateinit var map: MapView private lateinit var mapController: IMapController + private lateinit var mPrefs: SharedPreferences private val model: UIViewModel by activityViewModels() @@ -40,13 +42,46 @@ class MapFragment : ScreenFragment("Map"), Logging { private val defaultZoomLevel = 6.0 private val defaultZoomSpeed = 3000L private val defaultMinZoom = 3.0 + private val prefsName = "org.andnav.osm.prefs" + private val prefsZoomLevelDouble = "prefsZoomLevelDouble" + private val prefsTileSource = "prefsTileSource" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - return inflater.inflate(R.layout.map_view, container, false) + map = MapView(inflater.context) + map.setDestroyMode(false) + map.tag = "mapView" + return map + } + + override fun onViewCreated(viewIn: View, savedInstanceState: Bundle?) { + super.onViewCreated(viewIn, savedInstanceState) + Configuration.getInstance().userAgentValue = + BuildConfig.APPLICATION_ID // Required to get online tiles + + mPrefs = context!!.getSharedPreferences(prefsName, Context.MODE_PRIVATE) + + addCopyright() // Copyright is required for certain map sources + setupMapProperties() + loadOnlineTileSourceBase() + mapController = map.controller + val point = GeoPoint(defaultLat, defaultLong) //White House Coordinates, Washington DC + mapController.animateTo(point, defaultZoomLevel, defaultZoomSpeed) + if (view != null) { + model.nodeDB.nodes.value?.let { nodes -> + onNodesChanged(nodes.values) + } + + zoomToNodes(mapController) + // Any times nodes change update our map + model.nodeDB.nodes.observe(viewLifecycleOwner) { nodes -> + onNodesChanged(nodes.values) + } + + } } private fun onNodesChanged(nodes: Collection) { @@ -71,56 +106,32 @@ class MapFragment : ScreenFragment("Map"), Logging { requireActivity(), R.drawable.ic_twotone_person_pin_24 ) - map.overlays.add(marker) map.invalidate() + map.overlays.add(marker) } f } } - override fun onViewCreated(viewIn: View, savedInstanceState: Bundle?) { - super.onViewCreated(viewIn, savedInstanceState) - Configuration.getInstance().userAgentValue = - BuildConfig.APPLICATION_ID // Required to get online tiles - - map = viewIn.findViewById(R.id.map) as MapView - - /** - * Copyright layer required - */ - //////////////////////////////////////////////////////////// + /** + * Adds copyright to map depending on what source is showing + */ + private fun addCopyright() { val copyrightNotice: String = map.tileProvider.tileSource.copyrightNotice val copyrightOverlay = CopyrightOverlay(context) copyrightOverlay.setCopyrightNotice(copyrightNotice) map.overlays.add(copyrightOverlay) - /////////////////////////////////////////////////////////// - - setupMapProperties() - if (view != null) { - model.nodeDB.nodes.value?.let { nodes -> - onNodesChanged(nodes.values) - } - - zoomToNodes(mapController) - // Any times nodes change update our map - model.nodeDB.nodes.observe(viewLifecycleOwner) { nodes -> - onNodesChanged(nodes.values) - } - - } - - } private fun setupMapProperties() { if (this::map.isInitialized) { - map.minZoomLevel = defaultMinZoom + map.isTilesScaledToDpi = + true // scales the map tiles to the display density of the + map.minZoomLevel = + defaultMinZoom // sets the minimum zoom level (the furthest out you can zoom) map.setMultiTouchControls(true) // Sets gesture controls to true map.zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER) // Disables default +/- button for zooming - mapController = map.controller - val point = GeoPoint(defaultLat, defaultLong) //White House Coordinates, Washington DC - mapController.animateTo(point, defaultZoomLevel, defaultZoomSpeed) } } @@ -168,17 +179,31 @@ class MapFragment : ScreenFragment("Map"), Logging { } override fun onPause() { + val edit = mPrefs.edit() + edit.putString(prefsTileSource, loadOnlineTileSourceBase().name()) + edit.putFloat(prefsZoomLevelDouble, map.zoomLevelDouble.toFloat()) + edit.commit() + map.onPause() super.onPause() } override fun onResume() { super.onResume() - map.onResume() + val tileSourceName = mPrefs.getString( + prefsTileSource, + TileSourceFactory.DEFAULT_TILE_SOURCE.name() + ) + try { + val tileSource = TileSourceFactory.getTileSource(tileSourceName) + map.setTileSource(tileSource) + } catch (e: IllegalArgumentException) { + map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE) + } } override fun onDestroy() { - super.onDestroy() + super.onDestroyView() map.onDetach() } }