From 0d8f4a3f27560acdee872d070f1f130647747594 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Sun, 8 Oct 2023 22:03:09 +0200 Subject: [PATCH] Pass `getCountryInfoByLocation` and `getCountryCodeByLocation` to quests/modules (#5280) * Pass `getCountryBoundaries` as function * Pass `getCountryInfoByLocation` to quests * Pass `getCountryInfoByLocation` and `getCountryCodeByLocation` to modules --- .../streetcomplete/overlays/OverlaysModule.kt | 23 ++++++++++++++----- .../overlays/address/AddressOverlay.kt | 8 +++---- .../overlays/cycleway/CyclewayOverlay.kt | 14 +++-------- .../streetcomplete/quests/QuestsModule.kt | 17 +++++++++----- .../quests/cycleway/AddCycleway.kt | 22 ++++-------------- .../quests/roof_shape/AddRoofShape.kt | 15 ++++-------- 6 files changed, 43 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/overlays/OverlaysModule.kt b/app/src/main/java/de/westnordost/streetcomplete/overlays/OverlaysModule.kt index 08f4229dab..4a3701b341 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/overlays/OverlaysModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/overlays/OverlaysModule.kt @@ -3,7 +3,10 @@ package de.westnordost.streetcomplete.overlays import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.osmfeatures.Feature import de.westnordost.osmfeatures.FeatureDictionary +import de.westnordost.streetcomplete.data.meta.CountryInfo import de.westnordost.streetcomplete.data.meta.CountryInfos +import de.westnordost.streetcomplete.data.meta.getByLocation +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.overlays.OverlayRegistry import de.westnordost.streetcomplete.overlays.address.AddressOverlay import de.westnordost.streetcomplete.overlays.cycleway.CyclewayOverlay @@ -13,6 +16,7 @@ import de.westnordost.streetcomplete.overlays.street_parking.StreetParkingOverla import de.westnordost.streetcomplete.overlays.surface.SurfaceOverlay import de.westnordost.streetcomplete.overlays.way_lit.WayLitOverlay import de.westnordost.streetcomplete.util.ktx.getFeature +import de.westnordost.streetcomplete.util.ktx.getIds import org.koin.core.qualifier.named import org.koin.dsl.module import java.util.concurrent.FutureTask @@ -22,8 +26,15 @@ import java.util.concurrent.FutureTask val overlaysModule = module { single { overlaysRegistry( - get(), - get(named("CountryBoundariesFuture")), + { location -> + val countryInfos = get() + val countryBoundaries = get>(named("CountryBoundariesFuture")).get() + countryInfos.getByLocation(countryBoundaries, location.longitude, location.latitude) + }, + { location -> + val countryBoundaries = get>(named("CountryBoundariesFuture")).get() + countryBoundaries.getIds(location).firstOrNull() + }, { tags -> get>(named("FeatureDictionaryFuture")) .get().getFeature(tags) @@ -33,16 +44,16 @@ val overlaysModule = module { } fun overlaysRegistry( - countryInfos: CountryInfos, - countryBoundariesFuture: FutureTask, + getCountryInfoByLocation: (location: LatLon) -> CountryInfo, + getCountryCodeByLocation: (location: LatLon) -> String?, getFeature: (tags: Map) -> Feature?, ) = OverlayRegistry(listOf( 0 to WayLitOverlay(), 6 to SurfaceOverlay(), 1 to SidewalkOverlay(), - 5 to CyclewayOverlay(countryInfos, countryBoundariesFuture), + 5 to CyclewayOverlay(getCountryInfoByLocation), 2 to StreetParkingOverlay(), - 3 to AddressOverlay(countryBoundariesFuture), + 3 to AddressOverlay(getCountryCodeByLocation), 4 to ShopsOverlay(getFeature), )) diff --git a/app/src/main/java/de/westnordost/streetcomplete/overlays/address/AddressOverlay.kt b/app/src/main/java/de/westnordost/streetcomplete/overlays/address/AddressOverlay.kt index 3c7a99f122..d4666dddb3 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/overlays/address/AddressOverlay.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/overlays/address/AddressOverlay.kt @@ -1,8 +1,8 @@ package de.westnordost.streetcomplete.overlays.address -import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry import de.westnordost.streetcomplete.data.osm.mapdata.filter import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.POSTMAN @@ -12,11 +12,9 @@ import de.westnordost.streetcomplete.overlays.PointStyle import de.westnordost.streetcomplete.overlays.PolygonStyle import de.westnordost.streetcomplete.quests.address.AddHousenumber import de.westnordost.streetcomplete.util.getShortHouseNumber -import de.westnordost.streetcomplete.util.ktx.getIds -import java.util.concurrent.FutureTask class AddressOverlay( - private val countryBoundaries: FutureTask + private val getCountryCodeByLocation: (location: LatLon) -> String? ) : Overlay { override val title = R.string.overlay_addresses @@ -49,7 +47,7 @@ class AddressOverlay( .filter("ways, relations with building") .filter { val center = mapData.getGeometry(it.type, it.id)?.center ?: return@filter false - val country = countryBoundaries.get().getIds(center).firstOrNull() + val country = getCountryCodeByLocation(center) country !in noAddressesOnBuildings } .map { it to PolygonStyle(Color.INVISIBLE, label = getShortHouseNumber(it.tags)) } diff --git a/app/src/main/java/de/westnordost/streetcomplete/overlays/cycleway/CyclewayOverlay.kt b/app/src/main/java/de/westnordost/streetcomplete/overlays/cycleway/CyclewayOverlay.kt index ffc3042c54..b1e64edf96 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/overlays/cycleway/CyclewayOverlay.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/overlays/cycleway/CyclewayOverlay.kt @@ -1,12 +1,10 @@ package de.westnordost.streetcomplete.overlays.cycleway -import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression import de.westnordost.streetcomplete.data.meta.CountryInfo -import de.westnordost.streetcomplete.data.meta.CountryInfos -import de.westnordost.streetcomplete.data.meta.getByLocation import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry import de.westnordost.streetcomplete.data.osm.mapdata.filter import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement @@ -27,11 +25,9 @@ import de.westnordost.streetcomplete.overlays.Overlay import de.westnordost.streetcomplete.overlays.PolylineStyle import de.westnordost.streetcomplete.overlays.StrokeStyle import de.westnordost.streetcomplete.quests.cycleway.AddCycleway -import java.util.concurrent.FutureTask class CyclewayOverlay( - private val countryInfos: CountryInfos, - private val countryBoundaries: FutureTask + private val getCountryInfoByLocation: (location: LatLon) -> CountryInfo, ) : Overlay { override val title = R.string.overlay_cycleway @@ -49,11 +45,7 @@ class CyclewayOverlay( and area != yes """).mapNotNull { val pos = mapData.getWayGeometry(it.id)?.center ?: return@mapNotNull null - val countryInfo = countryInfos.getByLocation( - countryBoundaries.get(), - pos.longitude, - pos.latitude - ) + val countryInfo = getCountryInfoByLocation(pos) it to getStreetCyclewayStyle(it, countryInfo) } + // separately mapped ways diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt index 277928a29d..04b5f34350 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -3,7 +3,10 @@ package de.westnordost.streetcomplete.quests import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.osmfeatures.Feature import de.westnordost.osmfeatures.FeatureDictionary +import de.westnordost.streetcomplete.data.meta.CountryInfo import de.westnordost.streetcomplete.data.meta.CountryInfos +import de.westnordost.streetcomplete.data.meta.getByLocation +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.osmnotes.notequests.OsmNoteQuestType import de.westnordost.streetcomplete.data.quest.QuestTypeRegistry import de.westnordost.streetcomplete.quests.accepts_cards.AddAcceptsCards @@ -182,8 +185,11 @@ val questsModule = module { get(), get(), get(), - get(named("CountryBoundariesFuture")), - get(), + { location -> + val countryInfos = get() + val countryBoundaries = get>(named("CountryBoundariesFuture")).get() + countryInfos.getByLocation(countryBoundaries, location.longitude, location.latitude) + }, { tags -> get>(named("FeatureDictionaryFuture")) .get().getFeature(tags) @@ -195,9 +201,8 @@ val questsModule = module { fun questTypeRegistry( trafficFlowSegmentsApi: TrafficFlowSegmentsApi, trafficFlowDao: WayTrafficFlowDao, - countryInfos: CountryInfos, - countryBoundariesFuture: FutureTask, arSupportChecker: ArSupportChecker, + getCountryInfoByLocation: (location: LatLon) -> CountryInfo, getFeature: (tags: Map) -> Feature?, ) = QuestTypeRegistry(listOf( @@ -474,7 +479,7 @@ fun questTypeRegistry( 134 to AddSidewalk(), // for any pedestrian routers, needs minimal thinking 135 to AddRoadSurface(), // used by BRouter, OsmAnd, OSRM, graphhopper, HOT map style... - sometimes requires way to be split 136 to AddTracktype(), // widely used in map rendering - OSM Carto, OsmAnd... - 137 to AddCycleway(countryInfos, countryBoundariesFuture), // for any cyclist routers (and cyclist maps) + 137 to AddCycleway(getCountryInfoByLocation), // for any cyclist routers (and cyclist maps) 138 to AddLanes(), // abstreet, certainly most routing engines - often requires way to be split // disabled completely because definition is too fuzzy/broad to be useful and easy to answer, @@ -500,7 +505,7 @@ fun questTypeRegistry( // buildings 150 to AddBuildingType(), 151 to AddBuildingLevels(), - 152 to AddRoofShape(countryInfos, countryBoundariesFuture), + 152 to AddRoofShape(getCountryInfoByLocation), 153 to AddStepCount(), // can only be gathered when walking along this way, also needs the most effort and least useful diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/cycleway/AddCycleway.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/cycleway/AddCycleway.kt index f2db3f0a59..33e4068db5 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/cycleway/AddCycleway.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/cycleway/AddCycleway.kt @@ -1,15 +1,13 @@ package de.westnordost.streetcomplete.quests.cycleway -import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.data.elementfilter.filters.RelativeDate import de.westnordost.streetcomplete.data.elementfilter.filters.TagOlderThan import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression import de.westnordost.streetcomplete.data.meta.CountryInfo -import de.westnordost.streetcomplete.data.meta.CountryInfos -import de.westnordost.streetcomplete.data.meta.getByLocation import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry import de.westnordost.streetcomplete.data.osm.mapdata.filter import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType @@ -25,11 +23,9 @@ import de.westnordost.streetcomplete.osm.cycleway.applyTo import de.westnordost.streetcomplete.osm.cycleway.createCyclewaySides import de.westnordost.streetcomplete.osm.cycleway.isAmbiguous import de.westnordost.streetcomplete.osm.surface.ANYTHING_UNPAVED -import java.util.concurrent.FutureTask class AddCycleway( - private val countryInfos: CountryInfos, - private val countryBoundariesFuture: FutureTask, + private val getCountryInfoByLocation: (location: LatLon) -> CountryInfo, ) : OsmElementQuestType { override val changesetComment = "Specify whether there are cycleways" @@ -85,12 +81,8 @@ class AddCycleway( val eligibleRoads = mapData.ways.filter { roadsFilter.matches(it) } val roadsWithMissingCycleway = eligibleRoads.filter { untaggedRoadsFilter.matches(it) } val oldRoadsWithKnownCycleways = eligibleRoads.filter { way -> - val countryInfo = mapData.getWayGeometry(way.id)?.center?.let { p -> - countryInfos.getByLocation( - countryBoundariesFuture.get(), - p.longitude, - p.latitude, - ) + val countryInfo = mapData.getWayGeometry(way.id)?.center?.let { + getCountryInfoByLocation(it) } way.hasOldInvalidOrAmbiguousCyclewayTags(countryInfo) == true } @@ -107,11 +99,7 @@ class AddCycleway( override fun createForm() = AddCyclewayForm() override fun applyAnswerTo(answer: LeftAndRightCycleway, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { - val countryInfo = countryInfos.getByLocation( - countryBoundariesFuture.get(), - geometry.center.longitude, - geometry.center.latitude - ) + val countryInfo = getCountryInfoByLocation(geometry.center) answer.applyTo(tags, countryInfo.isLeftHandTraffic) } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/roof_shape/AddRoofShape.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/roof_shape/AddRoofShape.kt index 89b7a28203..e27a02d86c 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/roof_shape/AddRoofShape.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/roof_shape/AddRoofShape.kt @@ -1,22 +1,19 @@ package de.westnordost.streetcomplete.quests.roof_shape -import de.westnordost.countryboundaries.CountryBoundaries import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression -import de.westnordost.streetcomplete.data.meta.CountryInfos -import de.westnordost.streetcomplete.data.meta.getByLocation +import de.westnordost.streetcomplete.data.meta.CountryInfo import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.LatLon import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.BUILDING import de.westnordost.streetcomplete.osm.BUILDINGS_WITH_LEVELS import de.westnordost.streetcomplete.osm.Tags -import java.util.concurrent.FutureTask class AddRoofShape( - private val countryInfos: CountryInfos, - private val countryBoundariesFuture: FutureTask, + private val getCountryInfoByLocation: (location: LatLon) -> CountryInfo, ) : OsmElementQuestType { private val filter by lazy { """ @@ -58,11 +55,7 @@ class AddRoofShape( private fun roofsAreUsuallyFlatAt(element: Element, mapData: MapDataWithGeometry): Boolean? { val center = mapData.getGeometry(element.type, element.id)?.center ?: return null - return countryInfos.getByLocation( - countryBoundariesFuture.get(), - center.longitude, - center.latitude, - ).roofsAreUsuallyFlat + return getCountryInfoByLocation(center).roofsAreUsuallyFlat } override fun applyAnswerTo(answer: RoofShape, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) {