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 d088b6af6d..03b0658ebb 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -118,6 +118,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 @@ -637,6 +640,9 @@ fun getQuestTypeList( EE_QUEST_OFFSET + 50 to AddCaravanSiteType(), EE_QUEST_OFFSET + 52 to AddSaunaAvailability(), EE_QUEST_OFFSET + 53 to AddSwimmingPoolAvailability(), + EE_QUEST_OFFSET + 54 to LGBTQAccessQuest(), + EE_QUEST_OFFSET + 55 to LGBTQGenderSpecializationQuest(), + EE_QUEST_OFFSET + 56 to LGBTQTransgenderSpecializationQuest(), EE_QUEST_OFFSET + 10 to OsmoseQuest(osmoseDao), EE_QUEST_OFFSET + 11 to CustomQuest(customQuestList), // POI quests 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 0000000000..e428d931b0 --- /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 0000000000..79df0b78b5 --- /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 0000000000..e1af8fe7d9 --- /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 0000000000..95a9a7d60a --- /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, + WOMAN, + 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 0000000000..9a952f684f --- /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.WOMAN) }, + 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 0000000000..28d6666acb --- /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.WOMAN -> { + 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 0000000000..3ceb35006c --- /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 0000000000..c3807f05e6 --- /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 0000000000..95fa541965 --- /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/app/src/main/res/drawable-xhdpi/lgbtq_welcome.jpg b/app/src/main/res/drawable-xhdpi/lgbtq_welcome.jpg new file mode 100644 index 0000000000..54c5c68377 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/lgbtq_welcome.jpg differ diff --git a/app/src/main/res/drawable/ic_quest_gender.xml b/app/src/main/res/drawable/ic_quest_gender.xml new file mode 100644 index 0000000000..a5ab691dd2 --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_gender.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_quest_lgbtq.xml b/app/src/main/res/drawable/ic_quest_lgbtq.xml new file mode 100644 index 0000000000..a80c44a3dc --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_lgbtq.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_quest_trans.xml b/app/src/main/res/drawable/ic_quest_trans.xml new file mode 100644 index 0000000000..5ccd2ed8a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_trans.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe27cde668..dd30ab471e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1139,6 +1139,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/res/graphics/authors.txt b/res/graphics/authors.txt index a0b2eda63f..eb1e1ddc59 100644 --- a/res/graphics/authors.txt +++ b/res/graphics/authors.txt @@ -316,6 +316,7 @@ quest/ footway_surface.svg footway_surface_detail.svg fuel.svg + gender.svg Flavia Telcean, License: CC-BY-SA 4.0 hairdresser.svg modified from scissors.svg by Matija Nalis (CC0 for modifications) housenumber.svg housenumber_street.svg @@ -328,6 +329,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 @@ -418,6 +420,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 0000000000..a6d9bc4198 --- /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 0000000000..3a5b323ca3 --- /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 0000000000..4ec88a173b --- /dev/null +++ b/res/graphics/quest/trans.svg @@ -0,0 +1,2 @@ + +