From 0e2bce2fda9711aaeaa536d254911b7651cbea6a Mon Sep 17 00:00:00 2001 From: Isidro Henoch Date: Sun, 16 Jan 2022 21:34:22 -0600 Subject: Fixes the zoom levels issue when changing map tiles --- .../main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'androidApp') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt index 90ee36a..e96945e 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt @@ -101,6 +101,10 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment unitsViewModel.mapLayer.observe(viewLifecycleOwner) { layer -> Log.d("UnitMapFragment", "Loading layer!") unitsMapFragment.updateTile(layer) + val selectedUnit = unitsViewModel.selectedUnit.value + selectedUnit?.let { + unitsMapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) + } binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } -- cgit v1.2.3 From bce64ef4f702c351d349881704d92f724e90239f Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Sun, 16 Jan 2022 23:34:36 -0600 Subject: Fixed initial zoom issue and refactored layers into MapLayer in shared module --- .../TrackerMap/android/map/MapFragment.kt | 24 +++++++++++--------- .../TrackerMap/android/map/UnitMapFragment.kt | 12 +++++----- .../TrackerMap/android/units/UnitsActivity.kt | 16 +++++-------- .../TrackerMap/android/units/UnitsViewModel.kt | 8 +++---- androidApp/src/main/res/values/map_layers.xml | 21 ----------------- .../TrackerMap/client/models/MapLayer.kt | 26 +++++++++++++++++++++- .../mx/trackermap/TrackerMap/utils/MapCalculus.kt | 2 ++ 7 files changed, 57 insertions(+), 52 deletions(-) (limited to 'androidApp') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt index 6a80f95..06d3d97 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt @@ -61,12 +61,12 @@ class MapFragment : GlobeMapFragment() { Log.d("MapFragment", "controlHasStarted") if (tileInfo == null) { + val layer = MapLayer.defaultLayer // Load default map layer - val layer = resources.getStringArray(R.array.maps_streets_tile) - val tmpInfo = RemoteTileInfoNew(layer[0], layer[1].toInt(), layer[2].toInt()) - tileInfo = tileInfoSetCacheDir(layer[0], tmpInfo) + val info = RemoteTileInfoNew(layer.url, layer.minZoom, layer.maxZoom) + tileInfo = tileInfoSetCacheDir(layer.url, info) tileInfo?.let { - setZoomLimits(layer[1].toInt(), layer[2].toInt()) + setZoomLimits(layer.minZoom, layer.maxZoom) } } @@ -84,7 +84,7 @@ class MapFragment : GlobeMapFragment() { val latitude = 23.191 * Math.PI / 180 val longitude = -100.36 * Math.PI / 180 - mapControl.setPositionGeo(latitude, longitude, 0.4) + mapControl.setPositionGeo(longitude, latitude, 0.4) } override fun mapDidStopMoving( @@ -352,13 +352,15 @@ class MapFragment : GlobeMapFragment() { } } - fun updateTile(layer: MapLayer) { + fun updateLayer(layer: MapLayer.Type) { mapControl?.addPostSurfaceRunnable { - val tileInfo = RemoteTileInfoNew(layer.url, layer.minZoom, layer.maxZoom) - this.tileInfo = tileInfoSetCacheDir(layer.url, tileInfo) - this.tileInfo?.let { - loader?.changeTileInfo(it) - setZoomLimits(tileInfo.minZoom, tileInfo.maxZoom) + MapLayer.layers[layer]?.let { + val tileInfo = RemoteTileInfoNew(it.url, it.minZoom, it.maxZoom) + this.tileInfo = tileInfoSetCacheDir(it.url, tileInfo) + this.tileInfo?.let { t -> + loader?.changeTileInfo(t) + setZoomLimits(tileInfo.minZoom, tileInfo.maxZoom) + } } } } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt index e96945e..cb5edc3 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt @@ -15,6 +15,7 @@ import mx.trackermap.TrackerMap.android.shared.MarkerTransformations import mx.trackermap.TrackerMap.android.shared.UnitRenderData import mx.trackermap.TrackerMap.android.units.UnitFragment import mx.trackermap.TrackerMap.android.units.UnitsViewModel +import mx.trackermap.TrackerMap.client.models.MapLayer import mx.trackermap.TrackerMap.client.models.UnitInformation @DelicateCoroutinesApi @@ -55,8 +56,8 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment unitsMapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapFragment unitsMapFragment.markerCallback = unitsViewModel::selectUnitWith - val layer = resources.getStringArray(R.array.maps_streets_tile) - binding.attributionText.text = HtmlCompat.fromHtml(layer[3], 0) + val layer = MapLayer.defaultLayer + binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } private fun setupObservers() { @@ -98,13 +99,14 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment } } - unitsViewModel.mapLayer.observe(viewLifecycleOwner) { layer -> + unitsViewModel.mapLayerType.observe(viewLifecycleOwner) { type -> Log.d("UnitMapFragment", "Loading layer!") - unitsMapFragment.updateTile(layer) + unitsMapFragment.updateLayer(type) val selectedUnit = unitsViewModel.selectedUnit.value selectedUnit?.let { unitsMapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) } + val layer = MapLayer.layers[type]!! binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } @@ -117,7 +119,7 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment Log.d("UnitMapFragment", "removeObservers()") unitsViewModel.units.removeObservers(viewLifecycleOwner) unitsViewModel.selectedUnit.removeObservers(viewLifecycleOwner) - unitsViewModel.mapLayer.removeObservers(viewLifecycleOwner) + unitsViewModel.mapLayerType.removeObservers(viewLifecycleOwner) unitsViewModel.geofences.removeObservers(viewLifecycleOwner) } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt index 1bbcb80..25169fe 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt @@ -91,16 +91,12 @@ class UnitsActivity : AppCompatActivity() { val popOver = PopupMenu(this, view) popOver.menuInflater.inflate(R.menu.map_layers, popOver.menu) popOver.setOnMenuItemClickListener { item -> - val layer = resources.getStringArray( - when (item.itemId) { - R.id.layerStreets -> R.array.maps_streets_tile - R.id.layerSatellite -> R.array.maps_satellite_tile - else -> R.array.maps_streets_tile - } - ) - unitsViewModel.setMapLayer(MapLayer( - layer[0], layer[1].toInt(), layer[2].toInt(), layer[3] - )) + val layer = when (item.itemId) { + R.id.layerStreets -> MapLayer.Type.STREETS + R.id.layerSatellite -> MapLayer.Type.SATELLITE + else -> MapLayer.Type.STREETS + } + unitsViewModel.setMapLayerType(layer) true } popOver.show() diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt index d3060f0..2d2994b 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt @@ -29,14 +29,14 @@ class UnitsViewModel( private var _unitsDisplayMode = MutableLiveData(UnitsDisplayMode.MAP) private var _units = MutableLiveData>() private var _selectedUnit = MutableLiveData() - private var _mapLayer = MutableLiveData() + private var _mapLayerType = MutableLiveData() private var _geofences = MutableLiveData>() val searchQuery: LiveData get() = _searchQuery val unitsDisplayMode: LiveData get() = _unitsDisplayMode val units: LiveData> get() = _units val selectedUnit: LiveData get() = _selectedUnit - val mapLayer: LiveData get() = _mapLayer + val mapLayerType: LiveData get() = _mapLayerType val geofences: LiveData> get() = _geofences init { @@ -85,8 +85,8 @@ class UnitsViewModel( _unitsDisplayMode.postValue(displayMode) } - fun setMapLayer(layer: MapLayer) { - _mapLayer.postValue(layer) + fun setMapLayerType(layer: MapLayer.Type) { + _mapLayerType.postValue(layer) } fun toggleDisplayMode() { diff --git a/androidApp/src/main/res/values/map_layers.xml b/androidApp/src/main/res/values/map_layers.xml index bffceb9..034f3e5 100644 --- a/androidApp/src/main/res/values/map_layers.xml +++ b/androidApp/src/main/res/values/map_layers.xml @@ -2,25 +2,4 @@ Streets Satellite - - - - - - - - - https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png - 0 - 21 - © OpenStreetMap France | © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors - - - - https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x} - 0 - 20 - Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community - - \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt index 64381d9..ff0489e 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt @@ -5,4 +5,28 @@ data class MapLayer( val minZoom: Int, val maxZoom: Int, val attribution: String -) \ No newline at end of file +) { + enum class Type { + STREETS, + SATELLITE + } + + companion object { + val layers = mapOf( + Type.STREETS to MapLayer( + url = "https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png", + minZoom = 1, + maxZoom = 23, + attribution = "© OpenStreetMap France | © OpenStreetMap contributors" + ), + Type.SATELLITE to MapLayer( + url = "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", + minZoom = 1, + maxZoom = 20, + attribution = "Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community" + ) + ) + + val defaultLayer = layers[Type.STREETS]!! + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MapCalculus.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MapCalculus.kt index b1a6444..d4d69fa 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MapCalculus.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MapCalculus.kt @@ -32,6 +32,8 @@ class MapCalculus { 20 -> 533.182395965 21 -> 266.5911979825 22 -> 133.29559899125 + 23 -> 66.647799495625 + 24 -> 33.3238997478125 else -> null } } -- cgit v1.2.3 From 7c90f36e21e6d1400990427b3c4eabd4a83d5e9a Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 00:52:22 -0600 Subject: Switch to list fragment on search and fixed black flash when switching fragments --- .../trackermap/TrackerMap/android/map/MapFragment.kt | 18 +++++++++++------- .../TrackerMap/android/map/UnitMapFragment.kt | 6 ++---- .../TrackerMap/android/units/UnitsActivity.kt | 10 +++++++++- androidApp/src/main/res/layout/unit_map_fragment.xml | 2 +- androidApp/src/main/res/layout/units_activity.xml | 4 ++-- 5 files changed, 25 insertions(+), 15 deletions(-) (limited to 'androidApp') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt index 06d3d97..17fc9d4 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt @@ -1,6 +1,7 @@ package mx.trackermap.TrackerMap.android.map import android.graphics.Bitmap +import android.graphics.Color import android.graphics.Typeface import android.os.Bundle import android.util.Log @@ -48,6 +49,11 @@ class MapFragment : GlobeMapFragment() { return MapDisplayType.Map } + override fun preControlCreated() { + super.preControlCreated() + mapSettings.clearColor = Color.WHITE + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -237,9 +243,11 @@ class MapFragment : GlobeMapFragment() { mbr.expandByFraction(0.1) mapControl?.addPostSurfaceRunnable { - val zoom = mapControl.findHeightToViewBounds(mbr, mbr.middle()) - .coerceAtLeast(mapControl.zoomLimitMin) - mapControl.setPositionGeo(mbr.middle(), zoom) + mapControl?.let { + val zoom = it.findHeightToViewBounds(mbr, mbr.middle()) + .coerceAtLeast(mapControl.zoomLimitMin) + it.setPositionGeo(mbr.middle(), zoom) + } } } } @@ -328,10 +336,7 @@ class MapFragment : GlobeMapFragment() { val lat = latitude * Math.PI / 180 val lon = longitude * Math.PI / 180 // Ensure height is equal or higher than bottom limit - Log.d("MapFragment", "Target: %7.7f".format(height)) - Log.d("MapFragment", "Min: %7.7f".format(mapControl.zoomLimitMin)) val z = height.coerceAtLeast(mapControl.zoomLimitMin) - Log.d("MapFragment", "Final: %7.7f".format(z)) if (animated) { mapControl.animatePositionGeo(lon, lat, z, 0.2) } else { @@ -346,7 +351,6 @@ class MapFragment : GlobeMapFragment() { val cacheDirMap = File(it.cacheDir, cacheDirName) cacheDirMap.mkdir() Log.d("MapFragment", "Cache dir for $url = ${cacheDirMap.absolutePath}") - (tileInfo as? RemoteTileInfoNew)?.cacheDir = cacheDirMap tileInfo } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt index cb5edc3..0658f56 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt @@ -68,8 +68,7 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment unitsMapFragment.display( units.mapNotNull(MarkerTransformations::unitToMarker).toTypedArray(), - isReport = false, - center = unitsViewModel.selectedUnit.value == null + isReport = false ) } @@ -102,8 +101,7 @@ class UnitMapFragment(private val unitsViewModel: UnitsViewModel) : UnitFragment unitsViewModel.mapLayerType.observe(viewLifecycleOwner) { type -> Log.d("UnitMapFragment", "Loading layer!") unitsMapFragment.updateLayer(type) - val selectedUnit = unitsViewModel.selectedUnit.value - selectedUnit?.let { + unitsViewModel.selectedUnit.value?.let { unitsMapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) } val layer = MapLayer.layers[type]!! diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt index 25169fe..d8ced28 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt @@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.TooltipCompat import androidx.core.widget.doAfterTextChanged +import androidx.fragment.app.FragmentTransaction.TRANSIT_FRAGMENT_FADE import androidx.fragment.app.commit import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R @@ -79,7 +80,9 @@ class UnitsActivity : AppCompatActivity() { } binding.searchInput.doAfterTextChanged { Log.d("UnitsActivity", "Search changed to ${it.toString()}") - binding.searchInput + if (unitsViewModel.unitsDisplayMode.value == UnitsViewModel.UnitsDisplayMode.MAP) { + unitsViewModel.setDisplayMode(UnitsViewModel.UnitsDisplayMode.LIST) + } unitsViewModel.search(it.toString()) } binding.searchInputLayout.setEndIconOnClickListener { @@ -150,6 +153,10 @@ class UnitsActivity : AppCompatActivity() { } supportFragmentManager.commit { replace(R.id.displayContainer, newFragment) + if (displayMode == UnitsViewModel.UnitsDisplayMode.LIST) { + addToBackStack(null) + } + setTransition(TRANSIT_FRAGMENT_FADE) } } unitsViewModel.selectedUnit.observe(this) { @@ -159,5 +166,6 @@ class UnitsActivity : AppCompatActivity() { private fun removeObservers() { unitsViewModel.unitsDisplayMode.removeObservers(this) + unitsViewModel.selectedUnit.removeObservers(this) } } \ No newline at end of file diff --git a/androidApp/src/main/res/layout/unit_map_fragment.xml b/androidApp/src/main/res/layout/unit_map_fragment.xml index e2bee95..a86a7e9 100644 --- a/androidApp/src/main/res/layout/unit_map_fragment.xml +++ b/androidApp/src/main/res/layout/unit_map_fragment.xml @@ -15,7 +15,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:name="mx.trackermap.TrackerMap.android.map.MapFragment" - tools:visibility="invisible"/> + tools:visibility="visible"/> - + app:layout_constraintTop_toTopOf="parent"/> Date: Mon, 17 Jan 2022 00:58:01 -0600 Subject: If display mode is list, back button returns to map --- .../mx/trackermap/TrackerMap/android/units/UnitsActivity.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'androidApp') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt index d8ced28..e9b9010 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt @@ -153,9 +153,6 @@ class UnitsActivity : AppCompatActivity() { } supportFragmentManager.commit { replace(R.id.displayContainer, newFragment) - if (displayMode == UnitsViewModel.UnitsDisplayMode.LIST) { - addToBackStack(null) - } setTransition(TRANSIT_FRAGMENT_FADE) } } @@ -168,4 +165,12 @@ class UnitsActivity : AppCompatActivity() { unitsViewModel.unitsDisplayMode.removeObservers(this) unitsViewModel.selectedUnit.removeObservers(this) } + + override fun onBackPressed() { + if (unitsViewModel.unitsDisplayMode.value == UnitsViewModel.UnitsDisplayMode.LIST) { + unitsViewModel.setDisplayMode(UnitsViewModel.UnitsDisplayMode.MAP) + } else { + super.onBackPressed() + } + } } \ No newline at end of file -- cgit v1.2.3