From 83c725fc4f0c4848c6c01e861087848f15acb149 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Fri, 1 Mar 2024 20:41:13 -0600 Subject: [PATCH 01/19] created quests for lgbtq people --- .../streetcomplete/quests/QuestsModule.kt | 28 +++++--- .../quests/lgbtq/ExcludedCountries.kt | 64 +++++++++++++++++++ .../quests/lgbtq/LGBTQAccess.kt | 30 +++++++++ .../quests/lgbtq/LGBTQAccessAnswer.kt | 5 ++ .../quests/lgbtq/LGBTQAccessForm.kt | 28 ++++++++ .../quests/lgbtq/LGBTQAccessQuest.kt | 41 ++++++++++++ .../quests/lgbtq/LGBTQGenderSpecialization.kt | 8 +++ .../lgbtq/LGBTQGenderSpecializationForm.kt | 14 ++++ .../lgbtq/LGBTQGenderSpecializationQuest.kt | 45 +++++++++++++ .../quests/lgbtq/LGBTQSignedQuest.kt | 49 ++++++++++++++ .../lgbtq/LGBTQTransgenderSpecialization.kt | 7 ++ .../LGBTQTransgenderSpecializationForm.kt | 25 ++++++++ .../LGBTQTransgenderSpecializationQuest.kt | 41 ++++++++++++ app/src/main/res/values/strings.xml | 18 ++++++ 14 files changed, 393 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecialization.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationForm.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecialization.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationForm.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt 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 e60f34f074..0a9ec368ec 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -10,8 +10,6 @@ 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.osmnotes.notequests.OsmNoteQuestType -import de.westnordost.streetcomplete.quests.osmose.OsmoseDao -import de.westnordost.streetcomplete.quests.osmose.OsmoseQuest import de.westnordost.streetcomplete.data.quest.QuestTypeRegistry import de.westnordost.streetcomplete.quests.accepts_cards.AddAcceptsCards import de.westnordost.streetcomplete.quests.accepts_cash.AddAcceptsCash @@ -22,15 +20,15 @@ import de.westnordost.streetcomplete.quests.air_conditioning.AddAirConditioning import de.westnordost.streetcomplete.quests.air_pump.AddAirCompressor import de.westnordost.streetcomplete.quests.air_pump.AddBicyclePump import de.westnordost.streetcomplete.quests.amenity_cover.AddAmenityCover -import de.westnordost.streetcomplete.quests.artwork.AddArtworkType import de.westnordost.streetcomplete.quests.amenity_indoor.AddIsAmenityIndoor +import de.westnordost.streetcomplete.quests.artwork.AddArtworkType import de.westnordost.streetcomplete.quests.atm_cashin.AddAtmCashIn import de.westnordost.streetcomplete.quests.atm_operator.AddAtmOperator import de.westnordost.streetcomplete.quests.baby_changing_table.AddBabyChangingTable import de.westnordost.streetcomplete.quests.barrier_bicycle_barrier_installation.AddBicycleBarrierInstallation import de.westnordost.streetcomplete.quests.barrier_bicycle_barrier_type.AddBicycleBarrierType -import de.westnordost.streetcomplete.quests.barrier_locked.AddBarrierLocked import de.westnordost.streetcomplete.quests.barrier_height.AddBarrierHeight +import de.westnordost.streetcomplete.quests.barrier_locked.AddBarrierLocked import de.westnordost.streetcomplete.quests.barrier_type.AddBarrierOnPath import de.westnordost.streetcomplete.quests.barrier_type.AddBarrierOnRoad import de.westnordost.streetcomplete.quests.barrier_type.AddBarrierType @@ -47,8 +45,8 @@ import de.westnordost.streetcomplete.quests.bike_shop.AddBikeRepairAvailability import de.westnordost.streetcomplete.quests.bike_shop.AddSecondHandBicycleAvailability import de.westnordost.streetcomplete.quests.board_type.AddBoardType import de.westnordost.streetcomplete.quests.bollard_type.AddBollardType -import de.westnordost.streetcomplete.quests.bridge_structure.AddBridgeStructure import de.westnordost.streetcomplete.quests.brewery.AddBrewery +import de.westnordost.streetcomplete.quests.bridge_structure.AddBridgeStructure import de.westnordost.streetcomplete.quests.building_colour.AddBuildingColour import de.westnordost.streetcomplete.quests.building_entrance.AddEntrance import de.westnordost.streetcomplete.quests.building_entrance_reference.AddEntranceReference @@ -80,8 +78,11 @@ import de.westnordost.streetcomplete.quests.crossing_kerb_height.AddCrossingKerb import de.westnordost.streetcomplete.quests.crossing_markings.AddCrossingMarkings import de.westnordost.streetcomplete.quests.crossing_signals.AddCrossingSignals import de.westnordost.streetcomplete.quests.cuisine.AddCuisine +import de.westnordost.streetcomplete.quests.custom.CustomQuest +import de.westnordost.streetcomplete.quests.custom.CustomQuestList import de.westnordost.streetcomplete.quests.cycleway.AddCycleway import de.westnordost.streetcomplete.quests.defibrillator.AddDefibrillatorLocation +import de.westnordost.streetcomplete.quests.destination.AddDestination import de.westnordost.streetcomplete.quests.diet_type.AddHalal import de.westnordost.streetcomplete.quests.diet_type.AddKosher import de.westnordost.streetcomplete.quests.diet_type.AddVegan @@ -89,9 +90,6 @@ import de.westnordost.streetcomplete.quests.diet_type.AddVegetarian import de.westnordost.streetcomplete.quests.drinking_water.AddDrinkingWater import de.westnordost.streetcomplete.quests.drinking_water_type.AddDrinkingWaterType import de.westnordost.streetcomplete.quests.existence.CheckExistence -import de.westnordost.streetcomplete.quests.custom.CustomQuestList -import de.westnordost.streetcomplete.quests.custom.CustomQuest -import de.westnordost.streetcomplete.quests.destination.AddDestination import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessMotorVehicle import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessPedestrian import de.westnordost.streetcomplete.quests.fire_hydrant.AddFireHydrantType @@ -116,6 +114,10 @@ import de.westnordost.streetcomplete.quests.kerb_height.AddKerbHeight import de.westnordost.streetcomplete.quests.lanes.AddLanes import de.westnordost.streetcomplete.quests.leaf_detail.AddForestLeafType 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.LGBTQSignedQuest +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 @@ -132,14 +134,16 @@ import de.westnordost.streetcomplete.quests.oneway_suspects.data.WayTrafficFlowD import de.westnordost.streetcomplete.quests.opening_hours.AddOpeningHours import de.westnordost.streetcomplete.quests.opening_hours_signed.CheckOpeningHoursSigned import de.westnordost.streetcomplete.quests.orchard_produce.AddOrchardProduce +import de.westnordost.streetcomplete.quests.osmose.OsmoseDao +import de.westnordost.streetcomplete.quests.osmose.OsmoseQuest import de.westnordost.streetcomplete.quests.parking_access.AddBikeParkingAccess import de.westnordost.streetcomplete.quests.parking_access.AddParkingAccess import de.westnordost.streetcomplete.quests.parking_fee.AddBikeParkingFee import de.westnordost.streetcomplete.quests.parking_fee.AddParkingFee import de.westnordost.streetcomplete.quests.parking_type.AddParkingType import de.westnordost.streetcomplete.quests.pharmacy.AddIsPharmacyDispensing -import de.westnordost.streetcomplete.quests.piste_lit.AddPisteLit import de.westnordost.streetcomplete.quests.piste_difficulty.AddPisteDifficulty +import de.westnordost.streetcomplete.quests.piste_lit.AddPisteLit import de.westnordost.streetcomplete.quests.piste_ref.AddPisteRef import de.westnordost.streetcomplete.quests.pitch_lit.AddPitchLit import de.westnordost.streetcomplete.quests.place_name.AddPlaceName @@ -171,7 +175,6 @@ import de.westnordost.streetcomplete.quests.shelter_type.AddShelterType import de.westnordost.streetcomplete.quests.shop_type.CheckShopExistence import de.westnordost.streetcomplete.quests.shop_type.CheckShopType import de.westnordost.streetcomplete.quests.shop_type.SpecifyShopType -import de.westnordost.streetcomplete.quests.show_poi.ShowSeating import de.westnordost.streetcomplete.quests.show_poi.ShowBicycleStuff import de.westnordost.streetcomplete.quests.show_poi.ShowBusiness import de.westnordost.streetcomplete.quests.show_poi.ShowCamera @@ -179,6 +182,7 @@ import de.westnordost.streetcomplete.quests.show_poi.ShowFixme import de.westnordost.streetcomplete.quests.show_poi.ShowMachine import de.westnordost.streetcomplete.quests.show_poi.ShowOther import de.westnordost.streetcomplete.quests.show_poi.ShowRecycling +import de.westnordost.streetcomplete.quests.show_poi.ShowSeating import de.westnordost.streetcomplete.quests.show_poi.ShowTrafficStuff import de.westnordost.streetcomplete.quests.show_poi.ShowVacant import de.westnordost.streetcomplete.quests.sidewalk.AddSidewalk @@ -624,6 +628,10 @@ fun getQuestTypeList( EE_QUEST_OFFSET + 40 to AddPisteLit(), EE_QUEST_OFFSET + 35 to AddPisteRef(), EE_QUEST_OFFSET + 36 to AddPisteDifficulty(), + EE_QUEST_OFFSET + 45 to LGBTQSignedQuest(), + EE_QUEST_OFFSET + 46 to LGBTQAccessQuest(), + EE_QUEST_OFFSET + 47 to LGBTQGenderSpecializationQuest(), + EE_QUEST_OFFSET + 48 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..d8a8e95f94 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt @@ -0,0 +1,64 @@ +package de.westnordost.streetcomplete.quests.lgbtq + +import de.westnordost.streetcomplete.data.quest.AllCountriesExcept + +val LGBTExcludedCountries = AllCountriesExcept( + listOf( + "AF", + "DZ", + "AO", + "AG", + "BD", + "BB", + "BI", + "CM", + "DM", + "EG", + "ER", + "ET", + "GH", + "GD", + "GN", + "GY", + "ID", + "JM", + "KE", + "KI", + "KW", + "LB", + "LR", + "LY", + "MW", + "MY", + "MV", + "MR", + "MU", + "MA", + "MM", + "NA", + "NG", + "OM", + "PK", + "PG", + "QA", + "WS", + "SA", + "SN", + "SL", + "SG", + "SB", + "SO", + "SS", + "LK", + "TG", + "TO", + "TN", + "TM", + "TV", + "UG", + "UZ", + "YE", + "ZM", + "ZW" + ) +) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt new file mode 100644 index 0000000000..f8da7050ce --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt @@ -0,0 +1,30 @@ +package de.westnordost.streetcomplete.quests.lgbtq + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.view.image_select.DisplayItem +import de.westnordost.streetcomplete.view.image_select.Item + +enum class LGTBQAccess(val osmValue: String) { + NO("no"), + WELCOME("welcome"), + PRIMARY("primary"), + ONLY("only"), +} + +fun List.toItems() = this.map { it.asItem() } +fun LGTBQAccess.asItem(): DisplayItem = Item(this, iconResId, titleResId) + +val LGTBQAccess.titleResId: Int get() = when (this) { + LGTBQAccess.NO -> R.string.quest_lgbtq_access_no + LGTBQAccess.WELCOME -> R.string.quest_lgbtq_access_welcome + LGTBQAccess.PRIMARY -> R.string.quest_lgbtq_access_primary + LGTBQAccess.ONLY -> R.string.quest_lgbtq_access_only +} + +// TOOD: populate icons +val LGTBQAccess.iconResId: Int get() = when (this) { + LGTBQAccess.NO -> R.drawable.surface_asphalt + LGTBQAccess.WELCOME -> R.drawable.surface_asphalt + LGTBQAccess.PRIMARY -> R.drawable.surface_asphalt + LGTBQAccess.ONLY -> R.drawable.surface_asphalt +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt new file mode 100644 index 0000000000..158726dfdc --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt @@ -0,0 +1,5 @@ +package de.westnordost.streetcomplete.quests.lgbtq + +data class LGBTQAccessAnswer( + val access: LGTBQAccess?, +) 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..7cdf3aae40 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -0,0 +1,28 @@ +package de.westnordost.streetcomplete.quests.lgbtq + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.quests.AImageListQuestForm +import de.westnordost.streetcomplete.quests.AnswerItem + +class LGBTQAccessForm: AImageListQuestForm() { + + override val items get() = listOf( + LGTBQAccess.NO, + LGTBQAccess.WELCOME, + LGTBQAccess.PRIMARY, + LGTBQAccess.ONLY + ).toItems() + + override val itemsPerRow = 3 + + override val otherAnswers get() = listOfNotNull( + AnswerItem(R.string.quest_lgbtq_access_not_marked) { + applyAnswer(LGBTQAccessAnswer(null)) + } + ) + + override fun onClickOk(selectedItems: List) { + val value = selectedItems.single() + applyAnswer(LGBTQAccessAnswer(value)) + } +} 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..3a1db3b0ae --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.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 LGBTQAccessQuest : OsmFilterQuestType() { + override val elementFilter = """ + nodes, ways with (!lgbtq and lgbtq:signed = yes) + """ + + // countries that are listed here ban lgbtq people + override val enabledInCountries = LGBTExcludedCountries + + override val changesetComment = "Survey lgbtq access" + override val wikiLink = "Key:lgbtq" + // TODO: replace me + override val icon = R.drawable.ic_quest_shop + 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: LGBTQAccessAnswer, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { + if (answer.access == null) { + tags["lgbtq:signed"] = "no" + } else { + tags["lgbtq"] = answer.access.osmValue + tags["lgbtq:signed"] = "yes" + } + } +} 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..a0f0ca8ca5 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.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.osmquests.OsmFilterQuestType +import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement +import de.westnordost.streetcomplete.osm.Tags + +class LGBTQGenderSpecializationQuest : OsmFilterQuestType() { + // TODO: filter out monuments + override val elementFilter = """ + nodes with lgbtq = primary and !(lgbtq:men or lgbtq:woman or lgbtq:non_binary) + """ + + // countries that are listed here ban lgbtq people + override val enabledInCountries = LGBTExcludedCountries + + override val changesetComment = "Survey lgbtq specificity" + override val wikiLink = "Key:lgbtq" + // TODO: replace me + override val icon = R.drawable.ic_quest_shop + 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"] = "primary" + } + LGBTQGenderSpecialization.WOMAN -> { + tags["lgbtq:woman"] = "primary" + } + LGBTQGenderSpecialization.NON_BINARY -> { + tags["lgbtq:non_binary"] = "primary" + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt new file mode 100644 index 0000000000..8ba7677b36 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt @@ -0,0 +1,49 @@ +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 +import de.westnordost.streetcomplete.quests.YesNoQuestForm + +class LGBTQSignedQuest : OsmFilterQuestType() { + override val elementFilter = """ + nodes, ways with ( + amenity ~ swingerclub|nightclub|bar|pub|cafe|restaurant|place_of_worship|community_centre|library|doctors|social_facility + or (shop ~ erotic|books) + or (leisure ~ sauna|nightclub|nightlife) + ) + and (!seasonal or seasonal = no) + and !brand and !wikipedia:brand and !wikidata:brand + and !lgbtq:signed + """ + + // countries that are listed here ban lgbtq people + override val enabledInCountries = LGBTExcludedCountries + + override val changesetComment = "Survey lgbtq access signed" + override val wikiLink = "Key:lgbtq" + // TODO: replace me + override val icon = R.drawable.ic_quest_shop + override val achievements = listOf(EditTypeAchievement.CITIZEN) + + override fun getTitle(tags: Map) = R.string.quest_lgbtq_signed + + override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable = + mapData.filter { isApplicableTo(it) } + + override fun isApplicableTo(element: Element): Boolean = filter.matches(element) + + override fun applyAnswerTo(answer: Boolean, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { + if (answer) { + tags["lgbtq:signed"] = "yes" + } else { + tags["lgbtq:signed"] = "no" + } + } + + override fun createForm() = YesNoQuestForm() +} 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..7fcdb94b72 --- /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 and !(lgbtq:trans) + """ + + // countries that are listed here ban lgbtq people + override val enabledInCountries = LGBTExcludedCountries + + override val changesetComment = "Survey lgbtq transgender specialization" + override val wikiLink = "Key:lgbtq" + // TODO: replace me + override val icon = R.drawable.ic_quest_shop + 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/values/strings.xml b/app/src/main/res/values/strings.xml index fe3deef476..3aa8adb946 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1103,6 +1103,24 @@ If any lanes are reserved for buses, please leave a note instead." Leaves Both are present + Is there signage displaying its relation to LGBTQ people? + + What is this places relation to LGBTQ people? + banned + explicitly welcome + target audience + only + not posted + + Does this venue cater to specific groups within the LGBTQ community? + Men + Woman + Enbys + All Groups + + Does this venue cater to specifically to trans people? + Transgender people are banned + On which level number is this place located? "Is it lit here?" From d4d6c8bfd08bba218332533521a3937388a42984 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Fri, 1 Mar 2024 21:32:31 -0600 Subject: [PATCH 02/19] added filter to not tag moments --- .../westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt | 1 + .../quests/lgbtq/LGBTQGenderSpecializationQuest.kt | 2 +- .../westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt | 1 + .../quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) 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 index 3a1db3b0ae..2c03b97d93 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt @@ -11,6 +11,7 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQAccessQuest : OsmFilterQuestType() { override val elementFilter = """ nodes, ways with (!lgbtq and lgbtq:signed = yes) + and !memorial and !historic """ // countries that are listed here ban lgbtq people 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 index a0f0ca8ca5..71577f556b 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt @@ -7,9 +7,9 @@ import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement import de.westnordost.streetcomplete.osm.Tags class LGBTQGenderSpecializationQuest : OsmFilterQuestType() { - // TODO: filter out monuments override val elementFilter = """ nodes with lgbtq = primary and !(lgbtq:men or lgbtq:woman or lgbtq:non_binary) + and !memorial and !historic """ // countries that are listed here ban lgbtq people diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt index 8ba7677b36..e3154434a2 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt @@ -18,6 +18,7 @@ class LGBTQSignedQuest : OsmFilterQuestType() { ) and (!seasonal or seasonal = no) and !brand and !wikipedia:brand and !wikidata:brand + and !memorial and !historic and !lgbtq:signed """ 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 index 7fcdb94b72..914ddf6dbb 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt @@ -11,6 +11,7 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQTransgenderSpecializationQuest : OsmFilterQuestType() { override val elementFilter = """ nodes, ways with lgbtq = primary and !(lgbtq:trans) + and !memorial and !historic """ // countries that are listed here ban lgbtq people From 3cce8ccdcf6276a6e8e2e7f4a48f0c7205492411 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Fri, 1 Mar 2024 21:35:57 -0600 Subject: [PATCH 03/19] added handling for lgbtq=only --- .../quests/lgbtq/LGBTQGenderSpecializationQuest.kt | 8 ++++---- .../quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) 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 index 71577f556b..e2517a7f59 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt @@ -8,7 +8,7 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQGenderSpecializationQuest : OsmFilterQuestType() { override val elementFilter = """ - nodes with lgbtq = primary and !(lgbtq:men or lgbtq:woman or lgbtq:non_binary) + nodes with lgbtq ~ primary|only and !(lgbtq:men or lgbtq:woman or lgbtq:non_binary) and !memorial and !historic """ @@ -33,13 +33,13 @@ class LGBTQGenderSpecializationQuest : OsmFilterQuestType { - tags["lgbtq:men"] = "primary" + tags["lgbtq:men"] = tags["lgbtq"] ?: "primary" } LGBTQGenderSpecialization.WOMAN -> { - tags["lgbtq:woman"] = "primary" + tags["lgbtq:woman"] = tags["lgbtq"] ?: "primary" } LGBTQGenderSpecialization.NON_BINARY -> { - tags["lgbtq:non_binary"] = "primary" + tags["lgbtq:non_binary"] = tags["lgbtq"] ?: "primary" } } } 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 index 914ddf6dbb..017a2ac2a7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt @@ -10,7 +10,7 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQTransgenderSpecializationQuest : OsmFilterQuestType() { override val elementFilter = """ - nodes, ways with lgbtq = primary and !(lgbtq:trans) + nodes, ways with lgbtq ~ primary|only and !(lgbtq:trans) and !memorial and !historic """ From 1f0f3ff6d82266572188bfde57577e74a7c78db5 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Fri, 1 Mar 2024 21:36:54 -0600 Subject: [PATCH 04/19] simplified filters --- .../streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt | 4 ++-- .../quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt index e3154434a2..ec6278d69c 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt @@ -13,8 +13,8 @@ class LGBTQSignedQuest : OsmFilterQuestType() { override val elementFilter = """ nodes, ways with ( amenity ~ swingerclub|nightclub|bar|pub|cafe|restaurant|place_of_worship|community_centre|library|doctors|social_facility - or (shop ~ erotic|books) - or (leisure ~ sauna|nightclub|nightlife) + or shop ~ erotic|books + or leisure ~ sauna|nightclub|nightlife ) and (!seasonal or seasonal = no) and !brand and !wikipedia:brand and !wikidata:brand 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 index 017a2ac2a7..a33c7c26b8 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt @@ -10,7 +10,7 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQTransgenderSpecializationQuest : OsmFilterQuestType() { override val elementFilter = """ - nodes, ways with lgbtq ~ primary|only and !(lgbtq:trans) + nodes, ways with lgbtq ~ primary|only and !lgbtq:trans and !memorial and !historic """ From 9a75e3420ac3f59ec03a971f50ee04ea483b80c9 Mon Sep 17 00:00:00 2001 From: Michael Scherer Date: Wed, 13 Mar 2024 17:47:04 +0100 Subject: [PATCH 05/19] Split the list of countries in 2 groups Document and sort the countries, along reasons for each list. --- .../quests/lgbtq/ExcludedCountries.kt | 136 +++++++++++++++--- 1 file changed, 117 insertions(+), 19 deletions(-) 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 index d8a8e95f94..975cca241d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt @@ -2,63 +2,161 @@ package de.westnordost.streetcomplete.quests.lgbtq import de.westnordost.streetcomplete.data.quest.AllCountriesExcept -val LGBTExcludedCountries = AllCountriesExcept( +// countries with a LGBT propaganda law, and not in the list of country +// where homosexuality is illega +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", - "DZ", - "AO", - "AG", + // Bangladesh "BD", - "BB", + // Burundi "BI", + // Brunei Darussalam + "BN", + // Cameroon "CM", + // Dominica "DM", + // Algeria + "DZ", + // Egypt "EG", + // Eritrea "ER", + // Ethiopia "ET", - "GH", + // 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", - "MW", - "MY", - "MV", - "MR", - "MU", + // Morocco "MA", + // Myanmar "MM", + // Mauritania + "MR", + // Maldives, not enforced + "MV", + // Malawi + "MW", + // Malaysia + "MY", + // Namibia, not enforced "NA", + // Nigeria "NG", + // Niue + "NU", + // Oman "OM", - "PK", + // Papua New Guinea , illegal for male only "PG", + // Pakistan + "PK", + // Qatar "QA", - "WS", + // Saudi Arabia "SA", - "SN", - "SL", - "SG", + // Solomon Islands "SB", + // Sudan + "SD", + // Sierra Leone, illegal for male only + "SL", + // Senegal + "SN", + // Somalia "SO", + // South Sudan "SS", - "LK", + // Eswatini + "SZ", + // Chad + "TD", + // Togo "TG", - "TO", - "TN", + // 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() +) From 9fcc65068586187c4079c4b63a3ed106cdbc64c8 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sat, 22 Jun 2024 21:13:21 -0500 Subject: [PATCH 06/19] removed lgbtq signed quest --- .../streetcomplete/quests/QuestsModule.kt | 8 ++- .../quests/lgbtq/LGBTQSignedQuest.kt | 50 ------------------- 2 files changed, 3 insertions(+), 55 deletions(-) delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt 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 0a9ec368ec..ff216caff8 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -116,7 +116,6 @@ import de.westnordost.streetcomplete.quests.leaf_detail.AddForestLeafType 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.LGBTQSignedQuest import de.westnordost.streetcomplete.quests.lgbtq.LGBTQTransgenderSpecializationQuest import de.westnordost.streetcomplete.quests.map.AddMapSize import de.westnordost.streetcomplete.quests.map.AddMapType @@ -628,10 +627,9 @@ fun getQuestTypeList( EE_QUEST_OFFSET + 40 to AddPisteLit(), EE_QUEST_OFFSET + 35 to AddPisteRef(), EE_QUEST_OFFSET + 36 to AddPisteDifficulty(), - EE_QUEST_OFFSET + 45 to LGBTQSignedQuest(), - EE_QUEST_OFFSET + 46 to LGBTQAccessQuest(), - EE_QUEST_OFFSET + 47 to LGBTQGenderSpecializationQuest(), - EE_QUEST_OFFSET + 48 to LGBTQTransgenderSpecializationQuest(), + EE_QUEST_OFFSET + 45 to LGBTQAccessQuest(), + EE_QUEST_OFFSET + 46 to LGBTQGenderSpecializationQuest(), + EE_QUEST_OFFSET + 47 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/LGBTQSignedQuest.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt deleted file mode 100644 index ec6278d69c..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQSignedQuest.kt +++ /dev/null @@ -1,50 +0,0 @@ -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 -import de.westnordost.streetcomplete.quests.YesNoQuestForm - -class LGBTQSignedQuest : OsmFilterQuestType() { - override val elementFilter = """ - nodes, ways with ( - amenity ~ swingerclub|nightclub|bar|pub|cafe|restaurant|place_of_worship|community_centre|library|doctors|social_facility - or shop ~ erotic|books - or leisure ~ sauna|nightclub|nightlife - ) - and (!seasonal or seasonal = no) - and !brand and !wikipedia:brand and !wikidata:brand - and !memorial and !historic - and !lgbtq:signed - """ - - // countries that are listed here ban lgbtq people - override val enabledInCountries = LGBTExcludedCountries - - override val changesetComment = "Survey lgbtq access signed" - override val wikiLink = "Key:lgbtq" - // TODO: replace me - override val icon = R.drawable.ic_quest_shop - override val achievements = listOf(EditTypeAchievement.CITIZEN) - - override fun getTitle(tags: Map) = R.string.quest_lgbtq_signed - - override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable = - mapData.filter { isApplicableTo(it) } - - override fun isApplicableTo(element: Element): Boolean = filter.matches(element) - - override fun applyAnswerTo(answer: Boolean, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { - if (answer) { - tags["lgbtq:signed"] = "yes" - } else { - tags["lgbtq:signed"] = "no" - } - } - - override fun createForm() = YesNoQuestForm() -} From f03893aa822e4ce57c85b18160b9909507305bde Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sat, 22 Jun 2024 21:13:38 -0500 Subject: [PATCH 07/19] formatted excluded countries --- .../quests/lgbtq/ExcludedCountries.kt | 158 +++++++++--------- 1 file changed, 78 insertions(+), 80 deletions(-) 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 index 975cca241d..ade97951ce 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt @@ -3,7 +3,7 @@ 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 illega +// 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/ @@ -14,144 +14,142 @@ val LGBTPropagandaCountries = "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 + // United Arab Emirates + "AE", + // Afghanistan "AF", - // Bangladesh + // Bangladesh "BD", - // Burundi + // Burundi "BI", - // Brunei Darussalam - "BN", - // Cameroon + // Brunei Darussalam + "BN", + // Cameroon "CM", - // Dominica + // Dominica "DM", - // Algeria + // Algeria "DZ", - // Egypt + // Egypt "EG", - // Eritrea + // Eritrea "ER", - // Ethiopia + // Ethiopia "ET", - // Grenada + // Grenada "GD", - // Ghana + // Ghana "GH", - // Gambia - "GM", - // Guinea + // Gambia + "GM", + // Guinea "GN", - // Guyana + // Guyana "GY", - // Indonesia - // not illegal, except in one province where it is enforced + // Indonesia + // not illegal, except in one province where it is enforced "ID", - // Iraq - "IQ", - // Iran - "IR", - // Jamaica + // Iraq + "IQ", + // Iran + "IR", + // Jamaica "JM", - // Kenya + // Kenya "KE", - // Kiribati, just for male, but not enforced + // Kiribati, just for male, but not enforced "KI", - // Comoros - "KM", - // Kuwait, just for male + // Comoros + "KM", + // Kuwait, just for male "KW", - // Lebanon, unsure in 2024, cf wikipedia + // Lebanon, unsure in 2024, cf wikipedia "LB", - // Sri Lanka + // Sri Lanka "LK", - // Liberia + // Liberia "LR", - // Libya + // Libya "LY", - // Morocco + // Morocco "MA", - // Myanmar + // Myanmar "MM", - // Mauritania + // Mauritania "MR", - // Maldives, not enforced + // Maldives, not enforced "MV", - // Malawi + // Malawi "MW", - // Malaysia + // Malaysia "MY", - // Namibia, not enforced + // Namibia, not enforced "NA", - // Nigeria + // Nigeria "NG", - // Niue - "NU", - // Oman + // Niue + "NU", + // Oman "OM", - // Papua New Guinea , illegal for male only + // Papua New Guinea , illegal for male only "PG", - // Pakistan + // Pakistan "PK", - // Qatar + // Qatar "QA", - // Saudi Arabia + // Saudi Arabia "SA", - // Solomon Islands + // Solomon Islands "SB", - // Sudan - "SD", + // Sudan + "SD", // Sierra Leone, illegal for male only "SL", - // Senegal + // Senegal "SN", - // Somalia + // Somalia "SO", - // South Sudan + // South Sudan "SS", - // Eswatini - "SZ", - // Chad - "TD", - // Togo + // Eswatini + "SZ", + // Chad + "TD", + // Togo "TG", - // Turkmenistan, illegal for male only + // Turkmenistan, illegal for male only "TM", - // Tunisia + // Tunisia "TN", - // Tonga, illegal for male only + // Tonga, illegal for male only "TO", - // Tuvalu,illegal for male only, not enforced + // Tuvalu,illegal for male only, not enforced "TV", - // Tanzania - "TZ", - // Uganda + // Tanzania + "TZ", + // Uganda "UG", - // Uzbekistan, illegal for male only + // Uzbekistan, illegal for male only "UZ", - // Saint Lucia - "WL", - // Samoa, illegal for male only, not enforced + // Saint Lucia + "WL", + // Samoa, illegal for male only, not enforced "WS", - // Saint Vincent and the Grenadines - "WV", - // Yemen + // Saint Vincent and the Grenadines + "WV", + // Yemen "YE", - // Zambia + // Zambia "ZM", - // Zimbabwe + // Zimbabwe "ZW" ) -) // country where mapping would be fruitless and/or dangerous val LGBTExcludedCountries = AllCountriesExcept( From f9bdfcb908bf161d54b30df16f09a40933b571b5 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sat, 22 Jun 2024 21:13:54 -0500 Subject: [PATCH 08/19] added hide option to access quest --- .../streetcomplete/quests/lgbtq/LGBTQAccess.kt | 7 ++++++- .../quests/lgbtq/LGBTQAccessAnswer.kt | 2 +- .../quests/lgbtq/LGBTQAccessForm.kt | 16 ++++++++++------ .../quests/lgbtq/LGBTQAccessQuest.kt | 15 ++++++++++----- app/src/main/res/values/strings.xml | 3 ++- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt index f8da7050ce..b5b1c9f88d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt @@ -4,11 +4,14 @@ import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.view.image_select.DisplayItem import de.westnordost.streetcomplete.view.image_select.Item -enum class LGTBQAccess(val osmValue: String) { +enum class LGTBQAccess( + val osmValue: String? = null +) { NO("no"), WELCOME("welcome"), PRIMARY("primary"), ONLY("only"), + UNKNOWN, } fun List.toItems() = this.map { it.asItem() } @@ -19,6 +22,7 @@ val LGTBQAccess.titleResId: Int get() = when (this) { LGTBQAccess.WELCOME -> R.string.quest_lgbtq_access_welcome LGTBQAccess.PRIMARY -> R.string.quest_lgbtq_access_primary LGTBQAccess.ONLY -> R.string.quest_lgbtq_access_only + LGTBQAccess.UNKNOWN -> R.string.quest_lgbtq_access_not_marked } // TOOD: populate icons @@ -27,4 +31,5 @@ val LGTBQAccess.iconResId: Int get() = when (this) { LGTBQAccess.WELCOME -> R.drawable.surface_asphalt LGTBQAccess.PRIMARY -> R.drawable.surface_asphalt LGTBQAccess.ONLY -> R.drawable.surface_asphalt + LGTBQAccess.UNKNOWN -> R.drawable.surface_asphalt } diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt index 158726dfdc..fe1922f5ab 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt @@ -1,5 +1,5 @@ package de.westnordost.streetcomplete.quests.lgbtq data class LGBTQAccessAnswer( - val access: LGTBQAccess?, + val access: LGTBQAccess, ) 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 index 7cdf3aae40..ac29b92a64 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -4,25 +4,29 @@ import de.westnordost.streetcomplete.R import de.westnordost.streetcomplete.quests.AImageListQuestForm import de.westnordost.streetcomplete.quests.AnswerItem -class LGBTQAccessForm: AImageListQuestForm() { +class LGBTQAccessForm : AImageListQuestForm() { override val items get() = listOf( LGTBQAccess.NO, LGTBQAccess.WELCOME, LGTBQAccess.PRIMARY, - LGTBQAccess.ONLY + LGTBQAccess.ONLY, + LGTBQAccess.UNKNOWN, ).toItems() - override val itemsPerRow = 3 - override val otherAnswers get() = listOfNotNull( - AnswerItem(R.string.quest_lgbtq_access_not_marked) { - applyAnswer(LGBTQAccessAnswer(null)) + AnswerItem(R.string.quest_lgbtq_access_hide_forever) { + hideQuest() } ) + override val itemsPerRow = 3 + override fun onClickOk(selectedItems: List) { val value = selectedItems.single() + if (value.osmValue == null) { + tempHideQuest() + } applyAnswer(LGBTQAccessAnswer(value)) } } 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 index 2c03b97d93..98f243b7d6 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt @@ -10,8 +10,16 @@ import de.westnordost.streetcomplete.osm.Tags class LGBTQAccessQuest : OsmFilterQuestType() { override val elementFilter = """ - nodes, ways with (!lgbtq and lgbtq:signed = yes) + + nodes, ways with ( + amenity ~ swingerclub|nightclub|bar|pub|cafe|restaurant|place_of_worship|community_centre|library|doctors|social_facility + or shop ~ erotic|books + 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 @@ -32,11 +40,8 @@ class LGBTQAccessQuest : OsmFilterQuestType() { override fun createForm() = LGBTQAccessForm() override fun applyAnswerTo(answer: LGBTQAccessAnswer, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { - if (answer.access == null) { - tags["lgbtq:signed"] = "no" - } else { + if (answer.access.osmValue != null) { tags["lgbtq"] = answer.access.osmValue - tags["lgbtq:signed"] = "yes" } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3aa8adb946..d55e61221a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1111,11 +1111,12 @@ If any lanes are reserved for buses, please leave a note instead." target audience only not posted + hide forever Does this venue cater to specific groups within the LGBTQ community? Men Woman - Enbys + Non Binary People All Groups Does this venue cater to specifically to trans people? From 320922e7ddfc52b2acabc1b25828b9114773ebc3 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sat, 22 Jun 2024 22:47:16 -0500 Subject: [PATCH 09/19] fixed crash on temp hide --- .../streetcomplete/quests/lgbtq/LGBTQAccessForm.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 index ac29b92a64..1af723099e 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -1,6 +1,7 @@ package de.westnordost.streetcomplete.quests.lgbtq import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.quest.OsmQuestKey import de.westnordost.streetcomplete.quests.AImageListQuestForm import de.westnordost.streetcomplete.quests.AnswerItem @@ -25,7 +26,8 @@ class LGBTQAccessForm : AImageListQuestForm() { override fun onClickOk(selectedItems: List) { val value = selectedItems.single() if (value.osmValue == null) { - tempHideQuest() + hideOsmQuestController.tempHide(questKey as OsmQuestKey) + return } applyAnswer(LGBTQAccessAnswer(value)) } From 6772f446121c20a43b90d1972fcd7b6fed890100 Mon Sep 17 00:00:00 2001 From: Tiberiu Telcean Date: Tue, 24 Sep 2024 17:04:08 +0300 Subject: [PATCH 10/19] Add icons for LGBTQ quests --- .../quests/lgbtq/LGBTQAccess.kt | 2 +- .../quests/lgbtq/LGBTQAccessQuest.kt | 3 +- .../lgbtq/LGBTQGenderSpecializationQuest.kt | 3 +- .../LGBTQTransgenderSpecializationQuest.kt | 3 +- .../main/res/drawable-xhdpi/lgbtq_welcome.jpg | Bin 0 -> 37596 bytes app/src/main/res/drawable/ic_quest_gender.xml | 17 +++++ app/src/main/res/drawable/ic_quest_lgbtq.xml | 61 ++++++++++++++++++ app/src/main/res/drawable/ic_quest_trans.xml | 17 +++++ res/graphics/quest/gender.svg | 8 +++ res/graphics/quest/lgbtq.svg | 2 + res/graphics/quest/trans.svg | 2 + 11 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/lgbtq_welcome.jpg create mode 100644 app/src/main/res/drawable/ic_quest_gender.xml create mode 100644 app/src/main/res/drawable/ic_quest_lgbtq.xml create mode 100644 app/src/main/res/drawable/ic_quest_trans.xml create mode 100644 res/graphics/quest/gender.svg create mode 100644 res/graphics/quest/lgbtq.svg create mode 100644 res/graphics/quest/trans.svg diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt index b5b1c9f88d..cdade89df7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt @@ -28,7 +28,7 @@ val LGTBQAccess.titleResId: Int get() = when (this) { // TOOD: populate icons val LGTBQAccess.iconResId: Int get() = when (this) { LGTBQAccess.NO -> R.drawable.surface_asphalt - LGTBQAccess.WELCOME -> R.drawable.surface_asphalt + LGTBQAccess.WELCOME -> R.drawable.lgbtq_welcome LGTBQAccess.PRIMARY -> R.drawable.surface_asphalt LGTBQAccess.ONLY -> R.drawable.surface_asphalt LGTBQAccess.UNKNOWN -> R.drawable.surface_asphalt 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 index 98f243b7d6..40ec035198 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt @@ -27,8 +27,7 @@ class LGBTQAccessQuest : OsmFilterQuestType() { override val changesetComment = "Survey lgbtq access" override val wikiLink = "Key:lgbtq" - // TODO: replace me - override val icon = R.drawable.ic_quest_shop + override val icon = R.drawable.ic_quest_lgbtq override val achievements = listOf(EditTypeAchievement.CITIZEN) override fun getTitle(tags: Map) = R.string.quest_lgbtq_access 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 index e2517a7f59..28d6666acb 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQGenderSpecializationQuest.kt @@ -17,8 +17,7 @@ class LGBTQGenderSpecializationQuest : OsmFilterQuestType) = R.string.quest_lgbtq_gender_specialization 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 index a33c7c26b8..95fa541965 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQTransgenderSpecializationQuest.kt @@ -19,8 +19,7 @@ class LGBTQTransgenderSpecializationQuest : OsmFilterQuestType) = R.string.quest_lgbtq_transgender_specialization 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 0000000000000000000000000000000000000000..54c5c68377665a69a1dbc29b7a245e8bed439903 GIT binary patch literal 37596 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

;)2tfl^LunrNKkE+GXT@6df%n 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 literal 0 HcmV?d00001 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/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 @@ + + From 29629e4e32c3895c68d7fe85fc20adaedffec0c8 Mon Sep 17 00:00:00 2001 From: Tiberiu Telcean Date: Tue, 24 Sep 2024 17:04:27 +0300 Subject: [PATCH 11/19] Fix typos --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 990c186220..64e7308e0e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1114,7 +1114,7 @@ If any lanes are reserved for buses, please leave a note instead." Is there signage displaying its relation to LGBTQ people? - What is this places relation to LGBTQ people? + What is this place’s relation to LGBTQ people? banned explicitly welcome target audience @@ -1128,7 +1128,7 @@ If any lanes are reserved for buses, please leave a note instead." Non Binary People All Groups - Does this venue cater to specifically to trans people? + Does this venue cater specifically to trans people? Transgender people are banned On which level number is this place located? From 32b66cdfd8f3362e4bffba9a4802bb41d4fb6290 Mon Sep 17 00:00:00 2001 From: Tiberiu Telcean Date: Tue, 24 Sep 2024 17:17:37 +0300 Subject: [PATCH 12/19] Switch hiding behaviour to normal --- .../westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 1af723099e..0229958b6e 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -26,7 +26,7 @@ class LGBTQAccessForm : AImageListQuestForm() { override fun onClickOk(selectedItems: List) { val value = selectedItems.single() if (value.osmValue == null) { - hideOsmQuestController.tempHide(questKey as OsmQuestKey) + hideOsmQuestController.hide(questKey as OsmQuestKey) return } applyAnswer(LGBTQAccessAnswer(value)) From caafa4fe0397deee1897c80ef3397c835bdf8adc Mon Sep 17 00:00:00 2001 From: tiberiu-telcean <44003488+tiberiu-telcean@users.noreply.github.com> Date: Thu, 26 Sep 2024 10:12:06 +0300 Subject: [PATCH 13/19] Add attribution --- res/graphics/authors.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/res/graphics/authors.txt b/res/graphics/authors.txt index afd87a5a1d..b340cd89f1 100644 --- a/res/graphics/authors.txt +++ b/res/graphics/authors.txt @@ -332,6 +332,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 @@ -344,6 +345,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 @@ -432,6 +434,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 @@ -712,4 +715,4 @@ overlay.svg map_type_topo.jpg modified from https://wiki.openstreetmap.org/wiki/File:Tule_Lake_USGS_topo_map.png, License: Public Domain map_type_street.jpg Map style: MapOSMatic printable style (c) MapOSMatic developers, Data source: (c) 2023 OpenStreetMap.org and contributors (http://osm.org/copyright) map_type_scheme.jpg modified from https://wiki.openstreetmap.org/wiki/File:Tadapani-28-Wanderkarte-2013-gje.jpg, License: CC-BY-SA 4.0 - map_type_toposcope.jpg modified from https://wiki.openstreetmap.org/wiki/File:Melshornet03112006GunnarHeltne.jpg, License: CC-BY-SA 4.0 \ No newline at end of file + map_type_toposcope.jpg modified from https://wiki.openstreetmap.org/wiki/File:Melshornet03112006GunnarHeltne.jpg, License: CC-BY-SA 4.0 From 0fbf2c78f327d81256a6a5635cac6fec9e5fd1d3 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Wed, 6 Nov 2024 12:23:36 -0600 Subject: [PATCH 14/19] made LGBTQAccess quest text only --- .../quests/lgbtq/LGBTQAccess.kt | 39 ++++++------------- .../quests/lgbtq/LGBTQAccessAnswer.kt | 2 +- .../quests/lgbtq/LGBTQAccessForm.kt | 26 ++++--------- 3 files changed, 19 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt index cdade89df7..d90d866a1a 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt @@ -1,35 +1,18 @@ package de.westnordost.streetcomplete.quests.lgbtq import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.view.image_select.DisplayItem -import de.westnordost.streetcomplete.view.image_select.Item +import de.westnordost.streetcomplete.quests.TextItem -enum class LGTBQAccess( - val osmValue: String? = null +enum class LGBTQAccess( + val osmValue: String?, + val titleId: Int, ) { - NO("no"), - WELCOME("welcome"), - PRIMARY("primary"), - ONLY("only"), - UNKNOWN, + NO("no", R.string.quest_lgbtq_access_no), + WELCOME("welcome", R.string.quest_lgbtq_access_welcome), + PRIMARY("primary", R.string.quest_lgbtq_access_primary), + ONLY("only", R.string.quest_lgbtq_access_only), + UNKNOWN(null, R.string.quest_lgbtq_access_not_marked), } -fun List.toItems() = this.map { it.asItem() } -fun LGTBQAccess.asItem(): DisplayItem = Item(this, iconResId, titleResId) - -val LGTBQAccess.titleResId: Int get() = when (this) { - LGTBQAccess.NO -> R.string.quest_lgbtq_access_no - LGTBQAccess.WELCOME -> R.string.quest_lgbtq_access_welcome - LGTBQAccess.PRIMARY -> R.string.quest_lgbtq_access_primary - LGTBQAccess.ONLY -> R.string.quest_lgbtq_access_only - LGTBQAccess.UNKNOWN -> R.string.quest_lgbtq_access_not_marked -} - -// TOOD: populate icons -val LGTBQAccess.iconResId: Int get() = when (this) { - LGTBQAccess.NO -> R.drawable.surface_asphalt - LGTBQAccess.WELCOME -> R.drawable.lgbtq_welcome - LGTBQAccess.PRIMARY -> R.drawable.surface_asphalt - LGTBQAccess.ONLY -> R.drawable.surface_asphalt - LGTBQAccess.UNKNOWN -> R.drawable.surface_asphalt -} +fun List.toItems() = this.map { it.asItem() } +fun LGBTQAccess.asItem(): TextItem = TextItem(this, this.titleId) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt index fe1922f5ab..0305943d9d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt @@ -1,5 +1,5 @@ package de.westnordost.streetcomplete.quests.lgbtq data class LGBTQAccessAnswer( - val access: LGTBQAccess, + val access: LGBTQAccess, ) 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 index 0229958b6e..14b4ddbcb5 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -1,18 +1,17 @@ package de.westnordost.streetcomplete.quests.lgbtq import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.data.quest.OsmQuestKey -import de.westnordost.streetcomplete.quests.AImageListQuestForm +import de.westnordost.streetcomplete.quests.AListQuestForm import de.westnordost.streetcomplete.quests.AnswerItem -class LGBTQAccessForm : AImageListQuestForm() { +class LGBTQAccessForm : AListQuestForm() { override val items get() = listOf( - LGTBQAccess.NO, - LGTBQAccess.WELCOME, - LGTBQAccess.PRIMARY, - LGTBQAccess.ONLY, - LGTBQAccess.UNKNOWN, + LGBTQAccess.NO, + LGBTQAccess.WELCOME, + LGBTQAccess.PRIMARY, + LGBTQAccess.ONLY, + LGBTQAccess.UNKNOWN, ).toItems() override val otherAnswers get() = listOfNotNull( @@ -20,15 +19,4 @@ class LGBTQAccessForm : AImageListQuestForm() { hideQuest() } ) - - override val itemsPerRow = 3 - - override fun onClickOk(selectedItems: List) { - val value = selectedItems.single() - if (value.osmValue == null) { - hideOsmQuestController.hide(questKey as OsmQuestKey) - return - } - applyAnswer(LGBTQAccessAnswer(value)) - } } From 316e9a3321682a73cd02019ae5a608f16e323c6a Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Wed, 6 Nov 2024 12:53:03 -0600 Subject: [PATCH 15/19] simplified LGBTQAccessQuest --- .../streetcomplete/quests/lgbtq/LGBTQAccess.kt | 18 ------------------ .../quests/lgbtq/LGBTQAccessAnswer.kt | 5 ----- .../quests/lgbtq/LGBTQAccessForm.kt | 17 +++++++++-------- .../quests/lgbtq/LGBTQAccessQuest.kt | 9 ++++----- 4 files changed, 13 insertions(+), 36 deletions(-) delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt deleted file mode 100644 index d90d866a1a..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccess.kt +++ /dev/null @@ -1,18 +0,0 @@ -package de.westnordost.streetcomplete.quests.lgbtq - -import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.quests.TextItem - -enum class LGBTQAccess( - val osmValue: String?, - val titleId: Int, -) { - NO("no", R.string.quest_lgbtq_access_no), - WELCOME("welcome", R.string.quest_lgbtq_access_welcome), - PRIMARY("primary", R.string.quest_lgbtq_access_primary), - ONLY("only", R.string.quest_lgbtq_access_only), - UNKNOWN(null, R.string.quest_lgbtq_access_not_marked), -} - -fun List.toItems() = this.map { it.asItem() } -fun LGBTQAccess.asItem(): TextItem = TextItem(this, this.titleId) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt deleted file mode 100644 index 0305943d9d..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessAnswer.kt +++ /dev/null @@ -1,5 +0,0 @@ -package de.westnordost.streetcomplete.quests.lgbtq - -data class LGBTQAccessAnswer( - val access: LGBTQAccess, -) 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 index 14b4ddbcb5..8a64f4142d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -3,16 +3,17 @@ 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() { +class LGBTQAccessForm : AListQuestForm() { - override val items get() = listOf( - LGBTQAccess.NO, - LGBTQAccess.WELCOME, - LGBTQAccess.PRIMARY, - LGBTQAccess.ONLY, - LGBTQAccess.UNKNOWN, - ).toItems() + 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), + TextItem(null, R.string.quest_lgbtq_access_not_marked), + ) override val otherAnswers get() = listOfNotNull( AnswerItem(R.string.quest_lgbtq_access_hide_forever) { 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 index 40ec035198..1f9f2d1848 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt @@ -8,9 +8,8 @@ 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() { +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 or shop ~ erotic|books @@ -38,9 +37,9 @@ class LGBTQAccessQuest : OsmFilterQuestType() { override fun isApplicableTo(element: Element): Boolean = filter.matches(element) override fun createForm() = LGBTQAccessForm() - override fun applyAnswerTo(answer: LGBTQAccessAnswer, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { - if (answer.access.osmValue != null) { - tags["lgbtq"] = answer.access.osmValue + override fun applyAnswerTo(answer: String?, tags: Tags, geometry: ElementGeometry, timestampEdited: Long) { + answer?.let { + tags["lgbtq"] = it } } } From 7d656cc9b2c0bcba1b784a65aec75fca2a29123d Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Wed, 6 Nov 2024 13:00:13 -0600 Subject: [PATCH 16/19] fixed crash on not marked --- .../streetcomplete/quests/lgbtq/LGBTQAccessForm.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 index 8a64f4142d..d62a3b6ed9 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -12,12 +12,14 @@ class LGBTQAccessForm : AListQuestForm() { TextItem("welcome", R.string.quest_lgbtq_access_welcome), TextItem("primary", R.string.quest_lgbtq_access_primary), TextItem("only", R.string.quest_lgbtq_access_only), - TextItem(null, R.string.quest_lgbtq_access_not_marked), ) override val otherAnswers get() = listOfNotNull( + AnswerItem(R.string.quest_lgbtq_access_not_marked) { + tempHideQuest() + }, AnswerItem(R.string.quest_lgbtq_access_hide_forever) { hideQuest() - } + }, ) } From 881d19ca3def45d832c12f4bb61c842790c33a27 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sun, 10 Nov 2024 12:57:49 -0600 Subject: [PATCH 17/19] added vet and music stores to filters --- .../streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 1f9f2d1848..e1af8fe7d9 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessQuest.kt @@ -11,8 +11,8 @@ 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 - or shop ~ erotic|books + 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) From 8af39b42401905fdd9b54418389ead588bf3d785 Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sun, 10 Nov 2024 12:58:44 -0600 Subject: [PATCH 18/19] fixed formating on LGBTPropagandaCountries --- .../quests/lgbtq/ExcludedCountries.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 index ade97951ce..e428d931b0 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/ExcludedCountries.kt @@ -6,15 +6,15 @@ import de.westnordost.streetcomplete.data.quest.AllCountriesExcept // 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", -) + // 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 From e9963af3b314f7d3698418be4f9f46696d2924db Mon Sep 17 00:00:00 2001 From: Leyla Becker Date: Sun, 10 Nov 2024 13:08:32 -0600 Subject: [PATCH 19/19] merged not posted and hide forever --- .../westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt | 3 --- app/src/main/res/values/strings.xml | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) 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 index d62a3b6ed9..79df0b78b5 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/lgbtq/LGBTQAccessForm.kt @@ -16,9 +16,6 @@ class LGBTQAccessForm : AListQuestForm() { override val otherAnswers get() = listOfNotNull( AnswerItem(R.string.quest_lgbtq_access_not_marked) { - tempHideQuest() - }, - AnswerItem(R.string.quest_lgbtq_access_hide_forever) { hideQuest() }, ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 311b646cad..dd30ab471e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1146,8 +1146,7 @@ If any lanes are reserved for buses, please leave a note instead." explicitly welcome target audience only - not posted - hide forever + not posted/hide forever Does this venue cater to specific groups within the LGBTQ community? Men