From e55eed5e934c52e55e79d3bfe0ccac3c59f20505 Mon Sep 17 00:00:00 2001 From: paukli Date: Fri, 10 Oct 2025 14:58:12 +0200 Subject: [PATCH 1/2] implmented AddFerryFee --- .../streetcomplete/quests/QuestsModule.kt | 2 + .../quests/ferry/AddFerryFee.kt | 57 +++++++++++++++++++ app/src/androidMain/res/values/strings.xml | 1 + .../main/res/drawable/ic_quest_ferry_fee.xml | 53 +++++++++++++++++ res/graphics/quest/ferry_fee.svg | 16 ++++++ 5 files changed, 129 insertions(+) create mode 100644 app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt create mode 100644 app/src/main/res/drawable/ic_quest_ferry_fee.xml create mode 100644 res/graphics/quest/ferry_fee.svg diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt index 0683905c107..bf238ced009 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -83,6 +83,7 @@ import de.westnordost.streetcomplete.quests.drinking_water_type.AddDrinkingWater import de.westnordost.streetcomplete.quests.existence.CheckExistence import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessMotorVehicle import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessPedestrian +import de.westnordost.streetcomplete.quests.ferry.AddFerryFee import de.westnordost.streetcomplete.quests.fire_hydrant.AddFireHydrantType import de.westnordost.streetcomplete.quests.fire_hydrant_diameter.AddFireHydrantDiameter import de.westnordost.streetcomplete.quests.fire_hydrant_position.AddFireHydrantPosition @@ -438,6 +439,7 @@ fun questTypeRegistry( // ferry: usually visible from looking at the boat, but not always... 101 to AddFerryAccessPedestrian(), 102 to AddFerryAccessMotorVehicle(), + 185 to AddFerryFee(), 103 to AddProhibitedForPedestrians(), // need to understand the pedestrian situation diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt new file mode 100644 index 00000000000..6f8fbcc0e60 --- /dev/null +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt @@ -0,0 +1,57 @@ +package de.westnordost.streetcomplete.quests.ferry + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression +import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Way +import de.westnordost.streetcomplete.data.osm.mapdata.filter +import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType +import de.westnordost.streetcomplete.data.quest.AndroidQuest +import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.CAR +import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.RARE +import de.westnordost.streetcomplete.osm.Tags +import de.westnordost.streetcomplete.quests.YesNoQuestForm +import de.westnordost.streetcomplete.util.ktx.toYesNo + +class AddFerryFee : OsmElementQuestType, AndroidQuest { + + private val filter by lazy { + ("""ways, relations with + route = ferry + and !fee + and !toll""" + ).toElementFilterExpression() + } + override val changesetComment = "Specify ferry fee" + override val wikiLink = "Tag:route=ferry" + override val icon = R.drawable.ic_quest_ferry_fee + override val hasMarkersAtEnds = true + override val achievements = listOf(RARE) + + override fun getTitle(tags: Map) = R.string.quest_ferry_fee_title + + override fun createForm() = YesNoQuestForm() + + override fun applyAnswerTo(answer: Boolean, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { + tags["fee"] = answer.toYesNo() + } + + override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable { + // the quest shall not be asked for ways tagged with route=ferry that are part of a relation + // also tagged with route=ferry because that makes the former not actually a "real" ferry + // route (╯°□°)╯︵ ┻━┻. Tagging mistake or not, it is very common tagging (#6373) + val wayIdsInFerryRoutes = wayIdsInFerryRoutes(mapData.relations) + return mapData + .filter(filter) + .filter { it !is Way || it.id !in wayIdsInFerryRoutes } + .asIterable() + } + + override fun isApplicableTo(element: Element): Boolean? { + if (!filter.matches(element)) return false + if (element is Way) return null + return true + } +} diff --git a/app/src/androidMain/res/values/strings.xml b/app/src/androidMain/res/values/strings.xml index c34dde495d1..d21cfd323bd 100644 --- a/app/src/androidMain/res/values/strings.xml +++ b/app/src/androidMain/res/values/strings.xml @@ -1121,6 +1121,7 @@ A level counts as a roof level when its windows are in the roof. Subsequently, r Does this ferry route transport pedestrians? Does this ferry route transport motor vehicles? + Is there a fee for anyone to use this ferry? What diameter is specified on the sign for this fire hydrant? This diameter looks implausible, it is usually between %1$d and %2$d. diff --git a/app/src/main/res/drawable/ic_quest_ferry_fee.xml b/app/src/main/res/drawable/ic_quest_ferry_fee.xml new file mode 100644 index 00000000000..f213806bed2 --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_ferry_fee.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + diff --git a/res/graphics/quest/ferry_fee.svg b/res/graphics/quest/ferry_fee.svg new file mode 100644 index 00000000000..03aaa90f07a --- /dev/null +++ b/res/graphics/quest/ferry_fee.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 7107921a6c532ea723cae949d22b103d8013d4f9 Mon Sep 17 00:00:00 2001 From: paukli Date: Sat, 11 Oct 2025 00:18:35 +0200 Subject: [PATCH 2/2] removed duplicate comment --- .../de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt index 6f8fbcc0e60..f3a76b70622 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryFee.kt @@ -39,9 +39,6 @@ class AddFerryFee : OsmElementQuestType, AndroidQuest { } override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable { - // the quest shall not be asked for ways tagged with route=ferry that are part of a relation - // also tagged with route=ferry because that makes the former not actually a "real" ferry - // route (╯°□°)╯︵ ┻━┻. Tagging mistake or not, it is very common tagging (#6373) val wayIdsInFerryRoutes = wayIdsInFerryRoutes(mapData.relations) return mapData .filter(filter)