From c3c57a26e62857434830c9b22bb4757edda2b202 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 21:39:33 -0600 Subject: Refactored map fragment into wrapper with an overlay that contains zoom buttons --- androidApp/build.gradle.kts | 2 + .../android/details/reports/UnitReportsFragment.kt | 64 +------- .../TrackerMap/android/map/MapFragment.kt | 51 ++++--- .../TrackerMap/android/map/MapWrapperFragment.kt | 161 +++++++++++++++++++++ .../TrackerMap/android/map/UnitMapFragment.kt | 20 +-- androidApp/src/main/res/drawable/icon_zoom_in.xml | 10 ++ androidApp/src/main/res/drawable/icon_zoom_out.xml | 10 ++ .../src/main/res/layout/fragment_map_wrapper.xml | 65 +++++++++ .../src/main/res/layout/unit_details_reports.xml | 1 - .../src/main/res/layout/unit_map_fragment.xml | 2 +- build.gradle.kts | 2 +- .../mx/trackermap/TrackerMap/utils/MapCalculus.kt | 33 +++++ 12 files changed, 333 insertions(+), 88 deletions(-) create mode 100644 androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt create mode 100644 androidApp/src/main/res/drawable/icon_zoom_in.xml create mode 100644 androidApp/src/main/res/drawable/icon_zoom_out.xml create mode 100644 androidApp/src/main/res/layout/fragment_map_wrapper.xml diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 1f8b0ed..5347780 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -2,6 +2,7 @@ plugins { id("com.android.application") id("kotlinx-serialization") kotlin("android") + id("kotlin-android") } android { @@ -62,6 +63,7 @@ dependencies { implementation("mil.nga.sf:sf-wkt:1.0.1") implementation("com.soywiz.korlibs.krypto:krypto:2.4.12") implementation(group = "", name = "WhirlyGlobeMaply", ext = "aar") + implementation("androidx.legacy:legacy-support-v4:1.0.0") googleImplementation(platform("com.google.firebase:firebase-bom:29.0.3")) googleImplementation("com.google.firebase:firebase-messaging") diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt index e1a24ec..bceb113 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt @@ -22,6 +22,7 @@ import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UnitDetailsReportsBinding import mx.trackermap.TrackerMap.android.details.UnitDetailsAdapter import mx.trackermap.TrackerMap.android.map.MapFragment +import mx.trackermap.TrackerMap.android.map.MapWrapperFragment import mx.trackermap.TrackerMap.android.shared.MarkerTransformations import mx.trackermap.TrackerMap.client.models.EventInformation import mx.trackermap.TrackerMap.client.models.Geofence @@ -43,7 +44,7 @@ class UnitReportsFragment : Fragment() { private val binding get() = _binding!! private val unitReportsViewModel: UnitReportsViewModel by viewModel() - private lateinit var reportsMapFragment: MapFragment + private lateinit var reportsMapFragment: MapWrapperFragment override fun onCreateView( inflater: LayoutInflater, @@ -87,7 +88,7 @@ class UnitReportsFragment : Fragment() { private fun initializeMap() { Log.d("UnitReportsFragment", "initializeMap()") - reportsMapFragment = MapFragment() + reportsMapFragment = MapWrapperFragment() childFragmentManager.commit { replace(R.id.reportsMapContainer, reportsMapFragment) } @@ -127,8 +128,8 @@ class UnitReportsFragment : Fragment() { when (report) { is ReportController.Report.PositionsReport -> { - display(report.positions) - display(unitReportsViewModel.geofences.value!!) + reportsMapFragment.display(report.positions, isReport = true, center = true) + reportsMapFragment.display(unitReportsViewModel.geofences.value!!) showMap(true) } is ReportController.Report.EventsReport -> { @@ -136,8 +137,8 @@ class UnitReportsFragment : Fragment() { showMap(false) } is ReportController.Report.StopsReport -> { - display(report.stops) - display(unitReportsViewModel.geofences.value!!) + reportsMapFragment.display(report.stops) + reportsMapFragment.display(unitReportsViewModel.geofences.value!!) showMap(true) } is ReportController.Report.XlsxReport -> { @@ -167,7 +168,7 @@ class UnitReportsFragment : Fragment() { } unitReportsViewModel.geofences.observe(viewLifecycleOwner) { geofences -> - display(geofences) + reportsMapFragment.display(geofences) } } @@ -199,25 +200,6 @@ class UnitReportsFragment : Fragment() { popOver.show() } - private fun display(positions: Array) { - if (reportsMapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying positions: $positions") - - binding.eventsScroll.visibility = View.GONE - binding.reportsMapContainer.visibility = View.VISIBLE - - reportsMapFragment.display( - positions.mapNotNull(MarkerTransformations::positionToMarker).toTypedArray(), - isReport = true - ) - } else { - reportsMapFragment.setupCallbacks.clear() - reportsMapFragment.setupCallbacks.add { - display(positions) - } - } - } - private fun display(events: Array) { Log.d("UnitReportsFragment", "Displaying events: $events") @@ -284,36 +266,6 @@ class UnitReportsFragment : Fragment() { } } - private fun display(stops: Array) { - if (reportsMapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying stops: $stops") - - binding.eventsScroll.visibility = View.GONE - binding.reportsMapContainer.visibility = View.VISIBLE - - reportsMapFragment.display( - stops.mapNotNull(MarkerTransformations::stopToMarker).toTypedArray(), - isReport = true - ) - } else { - reportsMapFragment.setupCallbacks.add { - display(stops) - } - } - } - - private fun display(geofences: Array) { - Log.d("UnitReportsFragment", "Geofences: $geofences") - if (reportsMapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying geofences: $geofences") - reportsMapFragment.displayGeofences(geofences) - } else { - reportsMapFragment.setupCallbacks.add { - display(geofences) - } - } - } - private fun loading() { binding.reportLoading.root.visibility = View.VISIBLE binding.eventsScroll.visibility = View.GONE 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 1ba8fd6..5304f8e 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 @@ -27,7 +27,7 @@ import mx.trackermap.TrackerMap.utils.MarkerType typealias SetupCallback = () -> Unit typealias MarkerCallback = (Int?) -> Unit -class MapFragment : GlobeMapFragment() { +open class MapFragment : GlobeMapFragment() { private var loader: QuadImageLoader? = null @@ -98,6 +98,11 @@ class MapFragment : GlobeMapFragment() { mapControl.setPositionGeo(longitude, latitude, 0.4) } + override fun onStop() { + super.onStop() + hasStarted = false + } + override fun mapDidStopMoving( mapControl: MapController?, corners: Array?, @@ -341,19 +346,29 @@ class MapFragment : GlobeMapFragment() { height: Double = 0.00001, animated: Boolean = true ) { - mapControl?.addPostSurfaceRunnable { - val lat = latitude * Math.PI / 180 - val lon = longitude * Math.PI / 180 - // Ensure height is equal or higher than bottom limit - val z = height.coerceAtLeast(mapControl.zoomLimitMin) - if (animated) { - mapControl.animatePositionGeo(lon, lat, z, 0.2) - } else { - mapControl.setPositionGeo(lon, lat, z) - } + val lat = latitude * Math.PI / 180 + val lon = longitude * Math.PI / 180 + // Ensure height is equal or higher than bottom limit + val z = height.coerceAtLeast(mapControl.zoomLimitMin) + if (animated) { + mapControl.animatePositionGeo(lon, lat, z, 0.2) + } else { + mapControl.setPositionGeo(lon, lat, z) } } + fun zoomIn() { + val pos = mapControl.positionGeo.toPoint2d().toDegrees() + val zoom = mapControl.currentMapScale() / 2 + focusOn(pos.y, pos.x, mapControl.heightForMapScale(zoom)) + } + + fun zoomOut() { + val pos = mapControl.positionGeo.toPoint2d().toDegrees() + val zoom = mapControl.currentMapScale() * 2 + focusOn(pos.y, pos.x, mapControl.heightForMapScale(zoom)) + } + private fun tileInfoSetCacheDir(url: String, tileInfo: TileInfoNew): TileInfoNew? { return context?.let { val cacheDirName = url.toByteArray(Charsets.UTF_8).md5().hex @@ -366,14 +381,12 @@ class MapFragment : GlobeMapFragment() { } fun updateLayer(layer: MapLayer.Type) { - mapControl?.addPostSurfaceRunnable { - 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) - } + 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/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt new file mode 100644 index 0000000..51b0118 --- /dev/null +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -0,0 +1,161 @@ +package mx.trackermap.TrackerMap.android.map + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.commit +import mx.trackermap.TrackerMap.android.R +import mx.trackermap.TrackerMap.android.databinding.FragmentMapWrapperBinding +import mx.trackermap.TrackerMap.android.shared.MarkerTransformations +import mx.trackermap.TrackerMap.client.models.* + +class MapWrapperFragment: Fragment() { + private var _binding: FragmentMapWrapperBinding? = null + private val binding get() = _binding!! + + private val mapFragment = MapFragment() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentMapWrapperBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupEvents() + } + + override fun onResume() { + super.onResume() + initializeMap() + } + + override fun onPause() { + super.onPause() + removeMap() + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } + + private fun initializeMap() { + Log.d("MapWrapperFragment", "initializeMap()") + childFragmentManager.commit { + replace(R.id.mapContainer, mapFragment) + } + } + + private fun removeMap() { + Log.d("UnitReportsFragment", "removeMap()") + childFragmentManager.commit { + remove(mapFragment) + } + } + + private fun setupEvents() { + binding.zoomInButton.setOnClickListener { + if (mapFragment.hasStarted) { + mapFragment.zoomIn() + } else { + mapFragment.setupCallbacks.add { + mapFragment.zoomIn() + } + } + } + binding.zoomOutButton.setOnClickListener { + if (mapFragment.hasStarted) { + mapFragment.zoomOut() + } else { + mapFragment.setupCallbacks.add { + mapFragment.zoomOut() + } + } + } + } + + fun setMarkerCallback(callback: MarkerCallback) { + mapFragment.markerCallback = callback + } + + fun setOverlayPaddingTop(top: Int) { + val overlay by lazy { binding.overlay } + overlay.setPadding(0, top, 0, 0) + } + + fun focusOn( + latitude: Double, + longitude: Double, + height: Double = 0.00001, + animated: Boolean = true + ) { + if (mapFragment.hasStarted) { + mapFragment.focusOn(latitude, longitude, height, animated) + } else { + mapFragment.setupCallbacks.add { + focusOn(latitude, longitude, height, animated) + } + } + } + + fun display(positions: Array, isReport: Boolean, center: Boolean) { + if (mapFragment.hasStarted) { + Log.d("UnitReportsFragment", "Displaying positions: $positions") + + mapFragment.display( + positions.mapNotNull(MarkerTransformations::positionToMarker).toTypedArray(), + isReport = isReport, + center = center + ) + } else { + mapFragment.setupCallbacks.clear() + mapFragment.setupCallbacks.add { + display(positions, isReport, center) + } + } + } + + fun display(stops: Array) { + if (mapFragment.hasStarted) { + Log.d("UnitReportsFragment", "Displaying stops: $stops") + + mapFragment.display( + stops.mapNotNull(MarkerTransformations::stopToMarker).toTypedArray(), + isReport = true + ) + } else { + mapFragment.setupCallbacks.add { + display(stops) + } + } + } + + fun display(geofences: Array) { + Log.d("UnitReportsFragment", "Geofences: $geofences") + if (mapFragment.hasStarted) { + Log.d("UnitReportsFragment", "Displaying geofences: $geofences") + mapFragment.displayGeofences(geofences) + } else { + mapFragment.setupCallbacks.add { + display(geofences) + } + } + } + + fun updateLayer(layer: MapLayer.Type) { + if (mapFragment.hasStarted) { + mapFragment.updateLayer(layer) + } else { + mapFragment.setupCallbacks.add { + updateLayer(layer) + } + } + } +} \ No newline at end of file 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 b6396c8..b67bca8 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 @@ -14,7 +14,6 @@ import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UnitMapFragmentBinding import mx.trackermap.TrackerMap.android.details.DetailsActivity -import mx.trackermap.TrackerMap.android.shared.MarkerTransformations import mx.trackermap.TrackerMap.android.shared.UnitRenderData import mx.trackermap.TrackerMap.android.units.UnitsViewModel import mx.trackermap.TrackerMap.client.models.MapLayer @@ -30,7 +29,7 @@ class UnitMapFragment : Fragment() { private var _binding: UnitMapFragmentBinding? = null private val binding get() = _binding!! - private lateinit var unitsMapFragment: MapFragment + private lateinit var mapFragment: MapWrapperFragment private var shouldCenter = true @@ -63,8 +62,9 @@ class UnitMapFragment : Fragment() { private fun initializeMap() { shouldCenter = true - unitsMapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapFragment - unitsMapFragment.markerCallback = unitsViewModel::selectUnitWith + mapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapWrapperFragment + mapFragment.setMarkerCallback(unitsViewModel::selectUnitWith) + mapFragment.setOverlayPaddingTop(resources.getDimensionPixelSize(R.dimen.nav_height)) val layer = MapLayer.defaultLayer binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) @@ -75,8 +75,8 @@ class UnitMapFragment : Fragment() { unitsViewModel.units.observe(viewLifecycleOwner) { units -> Log.d("UnitMapFragment", "Available units: $units") - unitsMapFragment.display( - units.mapNotNull(MarkerTransformations::unitToMarker).toTypedArray(), + mapFragment.display( + units.mapNotNull { it.position }.toTypedArray(), isReport = false, center = shouldCenter ) @@ -107,22 +107,22 @@ class UnitMapFragment : Fragment() { ), binding.mapUnitCard.context, unit, this::itemAction ) - unitsMapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!) + mapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!) } } unitsViewModel.mapLayerType.observe(viewLifecycleOwner) { type -> Log.d("UnitMapFragment", "Loading layer!") - unitsMapFragment.updateLayer(type) + mapFragment.updateLayer(type) unitsViewModel.selectedUnit.value?.let { - unitsMapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) + mapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) } val layer = MapLayer.layers[type]!! binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } unitsViewModel.geofences.observe(viewLifecycleOwner) { geofences -> - unitsMapFragment.displayGeofences(geofences.values.toTypedArray()) + mapFragment.display(geofences.values.toTypedArray()) } } diff --git a/androidApp/src/main/res/drawable/icon_zoom_in.xml b/androidApp/src/main/res/drawable/icon_zoom_in.xml new file mode 100644 index 0000000..eb23254 --- /dev/null +++ b/androidApp/src/main/res/drawable/icon_zoom_in.xml @@ -0,0 +1,10 @@ + + + diff --git a/androidApp/src/main/res/drawable/icon_zoom_out.xml b/androidApp/src/main/res/drawable/icon_zoom_out.xml new file mode 100644 index 0000000..791a2f8 --- /dev/null +++ b/androidApp/src/main/res/drawable/icon_zoom_out.xml @@ -0,0 +1,10 @@ + + + diff --git a/androidApp/src/main/res/layout/fragment_map_wrapper.xml b/androidApp/src/main/res/layout/fragment_map_wrapper.xml new file mode 100644 index 0000000..479c855 --- /dev/null +++ b/androidApp/src/main/res/layout/fragment_map_wrapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/layout/unit_details_reports.xml b/androidApp/src/main/res/layout/unit_details_reports.xml index 7210e1f..f53ce51 100644 --- a/androidApp/src/main/res/layout/unit_details_reports.xml +++ b/androidApp/src/main/res/layout/unit_details_reports.xml @@ -7,7 +7,6 @@ 33.3238997478125 else -> null } + + fun scaleToZoomLevel(scale: Double): Int { + fun z(d: Int) = zoomLevelToScale(d)!! + return when { + scale > z(1) -> 1 + scale in z(2)..z(1) -> 2 + scale in z(3)..z(2) -> 3 + scale in z(4)..z(3) -> 4 + scale in z(5)..z(4) -> 5 + scale in z(6)..z(5) -> 6 + scale in z(7)..z(6) -> 7 + scale in z(8)..z(7) -> 8 + scale in z(9)..z(8) -> 9 + scale in z(10)..z(9) -> 10 + scale in z(11)..z(10) -> 11 + scale in z(12)..z(11) -> 12 + scale in z(13)..z(12) -> 13 + scale in z(14)..z(13) -> 14 + scale in z(15)..z(14) -> 15 + scale in z(16)..z(15) -> 16 + scale in z(17)..z(16) -> 17 + scale in z(18)..z(17) -> 18 + scale in z(19)..z(18) -> 19 + scale in z(20)..z(19) -> 20 + scale in z(21)..z(20) -> 21 + scale in z(22)..z(21) -> 22 + scale in z(23)..z(22) -> 23 + scale in z(24)..z(23) -> 24 + else -> 24 + } + } } } \ No newline at end of file -- cgit v1.2.3 From aae38258ff929157ff35547e353265da01c80f9c Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 22:03:48 -0600 Subject: Fixed zooming selected unit and refactored attribution into wrap --- .../TrackerMap/android/map/MapFragment.kt | 5 ++-- .../TrackerMap/android/map/MapWrapperFragment.kt | 32 ++++++++++++++++++---- .../TrackerMap/android/map/UnitMapFragment.kt | 9 ++---- .../src/main/res/layout/fragment_map_wrapper.xml | 20 ++++++++++++++ .../src/main/res/layout/unit_map_fragment.xml | 20 -------------- 5 files changed, 51 insertions(+), 35 deletions(-) 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 5304f8e..2c47677 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 @@ -68,8 +68,6 @@ open class MapFragment : GlobeMapFragment() { override fun controlHasStarted() { Log.d("MapFragment", "controlHasStarted") - hasStarted = true - setupCallbacks.forEach { it() } if (tileInfo == null) { val layer = MapLayer.defaultLayer @@ -96,6 +94,9 @@ open class MapFragment : GlobeMapFragment() { val latitude = 23.191 * Math.PI / 180 val longitude = -100.36 * Math.PI / 180 mapControl.setPositionGeo(longitude, latitude, 0.4) + + hasStarted = true + setupCallbacks.forEach { it() } } override fun onStop() { diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index 51b0118..8f9af3f 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -5,6 +5,7 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.text.HtmlCompat import androidx.fragment.app.Fragment import androidx.fragment.app.commit import mx.trackermap.TrackerMap.android.R @@ -51,10 +52,13 @@ class MapWrapperFragment: Fragment() { childFragmentManager.commit { replace(R.id.mapContainer, mapFragment) } + + val layer = MapLayer.defaultLayer + binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } private fun removeMap() { - Log.d("UnitReportsFragment", "removeMap()") + Log.d("MapWrapperFragment", "removeMap()") childFragmentManager.commit { remove(mapFragment) } @@ -96,6 +100,7 @@ class MapWrapperFragment: Fragment() { height: Double = 0.00001, animated: Boolean = true ) { + Log.d("MapWrapperFragment", "Focusing on $latitude, $longitude") if (mapFragment.hasStarted) { mapFragment.focusOn(latitude, longitude, height, animated) } else { @@ -107,7 +112,7 @@ class MapWrapperFragment: Fragment() { fun display(positions: Array, isReport: Boolean, center: Boolean) { if (mapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying positions: $positions") + Log.d("MapWrapperFragment", "Displaying positions: $positions") mapFragment.display( positions.mapNotNull(MarkerTransformations::positionToMarker).toTypedArray(), @@ -115,16 +120,31 @@ class MapWrapperFragment: Fragment() { center = center ) } else { - mapFragment.setupCallbacks.clear() mapFragment.setupCallbacks.add { display(positions, isReport, center) } } } + fun display(units: Array, isReport: Boolean, center: Boolean) { + if (mapFragment.hasStarted) { + Log.d("MapWrapperFragment", "Displaying units: $units") + + mapFragment.display( + units.mapNotNull(MarkerTransformations::unitToMarker).toTypedArray(), + isReport = isReport, + center = center + ) + } else { + mapFragment.setupCallbacks.add { + display(units, isReport, center) + } + } + } + fun display(stops: Array) { if (mapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying stops: $stops") + Log.d("MapWrapperFragment", "Displaying stops: $stops") mapFragment.display( stops.mapNotNull(MarkerTransformations::stopToMarker).toTypedArray(), @@ -138,9 +158,8 @@ class MapWrapperFragment: Fragment() { } fun display(geofences: Array) { - Log.d("UnitReportsFragment", "Geofences: $geofences") if (mapFragment.hasStarted) { - Log.d("UnitReportsFragment", "Displaying geofences: $geofences") + Log.d("MapWrapperFragment", "Displaying geofences: $geofences") mapFragment.displayGeofences(geofences) } else { mapFragment.setupCallbacks.add { @@ -152,6 +171,7 @@ class MapWrapperFragment: Fragment() { fun updateLayer(layer: MapLayer.Type) { if (mapFragment.hasStarted) { mapFragment.updateLayer(layer) + binding.attributionText.text = MapLayer.layers[layer]?.attribution } else { mapFragment.setupCallbacks.add { updateLayer(layer) 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 b67bca8..1a39ab1 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 @@ -61,13 +61,10 @@ class UnitMapFragment : Fragment() { } private fun initializeMap() { - shouldCenter = true + shouldCenter = shouldCenter && unitsViewModel.selectedUnit.value == null mapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapWrapperFragment mapFragment.setMarkerCallback(unitsViewModel::selectUnitWith) mapFragment.setOverlayPaddingTop(resources.getDimensionPixelSize(R.dimen.nav_height)) - - val layer = MapLayer.defaultLayer - binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } private fun setupObservers() { @@ -76,7 +73,7 @@ class UnitMapFragment : Fragment() { unitsViewModel.units.observe(viewLifecycleOwner) { units -> Log.d("UnitMapFragment", "Available units: $units") mapFragment.display( - units.mapNotNull { it.position }.toTypedArray(), + units.toTypedArray(), isReport = false, center = shouldCenter ) @@ -117,8 +114,6 @@ class UnitMapFragment : Fragment() { unitsViewModel.selectedUnit.value?.let { mapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!) } - val layer = MapLayer.layers[type]!! - binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) } unitsViewModel.geofences.observe(viewLifecycleOwner) { geofences -> diff --git a/androidApp/src/main/res/layout/fragment_map_wrapper.xml b/androidApp/src/main/res/layout/fragment_map_wrapper.xml index 479c855..f63f74e 100644 --- a/androidApp/src/main/res/layout/fragment_map_wrapper.xml +++ b/androidApp/src/main/res/layout/fragment_map_wrapper.xml @@ -60,6 +60,26 @@ app:layout_constraintTop_toBottomOf="@id/zoomOutButton" android:visibility="gone" /> + + + + + + + \ 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 9eb92de..da91e8c 100644 --- a/androidApp/src/main/res/layout/unit_map_fragment.xml +++ b/androidApp/src/main/res/layout/unit_map_fragment.xml @@ -143,24 +143,4 @@ - - - - - - - \ No newline at end of file -- cgit v1.2.3 From c94d23dee4f4bf4af857c026fc2527635a4e6f1d Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 22:23:14 -0600 Subject: Add loading screen to map and removed no longer needed fragment replacement in reports view --- .../android/details/reports/UnitReportsFragment.kt | 38 ++++++++-------------- .../TrackerMap/android/map/MapWrapperFragment.kt | 9 +++++ .../src/main/res/layout/fragment_map_wrapper.xml | 7 ++++ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt index bceb113..2fb94f3 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt @@ -21,13 +21,8 @@ import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UnitDetailsReportsBinding import mx.trackermap.TrackerMap.android.details.UnitDetailsAdapter -import mx.trackermap.TrackerMap.android.map.MapFragment import mx.trackermap.TrackerMap.android.map.MapWrapperFragment -import mx.trackermap.TrackerMap.android.shared.MarkerTransformations import mx.trackermap.TrackerMap.client.models.EventInformation -import mx.trackermap.TrackerMap.client.models.Geofence -import mx.trackermap.TrackerMap.client.models.Position -import mx.trackermap.TrackerMap.client.models.Stop import mx.trackermap.TrackerMap.controllers.ReportController import mx.trackermap.TrackerMap.utils.Formatter import mx.trackermap.TrackerMap.utils.ReportDates @@ -44,7 +39,9 @@ class UnitReportsFragment : Fragment() { private val binding get() = _binding!! private val unitReportsViewModel: UnitReportsViewModel by viewModel() - private lateinit var reportsMapFragment: MapWrapperFragment + private val mapFragment: MapWrapperFragment by lazy { + MapWrapperFragment() + } override fun onCreateView( inflater: LayoutInflater, @@ -61,12 +58,12 @@ class UnitReportsFragment : Fragment() { unitReportsViewModel.setDeviceId( arguments?.getInt(UnitDetailsAdapter.DEVICE_ID_ARG) ?: 0) setupEvents() + initializeMap() } override fun onResume() { super.onResume() - initializeMap() setupObservers() } @@ -74,7 +71,6 @@ class UnitReportsFragment : Fragment() { super.onPause() removeObservers() - removeMap() if (unitReportsViewModel.report.value == null) { unitReportsViewModel.fetchReport() @@ -88,16 +84,8 @@ class UnitReportsFragment : Fragment() { private fun initializeMap() { Log.d("UnitReportsFragment", "initializeMap()") - reportsMapFragment = MapWrapperFragment() - childFragmentManager.commit { - replace(R.id.reportsMapContainer, reportsMapFragment) - } - } - - private fun removeMap() { - Log.d("UnitReportsFragment", "removeMap()") childFragmentManager.commit { - remove(reportsMapFragment) + replace(R.id.reportsMapContainer, mapFragment) } } @@ -128,8 +116,8 @@ class UnitReportsFragment : Fragment() { when (report) { is ReportController.Report.PositionsReport -> { - reportsMapFragment.display(report.positions, isReport = true, center = true) - reportsMapFragment.display(unitReportsViewModel.geofences.value!!) + mapFragment.display(unitReportsViewModel.geofences.value!!) + mapFragment.display(report.positions, isReport = true, center = true) showMap(true) } is ReportController.Report.EventsReport -> { @@ -137,8 +125,8 @@ class UnitReportsFragment : Fragment() { showMap(false) } is ReportController.Report.StopsReport -> { - reportsMapFragment.display(report.stops) - reportsMapFragment.display(unitReportsViewModel.geofences.value!!) + mapFragment.display(unitReportsViewModel.geofences.value!!) + mapFragment.display(report.stops) showMap(true) } is ReportController.Report.XlsxReport -> { @@ -168,7 +156,7 @@ class UnitReportsFragment : Fragment() { } unitReportsViewModel.geofences.observe(viewLifecycleOwner) { geofences -> - reportsMapFragment.display(geofences) + mapFragment.display(geofences) } } @@ -272,7 +260,7 @@ class UnitReportsFragment : Fragment() { binding.reportsMapContainer.visibility = View.GONE childFragmentManager.commit { - hide(reportsMapFragment) + hide(mapFragment) } } @@ -284,9 +272,9 @@ class UnitReportsFragment : Fragment() { childFragmentManager.commit { if (shouldShowMap) { - show(reportsMapFragment) + show(mapFragment) } else { - hide(reportsMapFragment) + hide(mapFragment) } } } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index 8f9af3f..2b28a06 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -55,6 +55,15 @@ class MapWrapperFragment: Fragment() { val layer = MapLayer.defaultLayer binding.attributionText.text = HtmlCompat.fromHtml(layer.attribution, 0) + + if (mapFragment.hasStarted) { + binding.mapLoading.root.visibility = View.GONE + } else { + binding.mapLoading.root.visibility = View.VISIBLE + mapFragment.setupCallbacks.add { + binding.mapLoading.root.visibility = View.GONE + } + } } private fun removeMap() { diff --git a/androidApp/src/main/res/layout/fragment_map_wrapper.xml b/androidApp/src/main/res/layout/fragment_map_wrapper.xml index f63f74e..949cc10 100644 --- a/androidApp/src/main/res/layout/fragment_map_wrapper.xml +++ b/androidApp/src/main/res/layout/fragment_map_wrapper.xml @@ -82,4 +82,11 @@ + + \ No newline at end of file -- cgit v1.2.3 From dfe5dd6a425ac2418e33e0b64911b6f914eb514c Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 23:09:46 -0600 Subject: Pass overlay top margin and whether should show layer toggle as arguments for MapWrapperFragment, and refactored stuff --- .../android/details/reports/UnitReportsFragment.kt | 7 +-- .../TrackerMap/android/map/MapWrapperFragment.kt | 51 +++++++++++++++++++--- .../TrackerMap/android/map/UnitMapFragment.kt | 15 ++++--- .../trackermap/TrackerMap/android/shared/Utils.kt | 26 +++++++++++ .../TrackerMap/android/units/UnitsActivity.kt | 15 ++----- .../src/main/res/layout/unit_map_fragment.xml | 3 +- 6 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/Utils.kt diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt index 2fb94f3..51d2f6d 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt @@ -39,9 +39,7 @@ class UnitReportsFragment : Fragment() { private val binding get() = _binding!! private val unitReportsViewModel: UnitReportsViewModel by viewModel() - private val mapFragment: MapWrapperFragment by lazy { - MapWrapperFragment() - } + private lateinit var mapFragment: MapWrapperFragment override fun onCreateView( inflater: LayoutInflater, @@ -84,6 +82,9 @@ class UnitReportsFragment : Fragment() { private fun initializeMap() { Log.d("UnitReportsFragment", "initializeMap()") + mapFragment = MapWrapperFragment.newInstance( + showLayerToggle = true + ) childFragmentManager.commit { replace(R.id.reportsMapContainer, mapFragment) } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index 2b28a06..cecb567 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -11,6 +11,7 @@ import androidx.fragment.app.commit import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.FragmentMapWrapperBinding import mx.trackermap.TrackerMap.android.shared.MarkerTransformations +import mx.trackermap.TrackerMap.android.shared.Utils import mx.trackermap.TrackerMap.client.models.* class MapWrapperFragment: Fragment() { @@ -30,6 +31,7 @@ class MapWrapperFragment: Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupEvents() + setupViews() } override fun onResume() { @@ -79,7 +81,7 @@ class MapWrapperFragment: Fragment() { mapFragment.zoomIn() } else { mapFragment.setupCallbacks.add { - mapFragment.zoomIn() + binding.zoomInButton.performClick() } } } @@ -88,19 +90,37 @@ class MapWrapperFragment: Fragment() { mapFragment.zoomOut() } else { mapFragment.setupCallbacks.add { - mapFragment.zoomOut() + binding.zoomOutButton.performClick() + } + } + } + binding.mapLayerToggle.setOnClickListener { + context?.let { context -> + if (mapFragment.hasStarted) { + Utils.showLayersPopUp(context, it) { type -> + mapFragment.updateLayer(type) + } + } else { + binding.mapLayerToggle.performClick() } } } } - fun setMarkerCallback(callback: MarkerCallback) { - mapFragment.markerCallback = callback + private fun setupViews() { + val overlayMarginTop = arguments?.getInt(OVERLAY_MARGIN_TOP_ARG) + val showLayerToggle = arguments?.getBoolean(SHOW_LAYER_TOGGLE_ARG) + + overlayMarginTop?.let { top -> + binding.overlay.setPadding(0, top, 0, 0) + } + showLayerToggle?.let { show -> + binding.mapLayerToggle.visibility = if (show) View.VISIBLE else View.GONE + } } - fun setOverlayPaddingTop(top: Int) { - val overlay by lazy { binding.overlay } - overlay.setPadding(0, top, 0, 0) + fun setMarkerCallback(callback: MarkerCallback) { + mapFragment.markerCallback = callback } fun focusOn( @@ -187,4 +207,21 @@ class MapWrapperFragment: Fragment() { } } } + + companion object { + const val SHOW_LAYER_TOGGLE_ARG = "show_layer_toggle" + const val OVERLAY_MARGIN_TOP_ARG = "overlay_margin_top" + + fun newInstance( + showLayerToggle: Boolean = false, + overlayMarginTop: Int = 0 + ): MapWrapperFragment { + val args = Bundle() + args.putBoolean(SHOW_LAYER_TOGGLE_ARG, showLayerToggle) + args.putInt(OVERLAY_MARGIN_TOP_ARG, overlayMarginTop) + val fragment = MapWrapperFragment() + fragment.arguments = args + return fragment + } + } } \ No newline at end of file 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 1a39ab1..768c0f0 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 @@ -6,8 +6,8 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.text.HtmlCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.fragment.app.viewModels import kotlin.time.ExperimentalTime import kotlinx.coroutines.DelicateCoroutinesApi @@ -16,7 +16,6 @@ import mx.trackermap.TrackerMap.android.databinding.UnitMapFragmentBinding import mx.trackermap.TrackerMap.android.details.DetailsActivity import mx.trackermap.TrackerMap.android.shared.UnitRenderData import mx.trackermap.TrackerMap.android.units.UnitsViewModel -import mx.trackermap.TrackerMap.client.models.MapLayer import mx.trackermap.TrackerMap.client.models.UnitInformation @DelicateCoroutinesApi @@ -61,10 +60,14 @@ class UnitMapFragment : Fragment() { } private fun initializeMap() { - shouldCenter = shouldCenter && unitsViewModel.selectedUnit.value == null - mapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapWrapperFragment + shouldCenter = true + mapFragment = MapWrapperFragment.newInstance( + overlayMarginTop = resources.getDimensionPixelSize(R.dimen.nav_height) + ) + childFragmentManager.commit { + replace(R.id.unitsMap, mapFragment) + } mapFragment.setMarkerCallback(unitsViewModel::selectUnitWith) - mapFragment.setOverlayPaddingTop(resources.getDimensionPixelSize(R.dimen.nav_height)) } private fun setupObservers() { @@ -75,7 +78,7 @@ class UnitMapFragment : Fragment() { mapFragment.display( units.toTypedArray(), isReport = false, - center = shouldCenter + center = shouldCenter && unitsViewModel.selectedUnit.value == null ) if (units.isNotEmpty()) { shouldCenter = false diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/Utils.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/Utils.kt new file mode 100644 index 0000000..56a9167 --- /dev/null +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/Utils.kt @@ -0,0 +1,26 @@ +package mx.trackermap.TrackerMap.android.shared + +import android.content.Context +import android.view.View +import androidx.appcompat.widget.PopupMenu +import mx.trackermap.TrackerMap.android.R +import mx.trackermap.TrackerMap.client.models.MapLayer + +class Utils { + companion object { + fun showLayersPopUp(context: Context, view: View, callback: (layer: MapLayer.Type) -> Unit) { + val popOver = PopupMenu(context, view) + popOver.menuInflater.inflate(R.menu.map_layers, popOver.menu) + popOver.setOnMenuItemClickListener { item -> + val layer = when (item.itemId) { + R.id.layerStreets -> MapLayer.Type.STREETS + R.id.layerSatellite -> MapLayer.Type.SATELLITE + else -> MapLayer.Type.STREETS + } + callback(layer) + true + } + popOver.show() + } + } +} \ No newline at end of file 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 adc0cb9..9fcef7f 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 @@ -19,7 +19,7 @@ import mx.trackermap.TrackerMap.android.databinding.UnitsActivityBinding import mx.trackermap.TrackerMap.android.devices.DevicesFragment import mx.trackermap.TrackerMap.android.map.UnitMapFragment import mx.trackermap.TrackerMap.android.session.UserInformationActivity -import mx.trackermap.TrackerMap.client.models.MapLayer +import mx.trackermap.TrackerMap.android.shared.Utils import org.koin.androidx.viewmodel.ext.android.viewModel import kotlin.time.ExperimentalTime @@ -94,18 +94,9 @@ class UnitsActivity : AppCompatActivity() { } private fun showLayersPopUp(view: View) { - val popOver = PopupMenu(this, view) - popOver.menuInflater.inflate(R.menu.map_layers, popOver.menu) - popOver.setOnMenuItemClickListener { item -> - 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 + Utils.showLayersPopUp(this, view) { + unitsViewModel.setMapLayerType(it) } - popOver.show() } private fun unfocusSearch(clearText: Boolean = false) { diff --git a/androidApp/src/main/res/layout/unit_map_fragment.xml b/androidApp/src/main/res/layout/unit_map_fragment.xml index da91e8c..f168662 100644 --- a/androidApp/src/main/res/layout/unit_map_fragment.xml +++ b/androidApp/src/main/res/layout/unit_map_fragment.xml @@ -6,7 +6,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - Date: Mon, 17 Jan 2022 23:17:29 -0600 Subject: Fixed attribution text not changing with internal layer toggle and zoom out when switching layer to match limit --- .../src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt | 3 +++ .../java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt | 1 + 2 files changed, 4 insertions(+) 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 2c47677..87fb44a 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 @@ -388,6 +388,9 @@ open class MapFragment : GlobeMapFragment() { this.tileInfo?.let { t -> loader?.changeTileInfo(t) setZoomLimits(tileInfo.minZoom, tileInfo.maxZoom) + + val pos = mapControl.positionGeo.toPoint2d().toDegrees() + focusOn(pos.y, pos.x, mapControl.positionGeo.z, animated = true) } } } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index cecb567..4ff4c16 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -99,6 +99,7 @@ class MapWrapperFragment: Fragment() { if (mapFragment.hasStarted) { Utils.showLayersPopUp(context, it) { type -> mapFragment.updateLayer(type) + binding.attributionText.text = MapLayer.layers[type]?.attribution } } else { binding.mapLayerToggle.performClick() -- cgit v1.2.3 From a33e0d509e3b716d8995f56459c92957702f83a6 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 23:31:25 -0600 Subject: Fixed attribution not being formatted with HtmlCompat --- .../mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index 4ff4c16..01587ae 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -99,7 +99,10 @@ class MapWrapperFragment: Fragment() { if (mapFragment.hasStarted) { Utils.showLayersPopUp(context, it) { type -> mapFragment.updateLayer(type) - binding.attributionText.text = MapLayer.layers[type]?.attribution + MapLayer.layers[type]?.attribution?.let { attribution -> + binding.attributionText.text = + HtmlCompat.fromHtml(attribution, 0) + } } } else { binding.mapLayerToggle.performClick() @@ -201,7 +204,10 @@ class MapWrapperFragment: Fragment() { fun updateLayer(layer: MapLayer.Type) { if (mapFragment.hasStarted) { mapFragment.updateLayer(layer) - binding.attributionText.text = MapLayer.layers[layer]?.attribution + MapLayer.layers[layer]?.attribution?.let { attribution -> + binding.attributionText.text = + HtmlCompat.fromHtml(attribution, 0) + } } else { mapFragment.setupCallbacks.add { updateLayer(layer) -- cgit v1.2.3 From 9325b6e0de41e8446bb6ce66915fb0c9fe0de4f3 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 23:45:25 -0600 Subject: Set request timeout to 10 seconds --- .../kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt index 4bda0ae..7d01282 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt @@ -40,6 +40,9 @@ open class ApiClient(val baseUrl: String) { logger = Logger.DEFAULT level = LogLevel.ALL } + engine { + requestTimeout = 10_000 + } } val defaultHeaders: Map = -- cgit v1.2.3