diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt index 2edc8aebaf..ab723d2239 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt @@ -105,6 +105,7 @@ import de.westnordost.streetcomplete.quests.shop_type.CheckShopType import de.westnordost.streetcomplete.quests.shop_type.SpecifyShopType import de.westnordost.streetcomplete.quests.shoulder.AddShoulder import de.westnordost.streetcomplete.quests.sidewalk.AddSidewalk +import de.westnordost.streetcomplete.quests.smoothness.* import de.westnordost.streetcomplete.quests.sport.AddSport import de.westnordost.streetcomplete.quests.steps_incline.AddStepsIncline import de.westnordost.streetcomplete.quests.steps_ramp.AddStepsRamp @@ -358,6 +359,8 @@ import javax.inject.Singleton AddLanes(), // abstreet, certainly most routing engines - often requires way to be split AddStreetParking(), AddShoulder(), + AddRoadSmoothness(), + AddPathSmoothness(), // footways AddPathSurface(), // used by OSM Carto, BRouter, OsmAnd, OSRM, graphhopper... diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddPathSmoothness.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddPathSmoothness.kt new file mode 100644 index 0000000000..20cca02368 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddPathSmoothness.kt @@ -0,0 +1,64 @@ +package de.westnordost.streetcomplete.quests.smoothness + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.meta.deleteCheckDatesForKey +import de.westnordost.streetcomplete.data.meta.updateWithCheckDate +import de.westnordost.streetcomplete.data.osm.osmquests.OsmFilterQuestType +import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapChangesBuilder +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.WHEELCHAIR +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.BICYCLIST +import de.westnordost.streetcomplete.ktx.arrayOfNotNull + +class AddPathSmoothness : OsmFilterQuestType() { + + override val elementFilter = """ + ways with + highway ~ ${ALL_PATHS_EXCEPT_STEPS.joinToString("|")} + and surface ~ ${SURFACES_FOR_SMOOTHNESS.joinToString("|")} + and access !~ private|no + and segregated != yes + and (!conveying or conveying = no) + and (!indoor or indoor = no) + and !cycleway:surface and !footway:surface + and ( + !smoothness + or smoothness older today -4 years + ) + """ + + override val commitMessage = "Add path smoothness" + override val wikiLink = "Key:smoothness" + override val icon = R.drawable.ic_quest_path_surface_detail + override val isSplitWayEnabled = true + override val questTypeAchievements = listOf(WHEELCHAIR, BICYCLIST) + + override fun getTitle(tags: Map): Int { + val hasName = tags.containsKey("name") + val isSquare = tags["area"] == "yes" + return when { + hasName -> R.string.quest_smoothness_name_title + isSquare -> R.string.quest_smoothness_square_title + else -> R.string.quest_smoothness_path_title + } + } + + override fun getTitleArgs(tags: Map, featureName: Lazy): Array = + arrayOfNotNull(tags["name"]) + + override fun createForm() = AddSmoothnessForm() + + override fun applyAnswerTo(answer: SmoothnessAnswer, changes: StringMapChangesBuilder) { + when (answer) { + is SmoothnessValueAnswer -> changes.updateWithCheckDate("smoothness", answer.osmValue) + is WrongSurfaceAnswer -> { + changes.delete("surface") + changes.deleteIfExists("smoothness") + changes.deleteCheckDatesForKey("smoothness") + } + } + } +} + +// smoothness is not asked for steps +// "pedestrian" is in here so the path answers are shown instead of road answers (which focus on cars) +val ALL_PATHS_EXCEPT_STEPS = listOf("footway", "cycleway", "path", "bridleway", "pedestrian") diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddRoadSmoothness.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddRoadSmoothness.kt new file mode 100644 index 0000000000..d5541e0764 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddRoadSmoothness.kt @@ -0,0 +1,71 @@ +package de.westnordost.streetcomplete.quests.smoothness + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.meta.deleteCheckDatesForKey +import de.westnordost.streetcomplete.data.meta.updateWithCheckDate +import de.westnordost.streetcomplete.data.osm.osmquests.OsmFilterQuestType +import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapChangesBuilder +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.CAR +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.BICYCLIST +import de.westnordost.streetcomplete.ktx.arrayOfNotNull + +class AddRoadSmoothness : OsmFilterQuestType() { + + override val elementFilter = """ + ways with ( + highway ~ ${ROADS_TO_ASK_SMOOTHNESS_FOR.joinToString("|")} + or highway = service and service !~ driveway|slipway + ) + and surface ~ ${SURFACES_FOR_SMOOTHNESS.joinToString("|")} + and (access !~ private|no or (foot and foot !~ private|no)) + and ( + !smoothness + or smoothness older today -4 years + ) + """ + + override val commitMessage = "Add road smoothness" + override val wikiLink = "Key:smoothness" + override val icon = R.drawable.ic_quest_street_surface_detail + override val isSplitWayEnabled = true + override val questTypeAchievements = listOf(CAR, BICYCLIST) + + override fun getTitle(tags: Map): Int { + val hasName = tags.containsKey("name") + val isSquare = tags["area"] == "yes" + return when { + hasName -> R.string.quest_smoothness_name_title + isSquare -> R.string.quest_smoothness_square_title + else -> R.string.quest_smoothness_road_title + } + } + + override fun getTitleArgs(tags: Map, featureName: Lazy): Array = + arrayOfNotNull(tags["name"]) + + override fun createForm() = AddSmoothnessForm() + + override fun applyAnswerTo(answer: SmoothnessAnswer, changes: StringMapChangesBuilder) { + when (answer) { + is SmoothnessValueAnswer -> changes.updateWithCheckDate("smoothness", answer.osmValue) + is WrongSurfaceAnswer -> { + changes.delete("surface") + changes.deleteIfExists("smoothness") + changes.deleteCheckDatesForKey("smoothness") + } + } + } +} + +// surfaces that are actually used in AddSmoothnessForm +// should only contain values that are in the Surface class +val SURFACES_FOR_SMOOTHNESS = listOf( + "asphalt", "sett", "paving_stones", "compacted", "gravel", "fine_gravel" +) + +private val ROADS_TO_ASK_SMOOTHNESS_FOR = arrayOf( + // "trunk","trunk_link","motorway","motorway_link", // too much, motorways are almost by definition smooth asphalt (or concrete) + "primary", "primary_link", "secondary", "secondary_link", "tertiary", "tertiary_link", + "unclassified", "residential", "living_street", "pedestrian", "track", + // "service", // this is too much, and the information value is very low +) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddSmoothnessForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddSmoothnessForm.kt new file mode 100644 index 0000000000..6adf67b1d6 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/AddSmoothnessForm.kt @@ -0,0 +1,64 @@ +package de.westnordost.streetcomplete.quests.smoothness + +import android.os.Bundle +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.quests.AImageListQuestAnswerFragment +import de.westnordost.streetcomplete.quests.AnswerItem +import de.westnordost.streetcomplete.quests.surface.Surface +import de.westnordost.streetcomplete.quests.surface.asItem +import de.westnordost.streetcomplete.view.image_select.ItemViewHolder + +class AddSmoothnessForm : AImageListQuestAnswerFragment() { + + override val descriptionResId = R.string.quest_smoothness_hint + + override val otherAnswers = listOf( + AnswerItem(R.string.quest_smoothness_wrong_surface) { surfaceWrong() }, + AnswerItem(R.string.quest_smoothness_obstacle) { showObstacleHint() } + ) + + private val surfaceTag get() = osmElement!!.tags["surface"] + + override val items get() = Smoothness.values().toItems(requireContext(), surfaceTag!!) + + override val itemsPerRow = 1 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + imageSelector.cellLayoutId = R.layout.cell_labeled_icon_select_smoothness + } + + override val moveFavoritesToFront = false + + override fun onClickOk(selectedItems: List) { + applyAnswer(SmoothnessValueAnswer(selectedItems.single().osmValue)) + } + + private fun showObstacleHint() { + activity?.let { AlertDialog.Builder(it) + .setMessage(R.string.quest_smoothness_obstacle_hint) + .setPositiveButton(android.R.string.ok, null) + .show() + } + } + + private fun surfaceWrong() { + val surfaceType = Surface.values().find { it.osmValue == surfaceTag }!! + showWrongSurfaceDialog(surfaceType) + } + + private fun showWrongSurfaceDialog(surface: Surface) { + val inflater = LayoutInflater.from(requireContext()) + val inner = inflater.inflate(R.layout.dialog_quest_smoothness_wrong_surface, null, false) + ItemViewHolder(inner.findViewById(R.id.item_view)).bind(surface.asItem()) + + AlertDialog.Builder(requireContext()) + .setView(inner) + .setPositiveButton(R.string.quest_generic_hasFeature_yes_leave_note) { _, _ -> composeNote() } + .setNegativeButton(R.string.quest_generic_hasFeature_no) { _, _ -> applyAnswer(WrongSurfaceAnswer) } + .show() + } + +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/Smoothness.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/Smoothness.kt new file mode 100644 index 0000000000..df1c265116 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/Smoothness.kt @@ -0,0 +1,12 @@ +package de.westnordost.streetcomplete.quests.smoothness + +enum class Smoothness(val osmValue: String) { + EXCELLENT("excellent"), + GOOD("good"), + INTERMEDIATE("intermediate"), + BAD("bad"), + VERY_BAD("very_bad"), + HORRIBLE("horrible"), + VERY_HORRIBLE("very_horrible"), + IMPASSABLE("impassable"), +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessAnswer.kt new file mode 100644 index 0000000000..8b29956da2 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessAnswer.kt @@ -0,0 +1,7 @@ +package de.westnordost.streetcomplete.quests.smoothness + +sealed class SmoothnessAnswer + +data class SmoothnessValueAnswer(val osmValue: String): SmoothnessAnswer() + +object WrongSurfaceAnswer: SmoothnessAnswer() diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessItem.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessItem.kt new file mode 100644 index 0000000000..64fcb18d53 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/smoothness/SmoothnessItem.kt @@ -0,0 +1,151 @@ +package de.westnordost.streetcomplete.quests.smoothness + +import android.content.Context +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.quests.smoothness.Smoothness.* +import de.westnordost.streetcomplete.view.CharSequenceText +import de.westnordost.streetcomplete.view.ResImage +import de.westnordost.streetcomplete.view.ResText +import de.westnordost.streetcomplete.view.image_select.DisplayItem +import de.westnordost.streetcomplete.view.image_select.Item2 + +fun Array.toItems(context: Context, surface: String) = + mapNotNull { it.asItem(context, surface) } + +// return null if not a valid combination +fun Smoothness.asItem(context: Context, surface: String): DisplayItem? { + val imageResId = getImageResId(surface) ?: return null + val descriptionResId = getDescriptionResId(surface) ?: return null + return Item2( + this, + ResImage(imageResId), + CharSequenceText(context.getString(titleResId) + " " + emoji), + ResText(descriptionResId) + ) +} + +/** return fitting vehicle type emoji that corresponds to the "usable by" column in the wiki */ +val Smoothness.emoji get() = when(this) { + EXCELLENT -> """๐Ÿ›น""" // or ๐Ÿ›ผ but it is only available since Android 11 + GOOD -> """๐Ÿ›ด""" // no emoji for racing bike, would be difficult to tell apart from ๐Ÿšฒ + INTERMEDIATE -> """๐Ÿšฒ""" // or ๐Ÿ›ต but users are more likely to own a bike than a scooter + BAD -> """๐Ÿš—""" // or ๐Ÿ›บ but tuk-tuks have actually similar requirements as scooters + VERY_BAD -> """๐Ÿš™""" // this is a SUV + HORRIBLE -> """๐Ÿ›ป""" // no emoji for off-road vehicles but there is one for pick-ups (Android 11) + VERY_HORRIBLE -> """๐Ÿšœ""" + IMPASSABLE -> """๐Ÿšถ""" +} + +val Smoothness.titleResId get() = when (this) { + EXCELLENT -> R.string.quest_smoothness_title_excellent + GOOD -> R.string.quest_smoothness_title_good + INTERMEDIATE -> R.string.quest_smoothness_title_intermediate + BAD -> R.string.quest_smoothness_title_bad + VERY_BAD -> R.string.quest_smoothness_title_very_bad + HORRIBLE -> R.string.quest_smoothness_title_horrible + VERY_HORRIBLE -> R.string.quest_smoothness_title_very_horrible + IMPASSABLE -> R.string.quest_smoothness_title_impassable +} + +fun Smoothness.getDescriptionResId(surface: String): Int? = when (surface) { + "asphalt", "concrete" -> pavedDescriptionResId + "sett" -> settDescriptionResId + "paving_stones" -> pavingStonesDescriptionResId + "compacted", "gravel", "fine_gravel" -> compactedOrGravelDescriptionResId + else -> null +} ?: descriptionResIdFallback + +private val Smoothness.descriptionResIdFallback: Int? get() = when(this) { + HORRIBLE -> R.string.quest_smoothness_description_horrible + VERY_HORRIBLE -> R.string.quest_smoothness_description_very_horrible + IMPASSABLE -> R.string.quest_smoothness_description_impassable + else -> null +} + +fun Smoothness.getImageResId(surface: String): Int? = when(surface) { + "asphalt" -> asphaltImageResId + "sett" -> settImageResId + "paving_stones" -> pavingStonesImageResId + "compacted" -> compactedImageResId + "gravel" -> gravelImageResId + else -> null +} + +private val Smoothness.asphaltImageResId get() = when (this) { + EXCELLENT -> R.drawable.surface_asphalt_excellent + GOOD -> R.drawable.surface_asphalt_good + INTERMEDIATE -> R.drawable.surface_asphalt_intermediate + BAD -> R.drawable.surface_asphalt_bad + VERY_BAD -> R.drawable.surface_asphalt_very_bad + else -> null +} + +private val Smoothness.pavedDescriptionResId get() = when(this) { + EXCELLENT -> R.string.quest_smoothness_description_excellent_paved + GOOD -> R.string.quest_smoothness_description_good_paved + INTERMEDIATE -> R.string.quest_smoothness_description_intermediate_paved + BAD -> R.string.quest_smoothness_description_bad_paved + VERY_BAD -> R.string.quest_smoothness_description_very_bad_paved + else -> null +} + +private val Smoothness.settImageResId get() = when (this) { + GOOD -> R.drawable.surface_sett_good + INTERMEDIATE -> R.drawable.surface_sett_intermediate + BAD -> R.drawable.surface_sett_bad + VERY_BAD -> R.drawable.surface_sett_very_bad + else -> null +} + +private val Smoothness.settDescriptionResId get() = when(this) { + GOOD -> R.string.quest_smoothness_description_good_sett + INTERMEDIATE -> R.string.quest_smoothness_description_intermediate_sett + BAD -> R.string.quest_smoothness_description_bad_sett + VERY_BAD -> R.string.quest_smoothness_description_very_bad_sett + else -> null +} + +private val Smoothness.pavingStonesImageResId get() = when (this) { + EXCELLENT -> R.drawable.surface_paving_stones_excellent + GOOD -> R.drawable.surface_paving_stones_good + INTERMEDIATE -> R.drawable.surface_paving_stones_intermediate + BAD -> R.drawable.surface_paving_stones_bad + VERY_BAD -> R.drawable.surface_paving_stones_very_bad + else -> null +} + +private val Smoothness.pavingStonesDescriptionResId get() = when(this) { + EXCELLENT -> R.string.quest_smoothness_description_excellent_paving_stones + GOOD -> R.string.quest_smoothness_description_good_paving_stones + INTERMEDIATE -> R.string.quest_smoothness_description_intermediate_paving_stones + BAD -> R.string.quest_smoothness_description_bad_paving_stones + VERY_BAD -> R.string.quest_smoothness_description_very_bad_paving_stones + else -> null +} + +private val Smoothness.compactedImageResId get() = when (this) { + INTERMEDIATE -> R.drawable.surface_compacted_intermediate + BAD -> R.drawable.surface_compacted_bad + VERY_BAD -> R.drawable.surface_compacted_very_bad + HORRIBLE -> R.drawable.surface_unpaved_horrible + VERY_HORRIBLE -> R.drawable.surface_unpaved_very_horrible + IMPASSABLE -> R.drawable.surface_unpaved_impassable + else -> null +} + +private val Smoothness.gravelImageResId get() = when (this) { + INTERMEDIATE -> R.drawable.surface_gravel_intermediate + BAD -> R.drawable.surface_gravel_bad + VERY_BAD -> R.drawable.surface_gravel_very_bad + HORRIBLE -> R.drawable.surface_unpaved_horrible + VERY_HORRIBLE -> R.drawable.surface_unpaved_very_horrible + IMPASSABLE -> R.drawable.surface_unpaved_impassable + else -> null +} + +private val Smoothness.compactedOrGravelDescriptionResId get() = when(this) { + INTERMEDIATE -> R.string.quest_smoothness_description_intermediate_compacted_gravel + BAD -> R.string.quest_smoothness_description_bad_compacted_gravel + VERY_BAD -> R.string.quest_smoothness_description_very_bad_compacted_gravel + else -> null +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddRoadSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddRoadSurface.kt index 565c9a74db..57b74b2e3c 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddRoadSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddRoadSurface.kt @@ -10,7 +10,7 @@ class AddRoadSurface : OsmFilterQuestType() { override val elementFilter = """ ways with ( - highway ~ ${ROADS_WITH_SURFACES.joinToString("|")} + highway ~ ${ROADS_TO_ASK_SURFACE_FOR.joinToString("|")} or highway = service and service !~ driveway|slipway ) and ( @@ -48,14 +48,11 @@ class AddRoadSurface : OsmFilterQuestType() { override fun applyAnswerTo(answer: SurfaceAnswer, changes: StringMapChangesBuilder) { answer.applyTo(changes, "surface") } - - companion object { - // well, all roads have surfaces, what I mean is that not all ways with highway key are - // "something with a surface" - private val ROADS_WITH_SURFACES = arrayOf( - // "trunk","trunk_link","motorway","motorway_link", // too much, motorways are almost by definition asphalt (or concrete) - "primary", "primary_link", "secondary", "secondary_link", "tertiary", "tertiary_link", - "unclassified", "residential", "living_street", "pedestrian", "track", "road" - )/*"service", */// this is too much, and the information value is very low - } } + +private val ROADS_TO_ASK_SURFACE_FOR = arrayOf( + // "trunk","trunk_link","motorway","motorway_link", // too much, motorways are almost by definition asphalt (or concrete) + "primary", "primary_link", "secondary", "secondary_link", "tertiary", "tertiary_link", + "unclassified", "residential", "living_street", "pedestrian", "track", + // "service", // this is too much, and the information value is very low +) diff --git a/app/src/main/res/authors.txt b/app/src/main/res/authors.txt index f984a31dc1..fbf5ed5175 100644 --- a/app/src/main/res/authors.txt +++ b/app/src/main/res/authors.txt @@ -175,6 +175,30 @@ surface_unpaved.jpg CC-BY 2.0 https://www.flickr.com/photos/i surface_wood.jpg CC-BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Wooden_Bridge_In_Midst_of_Kaziranga_Wild_life_Sanctuary.jpg (Pavan Goswami) surface_woodchips.jpg CC-BY-SA 3.0 https://commons.wikimedia.org/wiki/File:Woodchips_surface.jpg (10992-osm) +surface_asphalt_bad.jpg 4_bad_3.jpg, see https://drive.google.com/file/d/1O3Qr-DTKVdu5hsXkVGYDxp8US65WywTM/view (Andre Thum) +surface_asphalt_excellent.jpg CC-BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Mala_Hrastice_2020-06-16_Ulice_z_navsi_na_nadrazi_obr05.jpg (Miloลก Hlรกvka) +surface_asphalt_good.jpg public domain https://cloud.disroot.org/s/bWCMMSGigAR7k8s?dir=undefined&openfile=189451539 (helium314) +surface_asphalt_intermediat... CC-BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Nids-de-poule_sur_une_route_communale.jpg (Mathis Brancquart) +surface_asphalt_very_bad.jpg CC-BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Kamieniec_Szalejow_Gorny_road.jpg (Jojo) +surface_compacted_bad.jpg public domain https://cloud.disroot.org/s/bWCMMSGigAR7k8s?dir=undefined&openfile=189451545 (helium314) +surface_compacted_intermedi... CC-BY-SA 3.0 https://commons.wikimedia.org/wiki/File:Saviselk%C3%A4_2.JPG (Htm) +surface_compacted_very_bad.jpg CC0 modified from IMG_20210530_151614010.jpg from https://www.dropbox.com/sh/mkjhco2ob60q24l/AABZo9f5bgyA1KwyV-3zxUVYa?dl=0 (rhhsm) +surface_gravel_bad.jpg CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Gravel_-_bad.jpg (Supaplex030) +surface_gravel_intermediate... CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Compacted_-_intermediate.jpg (Supaplex030) +surface_gravel_very_bad.jpg CC-BY-SA 4.0 5_very-bad.jpg from modified from https://drive.google.com/file/d/16qnhMBW25klUPpav02VFr5R6F4Em2LoH/view (Andre Thum) +surface_paving_stones_bad.jpg CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Paving_stones_-_bad.jpg (Supaplex030) +surface_paving_stones_excel... CC-BY-SA 4.0 https://drive.google.com/file/d/1xJPGzTOusalYbGeggTkYaGXOVlclPDzZ/view (mcliquid) +surface_paving_stones_good.jpg CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Paving_stones_-_good.jpg (Supaplex030) +surface_paving_stones_inter... public domain https://cloud.disroot.org/apps/files_sharing/publicpreview/bWCMMSGigAR7k8s?file=/IMG_20210913_091339.jpg (helium314) +surface_paving_stones_very_... CC-BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Broken_up_sidewalk_near_the_shore_of_the_St._Lawrence_River_near_Aultsville,_Ontario.jpg ( Aultsville) +surface_sett_bad.jpg CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Sett_-_bad.jpg (Supaplex030) +surface_sett_good.jpg CC-0 https://nextcloud.nicohood.de/index.php/s/z6qs58jSQcBXKSw?dir=undefined&openfile=1442 - IMG_20210916_111924 (NicoHood) +surface_sett_intermediate.jpg CC-BY-SA 4.0 3_intermediate_1.jpg, see https://drive.google.com/file/d/1DaABzj_ZtHNdISHXSulVs9nwrVRbU8nG/view (Andre Thum) +surface_sett_very_bad.jpg public domain https://wiki.openstreetmap.org/wiki/File:Very_bad_sett.jpg (Westnordost) +surface_unpaved_horrible.jpg CC-BY-SA 2.0 IMG_20210530_151832190.jpg from https://www.dropbox.com/sh/mkjhco2ob60q24l/AABZo9f5bgyA1KwyV-3zxUVYa?dl=0 (rhhsm) +surface_unpaved_impassable.jpg public domain https://drive.google.com/file/d/1yZXynVd07IWQPKpBbrlbABzfKHkG9X7R/view?usp=sharing (Tobias Zwick) +surface_unpaved_very_horrib... CC-BY-SA 4.0 https://wiki.openstreetmap.org/wiki/File:Very_horrible_ruts.jpg (Preslav) + tactile_paving_illustration... CC-BY 2.0 https://www.flickr.com/photos/jeanlouis_zimmermann/10072029534/in/album-72157635218804514/ CC-BY 2.0 https://www.flickr.com/photos/jeanlouis_zimmermann/10493532264/in/album-72157635218804514/ CC-BY 2.0 https://www.flickr.com/photos/jeanlouis_zimmermann/10473021344/in/album-72157635218804514/ diff --git a/app/src/main/res/drawable-hdpi/surface_asphalt_bad.jpg b/app/src/main/res/drawable-hdpi/surface_asphalt_bad.jpg new file mode 100644 index 0000000000..f3640ef0f5 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_asphalt_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_asphalt_excellent.jpg b/app/src/main/res/drawable-hdpi/surface_asphalt_excellent.jpg new file mode 100644 index 0000000000..87a540a042 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_asphalt_excellent.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_asphalt_good.jpg b/app/src/main/res/drawable-hdpi/surface_asphalt_good.jpg new file mode 100644 index 0000000000..cc3279171f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_asphalt_good.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_asphalt_intermediate.jpg b/app/src/main/res/drawable-hdpi/surface_asphalt_intermediate.jpg new file mode 100644 index 0000000000..0d04359202 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_asphalt_intermediate.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_asphalt_very_bad.jpg b/app/src/main/res/drawable-hdpi/surface_asphalt_very_bad.jpg new file mode 100644 index 0000000000..5d2eca47f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_asphalt_very_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_compacted_bad.jpg b/app/src/main/res/drawable-hdpi/surface_compacted_bad.jpg new file mode 100644 index 0000000000..d31fa5de22 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_compacted_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_compacted_intermediate.jpg b/app/src/main/res/drawable-hdpi/surface_compacted_intermediate.jpg new file mode 100644 index 0000000000..07f7a72102 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_compacted_intermediate.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_compacted_very_bad.jpg b/app/src/main/res/drawable-hdpi/surface_compacted_very_bad.jpg new file mode 100644 index 0000000000..f9e4d86707 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_compacted_very_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_gravel_bad.jpg b/app/src/main/res/drawable-hdpi/surface_gravel_bad.jpg new file mode 100644 index 0000000000..8788ae58c4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_gravel_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_gravel_intermediate.jpg b/app/src/main/res/drawable-hdpi/surface_gravel_intermediate.jpg new file mode 100644 index 0000000000..eabc38afd0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_gravel_intermediate.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_gravel_very_bad.jpg b/app/src/main/res/drawable-hdpi/surface_gravel_very_bad.jpg new file mode 100644 index 0000000000..b2d2d65134 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_gravel_very_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_paving_stones_bad.jpg b/app/src/main/res/drawable-hdpi/surface_paving_stones_bad.jpg new file mode 100644 index 0000000000..62080765f9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_paving_stones_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_paving_stones_excellent.jpg b/app/src/main/res/drawable-hdpi/surface_paving_stones_excellent.jpg new file mode 100644 index 0000000000..4c1efdc61a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_paving_stones_excellent.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_paving_stones_good.jpg b/app/src/main/res/drawable-hdpi/surface_paving_stones_good.jpg new file mode 100644 index 0000000000..253416a42b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_paving_stones_good.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_paving_stones_intermediate.jpg b/app/src/main/res/drawable-hdpi/surface_paving_stones_intermediate.jpg new file mode 100644 index 0000000000..66b5a7bb49 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_paving_stones_intermediate.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_paving_stones_very_bad.jpg b/app/src/main/res/drawable-hdpi/surface_paving_stones_very_bad.jpg new file mode 100644 index 0000000000..376fffb585 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_paving_stones_very_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_sett_bad.jpg b/app/src/main/res/drawable-hdpi/surface_sett_bad.jpg new file mode 100644 index 0000000000..e3181ec221 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_sett_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_sett_good.jpg b/app/src/main/res/drawable-hdpi/surface_sett_good.jpg new file mode 100644 index 0000000000..486e942e7c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_sett_good.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_sett_intermediate.jpg b/app/src/main/res/drawable-hdpi/surface_sett_intermediate.jpg new file mode 100644 index 0000000000..027bf9409b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_sett_intermediate.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_sett_very_bad.jpg b/app/src/main/res/drawable-hdpi/surface_sett_very_bad.jpg new file mode 100644 index 0000000000..c92cf50dbc Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_sett_very_bad.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_unpaved_horrible.jpg b/app/src/main/res/drawable-hdpi/surface_unpaved_horrible.jpg new file mode 100644 index 0000000000..0d4cfb8078 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_unpaved_horrible.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_unpaved_impassable.jpg b/app/src/main/res/drawable-hdpi/surface_unpaved_impassable.jpg new file mode 100644 index 0000000000..1fb50334b4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_unpaved_impassable.jpg differ diff --git a/app/src/main/res/drawable-hdpi/surface_unpaved_very_horrible.jpg b/app/src/main/res/drawable-hdpi/surface_unpaved_very_horrible.jpg new file mode 100644 index 0000000000..aa69ff5b36 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/surface_unpaved_very_horrible.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_asphalt_bad.jpg b/app/src/main/res/drawable-mdpi/surface_asphalt_bad.jpg new file mode 100644 index 0000000000..aa9117ce2f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_asphalt_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_asphalt_excellent.jpg b/app/src/main/res/drawable-mdpi/surface_asphalt_excellent.jpg new file mode 100644 index 0000000000..3b7cd37ea5 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_asphalt_excellent.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_asphalt_good.jpg b/app/src/main/res/drawable-mdpi/surface_asphalt_good.jpg new file mode 100644 index 0000000000..e24e8c6413 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_asphalt_good.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_asphalt_intermediate.jpg b/app/src/main/res/drawable-mdpi/surface_asphalt_intermediate.jpg new file mode 100644 index 0000000000..0e7da3a5df Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_asphalt_intermediate.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_asphalt_very_bad.jpg b/app/src/main/res/drawable-mdpi/surface_asphalt_very_bad.jpg new file mode 100644 index 0000000000..e10bdf3a44 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_asphalt_very_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_compacted_bad.jpg b/app/src/main/res/drawable-mdpi/surface_compacted_bad.jpg new file mode 100644 index 0000000000..05acd8779a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_compacted_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_compacted_intermediate.jpg b/app/src/main/res/drawable-mdpi/surface_compacted_intermediate.jpg new file mode 100644 index 0000000000..e0f13715fe Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_compacted_intermediate.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_compacted_very_bad.jpg b/app/src/main/res/drawable-mdpi/surface_compacted_very_bad.jpg new file mode 100644 index 0000000000..c249cef52b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_compacted_very_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_gravel_bad.jpg b/app/src/main/res/drawable-mdpi/surface_gravel_bad.jpg new file mode 100644 index 0000000000..b927ad8b54 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_gravel_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_gravel_intermediate.jpg b/app/src/main/res/drawable-mdpi/surface_gravel_intermediate.jpg new file mode 100644 index 0000000000..f01554a21a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_gravel_intermediate.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_gravel_very_bad.jpg b/app/src/main/res/drawable-mdpi/surface_gravel_very_bad.jpg new file mode 100644 index 0000000000..cc4c8a4de7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_gravel_very_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_paving_stones_bad.jpg b/app/src/main/res/drawable-mdpi/surface_paving_stones_bad.jpg new file mode 100644 index 0000000000..9356062d8a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_paving_stones_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_paving_stones_excellent.jpg b/app/src/main/res/drawable-mdpi/surface_paving_stones_excellent.jpg new file mode 100644 index 0000000000..d7472bcfe9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_paving_stones_excellent.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_paving_stones_good.jpg b/app/src/main/res/drawable-mdpi/surface_paving_stones_good.jpg new file mode 100644 index 0000000000..b6b28af835 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_paving_stones_good.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_paving_stones_intermediate.jpg b/app/src/main/res/drawable-mdpi/surface_paving_stones_intermediate.jpg new file mode 100644 index 0000000000..a4e421193d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_paving_stones_intermediate.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_paving_stones_very_bad.jpg b/app/src/main/res/drawable-mdpi/surface_paving_stones_very_bad.jpg new file mode 100644 index 0000000000..02b22b03f0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_paving_stones_very_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_sett_bad.jpg b/app/src/main/res/drawable-mdpi/surface_sett_bad.jpg new file mode 100644 index 0000000000..8f412f5561 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_sett_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_sett_good.jpg b/app/src/main/res/drawable-mdpi/surface_sett_good.jpg new file mode 100644 index 0000000000..34613f8748 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_sett_good.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_sett_intermediate.jpg b/app/src/main/res/drawable-mdpi/surface_sett_intermediate.jpg new file mode 100644 index 0000000000..5fd9ae7054 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_sett_intermediate.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_sett_very_bad.jpg b/app/src/main/res/drawable-mdpi/surface_sett_very_bad.jpg new file mode 100644 index 0000000000..cb8a4f96a1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_sett_very_bad.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_unpaved_horrible.jpg b/app/src/main/res/drawable-mdpi/surface_unpaved_horrible.jpg new file mode 100644 index 0000000000..907269382c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_unpaved_horrible.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_unpaved_impassable.jpg b/app/src/main/res/drawable-mdpi/surface_unpaved_impassable.jpg new file mode 100644 index 0000000000..059845fd8d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_unpaved_impassable.jpg differ diff --git a/app/src/main/res/drawable-mdpi/surface_unpaved_very_horrible.jpg b/app/src/main/res/drawable-mdpi/surface_unpaved_very_horrible.jpg new file mode 100644 index 0000000000..81ad51fc48 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/surface_unpaved_very_horrible.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_asphalt_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_asphalt_bad.jpg new file mode 100644 index 0000000000..ba1fa6d200 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_asphalt_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_asphalt_excellent.jpg b/app/src/main/res/drawable-xhdpi/surface_asphalt_excellent.jpg new file mode 100644 index 0000000000..ba6428ed82 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_asphalt_excellent.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_asphalt_good.jpg b/app/src/main/res/drawable-xhdpi/surface_asphalt_good.jpg new file mode 100644 index 0000000000..ec7b31d167 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_asphalt_good.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_asphalt_intermediate.jpg b/app/src/main/res/drawable-xhdpi/surface_asphalt_intermediate.jpg new file mode 100644 index 0000000000..62c7d75f2e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_asphalt_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_asphalt_very_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_asphalt_very_bad.jpg new file mode 100644 index 0000000000..4207774a44 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_asphalt_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_compacted_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_compacted_bad.jpg new file mode 100644 index 0000000000..bdf09e915d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_compacted_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_compacted_intermediate.jpg b/app/src/main/res/drawable-xhdpi/surface_compacted_intermediate.jpg new file mode 100644 index 0000000000..613e1a8b1f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_compacted_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_compacted_very_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_compacted_very_bad.jpg new file mode 100644 index 0000000000..1357481de1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_compacted_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_gravel_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_gravel_bad.jpg new file mode 100644 index 0000000000..e39ed716d2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_gravel_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_gravel_intermediate.jpg b/app/src/main/res/drawable-xhdpi/surface_gravel_intermediate.jpg new file mode 100644 index 0000000000..6529c55dd2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_gravel_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_gravel_very_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_gravel_very_bad.jpg new file mode 100644 index 0000000000..dc4f0eca27 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_gravel_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_paving_stones_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_paving_stones_bad.jpg new file mode 100644 index 0000000000..0add21b219 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_paving_stones_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_paving_stones_excellent.jpg b/app/src/main/res/drawable-xhdpi/surface_paving_stones_excellent.jpg new file mode 100644 index 0000000000..00b483beaf Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_paving_stones_excellent.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_paving_stones_good.jpg b/app/src/main/res/drawable-xhdpi/surface_paving_stones_good.jpg new file mode 100644 index 0000000000..3ba1b9dc6d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_paving_stones_good.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_paving_stones_intermediate.jpg b/app/src/main/res/drawable-xhdpi/surface_paving_stones_intermediate.jpg new file mode 100644 index 0000000000..f274bb4d84 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_paving_stones_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_paving_stones_very_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_paving_stones_very_bad.jpg new file mode 100644 index 0000000000..855ce86060 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_paving_stones_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_sett_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_sett_bad.jpg new file mode 100644 index 0000000000..201175b692 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_sett_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_sett_good.jpg b/app/src/main/res/drawable-xhdpi/surface_sett_good.jpg new file mode 100644 index 0000000000..4b567e75c6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_sett_good.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_sett_intermediate.jpg b/app/src/main/res/drawable-xhdpi/surface_sett_intermediate.jpg new file mode 100644 index 0000000000..9e00241cd0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_sett_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_sett_very_bad.jpg b/app/src/main/res/drawable-xhdpi/surface_sett_very_bad.jpg new file mode 100644 index 0000000000..64ff17f4dd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_sett_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_unpaved_horrible.jpg b/app/src/main/res/drawable-xhdpi/surface_unpaved_horrible.jpg new file mode 100644 index 0000000000..032af17c81 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_unpaved_horrible.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_unpaved_impassable.jpg b/app/src/main/res/drawable-xhdpi/surface_unpaved_impassable.jpg new file mode 100644 index 0000000000..2c393a7421 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_unpaved_impassable.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/surface_unpaved_very_horrible.jpg b/app/src/main/res/drawable-xhdpi/surface_unpaved_very_horrible.jpg new file mode 100644 index 0000000000..2add2c5004 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/surface_unpaved_very_horrible.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_asphalt_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_asphalt_bad.jpg new file mode 100644 index 0000000000..f68a5366d4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_asphalt_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_asphalt_excellent.jpg b/app/src/main/res/drawable-xxhdpi/surface_asphalt_excellent.jpg new file mode 100644 index 0000000000..b4d98987e6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_asphalt_excellent.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_asphalt_good.jpg b/app/src/main/res/drawable-xxhdpi/surface_asphalt_good.jpg new file mode 100644 index 0000000000..6528cdbdb3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_asphalt_good.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_asphalt_intermediate.jpg b/app/src/main/res/drawable-xxhdpi/surface_asphalt_intermediate.jpg new file mode 100644 index 0000000000..0123b24a67 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_asphalt_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_asphalt_very_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_asphalt_very_bad.jpg new file mode 100644 index 0000000000..f17dd2747c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_asphalt_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_compacted_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_compacted_bad.jpg new file mode 100644 index 0000000000..2c78afb755 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_compacted_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_compacted_intermediate.jpg b/app/src/main/res/drawable-xxhdpi/surface_compacted_intermediate.jpg new file mode 100644 index 0000000000..a32d9b0eee Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_compacted_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_compacted_very_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_compacted_very_bad.jpg new file mode 100644 index 0000000000..3470b8ff0d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_compacted_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_gravel_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_gravel_bad.jpg new file mode 100644 index 0000000000..5c97fc0646 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_gravel_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_gravel_intermediate.jpg b/app/src/main/res/drawable-xxhdpi/surface_gravel_intermediate.jpg new file mode 100644 index 0000000000..e72d8f7dbb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_gravel_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_gravel_very_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_gravel_very_bad.jpg new file mode 100644 index 0000000000..18d436f75e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_gravel_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_paving_stones_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_bad.jpg new file mode 100644 index 0000000000..cef25217bf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_paving_stones_excellent.jpg b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_excellent.jpg new file mode 100644 index 0000000000..2c8ab53a63 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_excellent.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_paving_stones_good.jpg b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_good.jpg new file mode 100644 index 0000000000..a1df7c1686 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_good.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_paving_stones_intermediate.jpg b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_intermediate.jpg new file mode 100644 index 0000000000..5bc517b073 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_paving_stones_very_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_very_bad.jpg new file mode 100644 index 0000000000..8443e61d92 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_paving_stones_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_sett_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_sett_bad.jpg new file mode 100644 index 0000000000..66baecc422 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_sett_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_sett_good.jpg b/app/src/main/res/drawable-xxhdpi/surface_sett_good.jpg new file mode 100644 index 0000000000..9d725d09a6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_sett_good.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_sett_intermediate.jpg b/app/src/main/res/drawable-xxhdpi/surface_sett_intermediate.jpg new file mode 100644 index 0000000000..16b8daec7d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_sett_intermediate.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_sett_very_bad.jpg b/app/src/main/res/drawable-xxhdpi/surface_sett_very_bad.jpg new file mode 100644 index 0000000000..2ea2d97500 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_sett_very_bad.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_unpaved_horrible.jpg b/app/src/main/res/drawable-xxhdpi/surface_unpaved_horrible.jpg new file mode 100644 index 0000000000..06edae5a9f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_unpaved_horrible.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_unpaved_impassable.jpg b/app/src/main/res/drawable-xxhdpi/surface_unpaved_impassable.jpg new file mode 100644 index 0000000000..0cd1f62952 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_unpaved_impassable.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/surface_unpaved_very_horrible.jpg b/app/src/main/res/drawable-xxhdpi/surface_unpaved_very_horrible.jpg new file mode 100644 index 0000000000..87e0b3a517 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/surface_unpaved_very_horrible.jpg differ diff --git a/app/src/main/res/drawable/ic_quest_path_surface_detail.xml b/app/src/main/res/drawable/ic_quest_path_surface_detail.xml new file mode 100644 index 0000000000..b019bf0237 --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_path_surface_detail.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/cell_labeled_icon_select_smoothness.xml b/app/src/main/res/layout/cell_labeled_icon_select_smoothness.xml new file mode 100644 index 0000000000..41481547af --- /dev/null +++ b/app/src/main/res/layout/cell_labeled_icon_select_smoothness.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/cell_labeled_image_select.xml b/app/src/main/res/layout/cell_labeled_image_select.xml index 342658cbdf..2cdf914611 100644 --- a/app/src/main/res/layout/cell_labeled_image_select.xml +++ b/app/src/main/res/layout/cell_labeled_image_select.xml @@ -11,7 +11,7 @@ android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true" + android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:scaleType="fitCenter" tools:src="@drawable/surface_asphalt" @@ -33,7 +33,7 @@ android:layout_height="wrap_content" android:layout_alignStart="@+id/imageView" android:layout_alignEnd="@+id/imageView" - android:layout_alignParentBottom="true" + android:layout_alignBottom="@+id/imageView" android:layout_centerHorizontal="true" style="@style/ImageSelectLabel" tools:text="@string/quest_surface_value_asphalt" diff --git a/app/src/main/res/layout/dialog_quest_smoothness_wrong_surface.xml b/app/src/main/res/layout/dialog_quest_smoothness_wrong_surface.xml new file mode 100644 index 0000000000..ccc311c5ac --- /dev/null +++ b/app/src/main/res/layout/dialog_quest_smoothness_wrong_surface.xml @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/app/src/main/res/raw/changelog.yml b/app/src/main/res/raw/changelog.yml index 832e2cbc0e..99bfc4c152 100644 --- a/app/src/main/res/raw/changelog.yml +++ b/app/src/main/res/raw/changelog.yml @@ -3,6 +3,7 @@ v39.0: |
  • How can cars park here, if at all? (#771) - street parking
  • Does this road have a shoulder? (#2444)
  • +
  • What is the surface quality of this road here? (#3257, #1630), special thanks to @Helium314, @mcliquid, @NicoHood, @rhhsm, @mnalis and many more
  • Where is this fire hydrant located? (#3368), by @thefeiter

Other enhancements

diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4707d521b..e4288229d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -281,6 +281,7 @@ The info you enter is then directly added to the OpenStreetMap in your name, wit "No" "Optionally" "No (leave note)" + "Yes (leave note)" "How many bikes can be parked here?" "Note that most normal stands can be used from both sides to park each one bike." "This house number looks very unusual." @@ -1083,6 +1084,50 @@ If you are overwhelmed by the number of quests, you can always fine-tune which q Preset name Default Selected + What is the surface quality of %s here? + What is the surface quality of this square? + What is the surface quality of this path here? + What is the surface quality of this road here? + Smooth and even + Mostly even + A little bumpy + Bumpy + Very bumpy + Very bumpy and uneven + Almost impassable + Impassable + + No bumps or cracks + Almost seamless + + Only small cracks, gaps, repairs or a little rough surface + Shallow or narrow gaps + Unusually flat stones, regular pattern, very shallow or narrow gaps + + Unusually rough surface, wider gaps, cracks, shallow ruts, potholes or other damages + Wider gaps, possibly some displaced stones or other damages + Flat stones or with square edges, shallow or narrow gaps + Well maintained, at most shallow bumps or potholes + + Big gaps, potholes, ruts, crumbled paving or other damages + Displaced stones, big gaps or other damages + Weathered stone or irregular shapes, big gaps or damages + Some bigger gravel, bumps, ruts or potholes + + Deep potholes, ruts or other dangerous damages + Big gaps, displaced, missing or irregularly shaped stones or dangerous damages + Missing and broken stones, gaps or other dangerous damages + Some large stones, deep potholes, bumps, ruts, erosion or other dangerous damages + + Properly usable only by off-road vehicles + Properly usable only by specialized off-road vehicles + Only passable on foot + + Surface is different + The surface was tagged as + There is an obstacle + Please provide a general answer for the smoothness. Single obstacles like kerbs, speed bumps or cattle grids can be ignored. Repeated or unexpected obstacles should count towards the answer + Try to estimate. What matters is the big picture rather than single damages. "Delete preset โ€œ%sโ€? The quest selection and order for it will be irrevocably lost." Is this picnic table covered (protected from rain)? Where is this fire hydrant located?