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 c8e40c8db76..12aad0d5c57 100644
--- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt
+++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt
@@ -124,6 +124,9 @@ import de.westnordost.streetcomplete.quests.lanes.AddLanes
import de.westnordost.streetcomplete.quests.leaf_detail.AddForestLeafType
import de.westnordost.streetcomplete.quests.leaf_detail.AddTreeLeafType
import de.westnordost.streetcomplete.quests.level.AddLevel
+import de.westnordost.streetcomplete.quests.lgbtq.LGBTQAccessQuest
+import de.westnordost.streetcomplete.quests.lgbtq.LGBTQGenderSpecializationQuest
+import de.westnordost.streetcomplete.quests.lgbtq.LGBTQTransgenderSpecializationQuest
import de.westnordost.streetcomplete.quests.map.AddMapSize
import de.westnordost.streetcomplete.quests.map.AddMapType
import de.westnordost.streetcomplete.quests.max_height.AddMaxHeight
@@ -656,6 +659,9 @@ fun getQuestTypeList(
EE_QUEST_OFFSET + 54 to AddLampType(),
EE_QUEST_OFFSET + 55 to AddPostOfficeType(),
EE_QUEST_OFFSET + 57 to AddLampMount(),
+ EE_QUEST_OFFSET + 58 to LGBTQAccessQuest(),
+ EE_QUEST_OFFSET + 59 to LGBTQGenderSpecializationQuest(),
+ EE_QUEST_OFFSET + 60 to LGBTQTransgenderSpecializationQuest(),
EE_QUEST_OFFSET + 10 to OsmoseQuest(osmoseDao),
EE_QUEST_OFFSET + 11 to CustomQuest(customQuestList),
// POI quests
diff --git a/app/src/androidMain/res/drawable-xhdpi/lgbtq_welcome.jpg b/app/src/androidMain/res/drawable-xhdpi/lgbtq_welcome.jpg
new file mode 100644
index 00000000000..54c5c683776
Binary files /dev/null and b/app/src/androidMain/res/drawable-xhdpi/lgbtq_welcome.jpg differ
diff --git a/app/src/androidMain/res/drawable/ic_quest_gender.xml b/app/src/androidMain/res/drawable/ic_quest_gender.xml
new file mode 100644
index 00000000000..a5ab691dd21
--- /dev/null
+++ b/app/src/androidMain/res/drawable/ic_quest_gender.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/app/src/androidMain/res/drawable/ic_quest_lgbtq.xml b/app/src/androidMain/res/drawable/ic_quest_lgbtq.xml
new file mode 100644
index 00000000000..a80c44a3dcf
--- /dev/null
+++ b/app/src/androidMain/res/drawable/ic_quest_lgbtq.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/androidMain/res/drawable/ic_quest_trans.xml b/app/src/androidMain/res/drawable/ic_quest_trans.xml
new file mode 100644
index 00000000000..5ccd2ed8a0e
--- /dev/null
+++ b/app/src/androidMain/res/drawable/ic_quest_trans.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/app/src/androidMain/res/values/strings.xml b/app/src/androidMain/res/values/strings.xml
index 6cd4fd5c6ac..3df2c96df86 100644
--- a/app/src/androidMain/res/values/strings.xml
+++ b/app/src/androidMain/res/values/strings.xml
@@ -1185,6 +1185,24 @@ If any lanes are reserved for buses, please leave a note instead."
Does this tree have needles or leaves?
"It’s just a tree stump"
+ Is there signage displaying its relation to LGBTQ people?
+
+ What is this place’s relation to LGBTQ people?
+ banned
+ explicitly welcome
+ target audience
+ only
+ not posted/hide forever
+
+ Does this venue cater to specific groups within the LGBTQ community?
+ Men
+ Woman
+ Non Binary People
+ All Groups
+
+ Does this venue cater specifically to trans people?
+ Transgender people are banned
+
On which level number is this place located?
"Is it lit here?"
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt
new file mode 100644
index 00000000000..e428d931b0b
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt
@@ -0,0 +1,160 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.data.quest.AllCountriesExcept
+
+// countries with a LGBT propaganda law, and not in the list of country
+// where homosexuality is illegal
+val LGBTPropagandaCountries =
+ listOf(
+ // Belarus, see https://www.reuters.com/world/europe/belarus-prepares-law-against-lgbt-propaganda-state-media-says-2024-02-19/
+ // "BY",
+ // Georgia, see https://oc-media.org/georgian-dream-announces-draft-law-against-pseudo-liberal-ideology/
+ // "GE",
+ // Kyrgyzstan, see https://en.wikipedia.org/wiki/Kyrgyz_anti-LGBT_propaganda_law
+ "KY",
+ // Russia, since 2013 and worst since 2023
+ "RU",
+ )
+
+// countries where homosexuality is illegal
+// even if unenforced or just for male
+val LGBTHomosexualityIllegalCountries =
+ listOf(
+ // United Arab Emirates
+ "AE",
+ // Afghanistan
+ "AF",
+ // Bangladesh
+ "BD",
+ // Burundi
+ "BI",
+ // Brunei Darussalam
+ "BN",
+ // Cameroon
+ "CM",
+ // Dominica
+ "DM",
+ // Algeria
+ "DZ",
+ // Egypt
+ "EG",
+ // Eritrea
+ "ER",
+ // Ethiopia
+ "ET",
+ // Grenada
+ "GD",
+ // Ghana
+ "GH",
+ // Gambia
+ "GM",
+ // Guinea
+ "GN",
+ // Guyana
+ "GY",
+ // Indonesia
+ // not illegal, except in one province where it is enforced
+ "ID",
+ // Iraq
+ "IQ",
+ // Iran
+ "IR",
+ // Jamaica
+ "JM",
+ // Kenya
+ "KE",
+ // Kiribati, just for male, but not enforced
+ "KI",
+ // Comoros
+ "KM",
+ // Kuwait, just for male
+ "KW",
+ // Lebanon, unsure in 2024, cf wikipedia
+ "LB",
+ // Sri Lanka
+ "LK",
+ // Liberia
+ "LR",
+ // Libya
+ "LY",
+ // Morocco
+ "MA",
+ // Myanmar
+ "MM",
+ // Mauritania
+ "MR",
+ // Maldives, not enforced
+ "MV",
+ // Malawi
+ "MW",
+ // Malaysia
+ "MY",
+ // Namibia, not enforced
+ "NA",
+ // Nigeria
+ "NG",
+ // Niue
+ "NU",
+ // Oman
+ "OM",
+ // Papua New Guinea , illegal for male only
+ "PG",
+ // Pakistan
+ "PK",
+ // Qatar
+ "QA",
+ // Saudi Arabia
+ "SA",
+ // Solomon Islands
+ "SB",
+ // Sudan
+ "SD",
+ // Sierra Leone, illegal for male only
+ "SL",
+ // Senegal
+ "SN",
+ // Somalia
+ "SO",
+ // South Sudan
+ "SS",
+ // Eswatini
+ "SZ",
+ // Chad
+ "TD",
+ // Togo
+ "TG",
+ // Turkmenistan, illegal for male only
+ "TM",
+ // Tunisia
+ "TN",
+ // Tonga, illegal for male only
+ "TO",
+ // Tuvalu,illegal for male only, not enforced
+ "TV",
+ // Tanzania
+ "TZ",
+ // Uganda
+ "UG",
+ // Uzbekistan, illegal for male only
+ "UZ",
+ // Saint Lucia
+ "WL",
+ // Samoa, illegal for male only, not enforced
+ "WS",
+ // Saint Vincent and the Grenadines
+ "WV",
+ // Yemen
+ "YE",
+ // Zambia
+ "ZM",
+ // Zimbabwe
+ "ZW"
+ )
+
+// country where mapping would be fruitless and/or dangerous
+val LGBTExcludedCountries = AllCountriesExcept(
+ listOf(
+ LGBTHomosexualityIllegalCountries,
+ LGBTPropagandaCountries
+ ).flatten()
+)
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt
new file mode 100644
index 00000000000..79df0b78b50
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt
@@ -0,0 +1,22 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+import de.westnordost.streetcomplete.quests.AListQuestForm
+import de.westnordost.streetcomplete.quests.AnswerItem
+import de.westnordost.streetcomplete.quests.TextItem
+
+class LGBTQAccessForm : AListQuestForm() {
+
+ override val items get() = listOf>(
+ TextItem("no", R.string.quest_lgbtq_access_no),
+ TextItem("welcome", R.string.quest_lgbtq_access_welcome),
+ TextItem("primary", R.string.quest_lgbtq_access_primary),
+ TextItem("only", R.string.quest_lgbtq_access_only),
+ )
+
+ override val otherAnswers get() = listOfNotNull(
+ AnswerItem(R.string.quest_lgbtq_access_not_marked) {
+ hideQuest()
+ },
+ )
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt
new file mode 100644
index 00000000000..e1af8fe7d92
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt
@@ -0,0 +1,45 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+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.osmquests.OsmFilterQuestType
+import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement
+import de.westnordost.streetcomplete.osm.Tags
+
+class LGBTQAccessQuest : OsmFilterQuestType() {
+ override val elementFilter = """
+ nodes, ways with (
+ amenity ~ swingerclub|nightclub|bar|pub|cafe|restaurant|place_of_worship|community_centre|library|doctors|social_facility|veterinary
+ or shop ~ erotic|books|music
+ or leisure ~ sauna|nightclub|nightlife
+ )
+ and (!seasonal or seasonal = no)
+ and !brand and !wikipedia:brand and !wikidata:brand
+ and !memorial and !historic
+ and !lgbtq
+ """
+
+ // countries that are listed here ban lgbtq people
+ override val enabledInCountries = LGBTExcludedCountries
+
+ override val changesetComment = "Survey lgbtq access"
+ override val wikiLink = "Key:lgbtq"
+ override val icon = R.drawable.ic_quest_lgbtq
+ override val achievements = listOf(EditTypeAchievement.CITIZEN)
+
+ override fun getTitle(tags: Map) = R.string.quest_lgbtq_access
+
+ override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable =
+ mapData.filter { isApplicableTo(it) }
+
+ override fun isApplicableTo(element: Element): Boolean = filter.matches(element)
+ override fun createForm() = LGBTQAccessForm()
+
+ override fun applyAnswerTo(answer: String?, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) {
+ answer?.let {
+ tags["lgbtq"] = it
+ }
+ }
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecialization.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecialization.kt
new file mode 100644
index 00000000000..6746389fba7
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecialization.kt
@@ -0,0 +1,8 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+enum class LGBTQGenderSpecialization {
+ NONE,
+ MEN,
+ WOMEN,
+ NON_BINARY,
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationForm.kt
new file mode 100644
index 00000000000..9813a5d56ea
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationForm.kt
@@ -0,0 +1,14 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+import de.westnordost.streetcomplete.quests.AbstractOsmQuestForm
+import de.westnordost.streetcomplete.quests.AnswerItem
+
+class LGBTQGenderSpecializationForm : AbstractOsmQuestForm() {
+ override val buttonPanelAnswers = listOf(
+ AnswerItem(R.string.quest_lgbtq_gender_specialization_men) { applyAnswer(LGBTQGenderSpecialization.MEN) },
+ AnswerItem(R.string.quest_lgbtq_gender_specialization_woman) { applyAnswer(LGBTQGenderSpecialization.WOMEN) },
+ AnswerItem(R.string.quest_lgbtq_gender_specialization_non_binary) { applyAnswer(LGBTQGenderSpecialization.NON_BINARY) },
+ AnswerItem(R.string.quest_lgbtq_gender_specialization_none) { applyAnswer(LGBTQGenderSpecialization.NONE) },
+ )
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt
new file mode 100644
index 00000000000..fd6fd06cfa2
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt
@@ -0,0 +1,44 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry
+import de.westnordost.streetcomplete.data.osm.osmquests.OsmFilterQuestType
+import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement
+import de.westnordost.streetcomplete.osm.Tags
+
+class LGBTQGenderSpecializationQuest : OsmFilterQuestType() {
+ override val elementFilter = """
+ nodes with lgbtq ~ primary|only and !(lgbtq:men or lgbtq:woman or lgbtq:non_binary)
+ and !memorial and !historic
+ """
+
+ // countries that are listed here ban lgbtq people
+ override val enabledInCountries = LGBTExcludedCountries
+
+ override val changesetComment = "Survey lgbtq specificity"
+ override val wikiLink = "Key:lgbtq"
+ override val icon = R.drawable.ic_quest_gender
+ override val achievements = listOf(EditTypeAchievement.CITIZEN)
+
+ override fun getTitle(tags: Map) = R.string.quest_lgbtq_gender_specialization
+
+ override fun createForm() = LGBTQGenderSpecializationForm()
+
+ override fun applyAnswerTo(answer: LGBTQGenderSpecialization, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) =
+ when (answer) {
+ LGBTQGenderSpecialization.NONE -> {
+ tags["lgbtq:men"] = "welcome"
+ tags["lgbtq:woman"] = "welcome"
+ tags["lgbtq:non_binary"] = "welcome"
+ }
+ LGBTQGenderSpecialization.MEN -> {
+ tags["lgbtq:men"] = tags["lgbtq"] ?: "primary"
+ }
+ LGBTQGenderSpecialization.WOMEN -> {
+ tags["lgbtq:woman"] = tags["lgbtq"] ?: "primary"
+ }
+ LGBTQGenderSpecialization.NON_BINARY -> {
+ tags["lgbtq:non_binary"] = tags["lgbtq"] ?: "primary"
+ }
+ }
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecialization.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecialization.kt
new file mode 100644
index 00000000000..3ceb35006cc
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecialization.kt
@@ -0,0 +1,7 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+enum class LGBTQTransgenderSpecialization {
+ YES,
+ NO,
+ BANNED,
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationForm.kt
new file mode 100644
index 00000000000..c3807f05e68
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationForm.kt
@@ -0,0 +1,25 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+import de.westnordost.streetcomplete.quests.AbstractOsmQuestForm
+import de.westnordost.streetcomplete.quests.AnswerItem
+
+class LGBTQTransgenderSpecializationForm : AbstractOsmQuestForm() {
+ override val buttonPanelAnswers = listOf(
+ AnswerItem(R.string.quest_generic_hasFeature_no) {
+ applyAnswer(
+ LGBTQTransgenderSpecialization.NO
+ )
+ },
+ AnswerItem(R.string.quest_generic_hasFeature_yes) {
+ applyAnswer(
+ LGBTQTransgenderSpecialization.YES
+ )
+ },
+ AnswerItem(R.string.quest_lgbtq_transgender_specialization_banned) {
+ applyAnswer(
+ LGBTQTransgenderSpecialization.BANNED
+ )
+ },
+ )
+}
diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt
new file mode 100644
index 00000000000..95fa5419655
--- /dev/null
+++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt
@@ -0,0 +1,41 @@
+package de.westnordost.streetcomplete.quests.lgbtq
+
+import de.westnordost.streetcomplete.R
+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.osmquests.OsmFilterQuestType
+import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement
+import de.westnordost.streetcomplete.osm.Tags
+
+class LGBTQTransgenderSpecializationQuest : OsmFilterQuestType() {
+ override val elementFilter = """
+ nodes, ways with lgbtq ~ primary|only and !lgbtq:trans
+ and !memorial and !historic
+ """
+
+ // countries that are listed here ban lgbtq people
+ override val enabledInCountries = LGBTExcludedCountries
+
+ override val changesetComment = "Survey lgbtq transgender specialization"
+ override val wikiLink = "Key:lgbtq"
+ override val icon = R.drawable.ic_quest_trans
+ override val achievements = listOf(EditTypeAchievement.CITIZEN)
+
+ override fun getTitle(tags: Map) = R.string.quest_lgbtq_transgender_specialization
+
+ override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable =
+ mapData.filter { isApplicableTo(it) }
+
+ override fun isApplicableTo(element: Element): Boolean = filter.matches(element)
+
+ override fun applyAnswerTo(answer: LGBTQTransgenderSpecialization, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) {
+ when (answer) {
+ LGBTQTransgenderSpecialization.YES -> tags["lgbtq:trans"] = "primary"
+ LGBTQTransgenderSpecialization.NO -> tags["lgbtq:trans"] = "welcome"
+ LGBTQTransgenderSpecialization.BANNED -> tags["lgbtq:trans"] = "no"
+ }
+ }
+
+ override fun createForm() = LGBTQTransgenderSpecializationForm()
+}
diff --git a/res/graphics/authors.txt b/res/graphics/authors.txt
index 30fbca5c965..85819dc703b 100644
--- a/res/graphics/authors.txt
+++ b/res/graphics/authors.txt
@@ -317,6 +317,7 @@ quest/
footway_surface.svg
footway_surface_detail.svg
fuel.svg
+ gender.svg Flavia Telcean, License: CC-BY-SA 4.0
glutenfree.svg created with elements from CC0 https://www.svgrepo.com/svg/269879/cereal-wheat
hairdresser.svg modified from scissors.svg by Matija Nalis (CC0 for modifications)
housenumber.svg
@@ -330,6 +331,7 @@ quest/
laundry.svg
leaf.svg
level.svg
+ lgbtq.svg Flavia Telcean, License: CC-BY-SA 4.0, traced from https://wiki.openstreetmap.org/wiki/File:AllPeopleSticker.jpg
mail.svg
mail_ref.svg
max_width.svg
@@ -423,6 +425,7 @@ quest/
toilets_wheelchair.svg
tractor.svg
traffic_lights.svg
+ trans.svg Flavia Telcean, License: CC-BY-SA 4.0, based on https://commons.wikimedia.org/wiki/File:Gender_sign_(bold).svg
via_ferrata_scale.svg https://www.svgrepo.com/svg/137349/climbing (CC0) and based on way_surface.svg
way_surface.svg
way_surface_detail.svg Tobias Zwick (CC-BY-SA 4.0) (based on street_surface_detail.svg), recoloured background by Flo Edelmann
diff --git a/res/graphics/quest/gender.svg b/res/graphics/quest/gender.svg
new file mode 100644
index 00000000000..a6d9bc41984
--- /dev/null
+++ b/res/graphics/quest/gender.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/res/graphics/quest/lgbtq.svg b/res/graphics/quest/lgbtq.svg
new file mode 100644
index 00000000000..3a5b323ca30
--- /dev/null
+++ b/res/graphics/quest/lgbtq.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/res/graphics/quest/trans.svg b/res/graphics/quest/trans.svg
new file mode 100644
index 00000000000..4ec88a173ba
--- /dev/null
+++ b/res/graphics/quest/trans.svg
@@ -0,0 +1,2 @@
+
+