From d0978adacdd38cb3e6260b63381e711ea83ee13f Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Mon, 7 Feb 2022 19:03:42 +0000 Subject: [PATCH 01/15] Add sidewalk surface quest --- .../streetcomplete/data/meta/OsmTaggings.kt | 6 + .../{quests => osm}/sidewalk/Sidewalk.kt | 8 +- .../osm/sidewalk/SidewalkParser.kt | 54 ++++ .../streetcomplete/quests/QuestModule.kt | 2 + .../quests/sidewalk/AddSidewalk.kt | 2 + .../quests/sidewalk/AddSidewalkForm.kt | 2 + .../quests/sidewalk/SidewalkItem.kt | 7 +- .../quests/surface/AddSidewalkSurface.kt | 126 +++++++++ .../quests/surface/AddSidewalkSurfaceForm.kt | 244 ++++++++++++++++++ .../quests/surface/SidewalkSurfaceAnswer.kt | 9 + .../view/StreetSideSelectPuzzle.kt | 15 ++ app/src/main/res/values/strings.xml | 1 + 12 files changed, 469 insertions(+), 7 deletions(-) rename app/src/main/java/de/westnordost/streetcomplete/{quests => osm}/sidewalk/Sidewalk.kt (78%) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/quests/surface/SidewalkSurfaceAnswer.kt diff --git a/app/src/main/java/de/westnordost/streetcomplete/data/meta/OsmTaggings.kt b/app/src/main/java/de/westnordost/streetcomplete/data/meta/OsmTaggings.kt index e24f2ed1ce0..8de0cfe773c 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/data/meta/OsmTaggings.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/data/meta/OsmTaggings.kt @@ -30,6 +30,12 @@ val MAXSPEED_TYPE_KEYS = setOf( "zone:traffic" ) +val SIDEWALK_SURFACE_KEYS = setOf( + "sidewalk:both:surface", + "sidewalk:left:surface", + "sidewalk:right:surface" +) + const val SURVEY_MARK_KEY = "check_date" // generated by "make update" from https://github.com/mnalis/StreetComplete-taginfo-categorize/ diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/Sidewalk.kt b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/Sidewalk.kt similarity index 78% rename from app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/Sidewalk.kt rename to app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/Sidewalk.kt index ea4d0d50dc2..578646cca49 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/Sidewalk.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/Sidewalk.kt @@ -1,9 +1,9 @@ -package de.westnordost.streetcomplete.quests.sidewalk +package de.westnordost.streetcomplete.osm.sidewalk import de.westnordost.streetcomplete.data.osm.osmquests.Tags -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.NO -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.SEPARATE -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.YES +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.NO +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.SEPARATE +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.YES data class SidewalkSides(val left: Sidewalk, val right: Sidewalk) diff --git a/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt new file mode 100644 index 00000000000..c74d76c4cc0 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt @@ -0,0 +1,54 @@ +package de.westnordost.streetcomplete.osm.sidewalk + +import de.westnordost.streetcomplete.ktx.containsAny +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.NO +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.SEPARATE +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.YES + + +data class LeftAndRightSidewalk(val left: Sidewalk?, val right: Sidewalk?) + +/** Returns on which sides are sidewalks. Returns null if tagging is unknown */ +fun createSidewalkSides(tags: Map): LeftAndRightSidewalk? { + if (!tags.keys.containsAny(KNOWN_SIDEWALK_KEYS)) return null + + val sidewalk = createSidewalksDefault(tags) + if (sidewalk != null) return sidewalk + + // alternative tagging + val altSidewalk = createSidewalksAlternative(tags) + if (altSidewalk != null) return altSidewalk + + return null +} + +private fun createSidewalksDefault(tags: Map): LeftAndRightSidewalk? = when(tags["sidewalk"]) { + "left" -> LeftAndRightSidewalk(left = YES, right = NO) + "right" -> LeftAndRightSidewalk(left = NO, right = YES) + "both" -> LeftAndRightSidewalk(left = YES, right = YES) + "no" -> LeftAndRightSidewalk(left = NO, right = NO) + "none" -> LeftAndRightSidewalk(left = NO, right = NO) + "separate" -> LeftAndRightSidewalk(left = SEPARATE, right = SEPARATE) + else -> null +} + +private fun createSidewalksAlternative(tags: Map): LeftAndRightSidewalk? { + val sidewalkLeft = tags["sidewalk:both"] ?: tags["sidewalk:left"] + val sidewalkRight = tags["sidewalk:both"] ?: tags["sidewalk:right"] + return if (sidewalkLeft != null || sidewalkRight != null) { + LeftAndRightSidewalk(left = createSidewalkSide(sidewalkLeft), right = createSidewalkSide(sidewalkRight)) + } else { + null + } +} + +private fun createSidewalkSide(tag: String?): Sidewalk? = when(tag) { + "yes" -> YES + "no" -> NO + "separate" -> SEPARATE + else -> null +} + +private val KNOWN_SIDEWALK_KEYS = listOf( + "sidewalk", "sidewalk:left", "sidewalk:right", "sidewalk:both" +) 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 e6b0ad1be34..ca0fc3fa1a9 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestModule.kt @@ -118,6 +118,7 @@ import de.westnordost.streetcomplete.quests.surface.AddFootwayPartSurface import de.westnordost.streetcomplete.quests.surface.AddPathSurface import de.westnordost.streetcomplete.quests.surface.AddPitchSurface import de.westnordost.streetcomplete.quests.surface.AddRoadSurface +import de.westnordost.streetcomplete.quests.surface.AddSidewalkSurface import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingBusStop import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingCrosswalk import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingKerb @@ -387,6 +388,7 @@ import javax.inject.Singleton AddCyclewaySegregation(), // Cyclosm, Valhalla, Bike Citizens Bicycle Navigation... AddFootwayPartSurface(), AddCyclewayPartSurface(), + AddSidewalkSurface(), /* should best be after road surface because it excludes unpaved roads, also, need to search * for the sign which is one reason why it is disabled by default */ diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalk.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalk.kt index 06eecd75e5b..b155c4aebf7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalk.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalk.kt @@ -14,6 +14,8 @@ import de.westnordost.streetcomplete.osm.estimateCycleTrackWidth import de.westnordost.streetcomplete.osm.estimateParkingOffRoadWidth import de.westnordost.streetcomplete.osm.estimateRoadwayWidth import de.westnordost.streetcomplete.osm.guessRoadwayWidth +import de.westnordost.streetcomplete.osm.sidewalk.SidewalkSides +import de.westnordost.streetcomplete.osm.sidewalk.applyTo import de.westnordost.streetcomplete.util.isNearAndAligned class AddSidewalk : OsmElementQuestType { diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalkForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalkForm.kt index 8141c36cd5f..8ca4835d46e 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalkForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/AddSidewalkForm.kt @@ -1,5 +1,7 @@ package de.westnordost.streetcomplete.quests.sidewalk +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk +import de.westnordost.streetcomplete.osm.sidewalk.SidewalkSides import de.westnordost.streetcomplete.quests.AStreetSideSelectFragment diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/SidewalkItem.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/SidewalkItem.kt index 4b33f771d53..09652990afd 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/SidewalkItem.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/sidewalk/SidewalkItem.kt @@ -1,11 +1,12 @@ package de.westnordost.streetcomplete.quests.sidewalk import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk import de.westnordost.streetcomplete.quests.StreetSideDisplayItem import de.westnordost.streetcomplete.quests.StreetSideItem -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.NO -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.SEPARATE -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.YES +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.NO +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.SEPARATE +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.YES import de.westnordost.streetcomplete.view.image_select.DisplayItem import de.westnordost.streetcomplete.view.image_select.Item diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt new file mode 100644 index 00000000000..6f5d6f55fcd --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -0,0 +1,126 @@ +package de.westnordost.streetcomplete.quests.surface + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.meta.ANYTHING_UNPAVED +import de.westnordost.streetcomplete.data.meta.SIDEWALK_SURFACE_KEYS +import de.westnordost.streetcomplete.data.meta.hasCheckDateForKey +import de.westnordost.streetcomplete.data.meta.removeCheckDatesForKey +import de.westnordost.streetcomplete.data.meta.updateCheckDateForKey +import de.westnordost.streetcomplete.data.meta.updateWithCheckDate +import de.westnordost.streetcomplete.data.osm.osmquests.OsmFilterQuestType +import de.westnordost.streetcomplete.data.osm.osmquests.Tags +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.OUTDOORS +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.PEDESTRIAN +import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.WHEELCHAIR + +class AddSidewalkSurface : OsmFilterQuestType() { + + override val elementFilter = """ + ways with + highway ~ trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential + and area != yes + and motorroad != yes + and ( + sidewalk = both or sidewalk = left or sidewalk = right or + (sidewalk:left = yes and sidewalk:right ~ yes|no|separate) or + (sidewalk:right = yes and sidewalk:left ~ yes|no|separate) + ) + and ( + ${SIDEWALK_SURFACE_KEYS.joinToString(" and ") {"!$it"}} + or sidewalk:both:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:both:surface older today -4 years + or sidewalk:left:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:left:surface older today -4 years + or sidewalk:right:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:right:surface older today -4 years + or ${SIDEWALK_SURFACE_KEYS.joinToString(" or ") {"$it older today -8 years"}} + or ( + sidewalk:both:surface ~ paved|unpaved|cobblestone + and !sidewalk:both:surface:note + and !note:sidewalk:both:surface + ) + or ( + sidewalk:left:surface ~ paved|unpaved|cobblestone + and !sidewalk:left:surface:note + and !note:sidewalk:left:surface + ) + or ( + sidewalk:right:surface ~ paved|unpaved|cobblestone + and !sidewalk:right:surface:note + and !note:sidewalk:right:surface + ) + ) + """ + + override val changesetComment = "Add surface of sidewalks" + override val wikiLink = "Key:sidewalk" + override val icon = R.drawable.ic_quest_footway_surface + override val isSplitWayEnabled = true + override val questTypeAchievements = listOf(PEDESTRIAN, WHEELCHAIR, OUTDOORS) + override val defaultDisabledMessage = R.string.default_disabled_msg_difficult_and_time_consuming + + override fun getTitle(tags: Map) : Int = + R.string.quest_sidewalk_surface_title + + override fun createForm() = AddSidewalkSurfaceForm() + + override fun applyAnswerTo(answer: SidewalkSurfaceAnswer, tags: Tags, timestampEdited: Long) { + if (answer.left == answer.right) { + answer.left?.let { applySidewalkSurfaceAnswerTo(it, Side.BOTH, tags) } + deleteSidewalkSurfaceAnswerIfExists(Side.LEFT, tags) + deleteSidewalkSurfaceAnswerIfExists(Side.RIGHT, tags) + } else { + answer.left?.let { applySidewalkSurfaceAnswerTo(it, Side.LEFT, tags) } + answer.right?.let { applySidewalkSurfaceAnswerTo(it, Side.RIGHT, tags) } + deleteSidewalkSurfaceAnswerIfExists(Side.BOTH, tags) + } + deleteSidewalkSurfaceAnswerIfExists(null, tags) + + // only set the check date if nothing was changed + for (side in arrayOf("both", "left", "right")) { + if ((!tags.hasChanges && tags.containsKey("sidewalk:$side:surfface")) || + tags.hasCheckDateForKey("sidewalk:$side:surface")) { + tags.updateCheckDateForKey("sidewalk:$side:surface") + } + } + } + + private enum class Side(val value: String) { + LEFT("left"), RIGHT("right"), BOTH("both") + } + + private fun applySidewalkSurfaceAnswerTo(surface: SurfaceAnswer, side: Side, tags: Tags) + { + val sidewalkKey = "sidewalk:" + side.value + ":surface" + val osmValue = surface.value.osmValue + val previousOsmValue = tags[sidewalkKey] + + tags.updateWithCheckDate(sidewalkKey, osmValue) + // remove smoothness tag if surface was changed + if (previousOsmValue != null && previousOsmValue != osmValue) { + tags.remove("$sidewalkKey:smoothness") + tags.remove("$sidewalkKey:smoothness:date") + tags.removeCheckDatesForKey("$sidewalkKey:smoothness") + } + // add/remove note - used to describe generic surfaces + if (surface.note != null) { + tags["$sidewalkKey:note"] = surface.note + } else { + tags.remove("$sidewalkKey:note") + } + // clean up old source tags - source should be in changeset tags + tags.remove("source:$sidewalkKey") + } + + //TODO: add checks and removes for surface:note type thing, and also smoothness etc. + //TODO: done above, but add tests for those things + + /** clear previous answers for the given side */ + private fun deleteSidewalkSurfaceAnswerIfExists(side: Side?, tags: Tags) { + val sideVal = if (side == null) "" else ":" + side.value + val sidewalkSurfaceKey = "sidewalk$sideVal:surface" + + // only things are cleared that are set by this quest + // for example cycleway:surface should only be cleared by a cycleway surface quest etc. + tags.remove(sidewalkSurfaceKey) + tags.remove("$sidewalkSurfaceKey:note") + } + +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt new file mode 100644 index 00000000000..10fa6aabc9f --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt @@ -0,0 +1,244 @@ +package de.westnordost.streetcomplete.quests.surface + +import android.os.Bundle +import android.view.View +import androidx.annotation.AnyThread +import androidx.appcompat.app.AlertDialog +import androidx.core.view.isGone +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.osm.geometry.ElementPolylinesGeometry +import de.westnordost.streetcomplete.databinding.QuestStreetSidePuzzleWithLastAnswerButtonBinding +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk +import de.westnordost.streetcomplete.osm.sidewalk.createSidewalkSides +import de.westnordost.streetcomplete.quests.AbstractQuestFormAnswerFragment +import de.westnordost.streetcomplete.quests.StreetSideRotater +import de.westnordost.streetcomplete.quests.sidewalk.imageResId +import de.westnordost.streetcomplete.quests.sidewalk.titleResId +import de.westnordost.streetcomplete.util.normalizeDegrees +import de.westnordost.streetcomplete.view.ResImage +import de.westnordost.streetcomplete.view.ResText +import de.westnordost.streetcomplete.view.image_select.ImageListPickerDialog +import kotlin.math.absoluteValue + +class AddSidewalkSurfaceForm : AbstractQuestFormAnswerFragment() { + + override val contentLayoutResId = R.layout.quest_street_side_puzzle_with_last_answer_button + private val binding by contentViewBinding(QuestStreetSidePuzzleWithLastAnswerButtonBinding::bind) + + // override val otherAnswers get() = listOfNotNull( + // + // ) + + private val currentSidewalks get() = createSidewalkSides(osmElement!!.tags) + + override val contentPadding = false + + private var streetSideRotater: StreetSideRotater? = null + + private var isDefiningBothSides: Boolean = false + private var isLeftSideNotDefined: Boolean = false + private var isRightSideNotDefined: Boolean = false + + private var leftSide: SurfaceAnswer? = null + private var rightSide: SurfaceAnswer? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.puzzleView.onClickSideListener = { isRight -> showSurfaceSelectionDialog(isRight) } + + val defaultResId = R.drawable.ic_street_side_unknown + + binding.puzzleView.setLeftSideImage(ResImage(leftSide?.value?.asItem()?.drawableId ?: defaultResId)) + binding.puzzleView.setRightSideImage(ResImage(rightSide?.value?.asItem()?.drawableId ?: defaultResId)) + binding.puzzleView.setLeftSideText(leftSide?.value?.asItem()?.titleId?.let { ResText(it) }) + binding.puzzleView.setRightSideText(rightSide?.value?.asItem()?.titleId?.let { ResText(it) }) + + initStateFromTags() + + streetSideRotater = StreetSideRotater( + binding.puzzleView, + binding.littleCompass.root, + elementGeometry as ElementPolylinesGeometry + ) + + showTapHint() + initLastAnswerButton() + checkIsFormComplete() + } + + private fun initStateFromTags() { + val sides = createSidewalkSides(osmElement!!.tags) + val left = sides?.left + val right = sides?.right + + if (left != null && right != null) { + isDefiningBothSides = (left == Sidewalk.YES) && (right == Sidewalk.YES) + isRightSideNotDefined = (right == Sidewalk.NO) || (right == Sidewalk.SEPARATE) + isLeftSideNotDefined = (left == Sidewalk.NO) || (left == Sidewalk.SEPARATE) + if (right == Sidewalk.NO || right == Sidewalk.SEPARATE) { + binding.puzzleView.setRightSideText(ResText(right.titleResId)) + binding.puzzleView.setRightSideImage(ResImage(right.imageResId)) + binding.puzzleView.onlyLeftSideClickable() + } + if (left == Sidewalk.NO || left == Sidewalk.SEPARATE) { + binding.puzzleView.setLeftSideText(ResText(left.titleResId)) + binding.puzzleView.setLeftSideImage(ResImage(left.imageResId)) + binding.puzzleView.onlyRightSideClickable() + } + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + rightSide?.let { outState.putString(SIDEWALK_SURFACE_RIGHT, it.value.name) } + leftSide?.let { outState.putString(SIDEWALK_SURFACE_LEFT, it.value.name) } + outState.putBoolean(DEFINE_BOTH_SIDES, isDefiningBothSides) + } + + @AnyThread + override fun onMapOrientation(rotation: Float, tilt: Float) { + streetSideRotater?.onMapOrientation(rotation, tilt) + } + + private fun showTapHint() { + if ((leftSide == null || rightSide == null) && !HAS_SHOWN_TAP_HINT) { + if (leftSide == null && !isLeftSideNotDefined) binding.puzzleView.showLeftSideTapHint() + if (rightSide == null && !isRightSideNotDefined) binding.puzzleView.showRightSideTapHint() + HAS_SHOWN_TAP_HINT = true + } + } + + private fun showBothSides() { + isDefiningBothSides = true + binding.puzzleView.showBothSides() + binding.puzzleView.bothSidesClickable() + updateLastAnswerButtonVisibility() + checkIsFormComplete() + } + + /* ---------------------------------- selection dialog -------------------------------------- */ + + private fun showSurfaceSelectionDialog(isRight: Boolean) { + val ctx = context ?: return + val items = (PAVED_SURFACES + UNPAVED_SURFACES + Surface.WOODCHIPS + GROUND_SURFACES + GENERIC_SURFACES).toItems() + ImageListPickerDialog(ctx, items, R.layout.cell_labeled_image_select, 2) { + if (it.value!!.shouldBeDescribed) { + AlertDialog.Builder(requireContext()) + .setMessage(R.string.quest_surface_detailed_answer_impossible_confirmation) + .setPositiveButton(R.string.quest_generic_confirmation_yes) { _, _ -> + DescribeGenericSurfaceDialog(requireContext()) { description -> + onSelectedSide(SurfaceAnswer(it.value!!, description), isRight) + }.show() + } + .setNegativeButton(android.R.string.cancel, null) + .show() + } else { + onSelectedSide(SurfaceAnswer(it.value!!), isRight) + } + }.show() + } + + private fun onSelectedSide(surface: SurfaceAnswer, isRight: Boolean) { + val icon = ResImage(surface.value.asItem().drawableId!!) + val title = ResText(surface.value.asItem().titleId!!) + + if (isRight) { + binding.puzzleView.replaceRightSideImage(icon) + binding.puzzleView.setRightSideText(title) + rightSide = surface + } else { + binding.puzzleView.replaceLeftSideImage(icon) + binding.puzzleView.setLeftSideText(title) + leftSide = surface + } + updateLastAnswerButtonVisibility() + checkIsFormComplete() + } + + /* --------------------------------- last answer button ------------------------------------- */ + + private fun initLastAnswerButton() { + updateLastAnswerButtonVisibility() + + lastSelection?.let { + binding.lastAnswerButton.leftSideImageView.setImageResource(it.left.value.asItem().drawableId!!) + binding.lastAnswerButton.rightSideImageView.setImageResource(it.right.value.asItem().drawableId!!) + } + + binding.lastAnswerButton.root.setOnClickListener { applyLastSelection() } + } + + private fun updateLastAnswerButtonVisibility() { + val formIsPrefilled = leftSide != null || rightSide != null + val lastAnswerWasForBothSides = (lastSelection?.left != null && lastSelection?.right != null) + val isDefiningBothSides = isDefiningBothSides && lastAnswerWasForBothSides + + binding.lastAnswerButton.root.isGone = + lastSelection == null || formIsPrefilled || !isDefiningBothSides + } + + private fun saveLastSelection() { + val leftSide = leftSide + val rightSide = rightSide + if (leftSide != null && rightSide != null) { + lastSelection = + if (isRoadDisplayedUpsideDown()) + LastSidewalkSurfaceSelection(rightSide, leftSide) + else + LastSidewalkSurfaceSelection(leftSide, rightSide) + } + } + + private fun applyLastSelection() { + val lastSelection = lastSelection ?: return + if (isRoadDisplayedUpsideDown()) { + onSelectedSide(lastSelection.right, false) + onSelectedSide(lastSelection.left, true) + } else { + onSelectedSide(lastSelection.left, false) + onSelectedSide(lastSelection.right, true) + } + } + + private fun isRoadDisplayedUpsideDown(): Boolean = + binding.puzzleView.streetRotation.normalizeDegrees(-180f).absoluteValue > 90f + + /* --------------------------------------- apply answer ------------------------------------- */ + + override fun onClickOk() { + val leftSide = leftSide + val rightSide = rightSide + + val answer = SidewalkSurfaceAnswer( + left = leftSide, + right = rightSide + ) + + applyAnswer(answer) + + saveLastSelection() + } + + override fun isFormComplete() = ( + if (isDefiningBothSides) leftSide != null && rightSide != null + else leftSide != null || rightSide != null + ) + + override fun isRejectingClose() = (leftSide != null || rightSide != null) + + companion object { + private const val SIDEWALK_SURFACE_LEFT = "sidewalk_surface_left" + private const val SIDEWALK_SURFACE_RIGHT = "sidewalk_surface_right" + private const val DEFINE_BOTH_SIDES = "define_both_sides" + + private var HAS_SHOWN_TAP_HINT = false + + private var lastSelection: LastSidewalkSurfaceSelection? = null + } +} + +private data class LastSidewalkSurfaceSelection( + val left: SurfaceAnswer, + val right: SurfaceAnswer +) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/SidewalkSurfaceAnswer.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/SidewalkSurfaceAnswer.kt new file mode 100644 index 00000000000..64041918535 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/SidewalkSurfaceAnswer.kt @@ -0,0 +1,9 @@ +package de.westnordost.streetcomplete.quests.surface + +data class SidewalkSurfaceAnswer( + val left: SurfaceAnswer?, + val right: SurfaceAnswer?, +) + +data class SidewalkSurfaceSide(val surface: Surface) + diff --git a/app/src/main/java/de/westnordost/streetcomplete/view/StreetSideSelectPuzzle.kt b/app/src/main/java/de/westnordost/streetcomplete/view/StreetSideSelectPuzzle.kt index 5552f59dd12..bd7407bc924 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/view/StreetSideSelectPuzzle.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/view/StreetSideSelectPuzzle.kt @@ -203,6 +203,21 @@ class StreetSideSelectPuzzle @JvmOverloads constructor( binding.strut.layoutParams = params } + fun onlyLeftSideClickable() { + binding.leftSideContainer.isClickable = true + binding.rightSideContainer.isClickable = false + } + + fun onlyRightSideClickable() { + binding.rightSideContainer.isClickable = true + binding.leftSideContainer.isClickable = false + } + + fun bothSidesClickable() { + binding.rightSideContainer.isClickable = true + binding.leftSideContainer.isClickable = true + } + private fun replace(image: Image?, imgView: ImageView, flip180Degrees: Boolean) { val width = if (onlyShowingOneSide) binding.rotateContainer.width else binding.rotateContainer.width / 2 if (width == 0) return diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 141b7cab8ea..85db35b306f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -229,6 +229,7 @@ However, before uploading your changes, the app checks with a <a href=\"https Woodchips "What is the name of this place? (%s)" "Does this street have a sidewalk?" + "What is the surface of the sidewalk here?" "What is the name of this bus stop?" "What is the name of this streetcar stop?" "What is the reference number of this bus stop?" From 710409906ca4fdb4279539463ce894012cf9fd55 Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Mon, 7 Feb 2022 20:27:21 +0000 Subject: [PATCH 02/15] Add sidewalk surface tests and fix --- .../quests/surface/AddSidewalkSurface.kt | 26 ++-- .../StringMapChangesBuilderTest.kt | 1 + .../streetcomplete/quests/AddSidewalkTest.kt | 8 +- .../quests/surface/AddSidewalkSurfaceTest.kt | 132 ++++++++++++++++++ 4 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 6f5d6f55fcd..a8bfa64d1c7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -62,7 +62,13 @@ class AddSidewalkSurface : OsmFilterQuestType() { override fun createForm() = AddSidewalkSurfaceForm() override fun applyAnswerTo(answer: SidewalkSurfaceAnswer, tags: Tags, timestampEdited: Long) { - if (answer.left == answer.right) { + val previousLeftOsmValue = tags["sidewalk:left:surface"] + val previousRightOsmValue = tags["sidewalk:right:surface"] + + // Need to consider this so that smoothness values for each side are checked and deleted if necessary + val bothSidesPreviouslyDefinedSeparately = previousLeftOsmValue!=null && previousRightOsmValue != null && previousLeftOsmValue == previousRightOsmValue + + if (answer.left == answer.right && !bothSidesPreviouslyDefinedSeparately) { answer.left?.let { applySidewalkSurfaceAnswerTo(it, Side.BOTH, tags) } deleteSidewalkSurfaceAnswerIfExists(Side.LEFT, tags) deleteSidewalkSurfaceAnswerIfExists(Side.RIGHT, tags) @@ -75,7 +81,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { // only set the check date if nothing was changed for (side in arrayOf("both", "left", "right")) { - if ((!tags.hasChanges && tags.containsKey("sidewalk:$side:surfface")) || + if ((!tags.hasChanges && tags.containsKey("sidewalk:$side:surface")) || tags.hasCheckDateForKey("sidewalk:$side:surface")) { tags.updateCheckDateForKey("sidewalk:$side:surface") } @@ -88,11 +94,12 @@ class AddSidewalkSurface : OsmFilterQuestType() { private fun applySidewalkSurfaceAnswerTo(surface: SurfaceAnswer, side: Side, tags: Tags) { - val sidewalkKey = "sidewalk:" + side.value + ":surface" + val sidewalkKey = "sidewalk:" + side.value + val sidewalkSurfaceKey = "$sidewalkKey:surface" val osmValue = surface.value.osmValue - val previousOsmValue = tags[sidewalkKey] + val previousOsmValue = tags[sidewalkSurfaceKey] - tags.updateWithCheckDate(sidewalkKey, osmValue) + tags.updateWithCheckDate(sidewalkSurfaceKey, osmValue) // remove smoothness tag if surface was changed if (previousOsmValue != null && previousOsmValue != osmValue) { tags.remove("$sidewalkKey:smoothness") @@ -101,17 +108,14 @@ class AddSidewalkSurface : OsmFilterQuestType() { } // add/remove note - used to describe generic surfaces if (surface.note != null) { - tags["$sidewalkKey:note"] = surface.note + tags["$sidewalkSurfaceKey:note"] = surface.note } else { - tags.remove("$sidewalkKey:note") + tags.remove("$sidewalkSurfaceKey:note") } // clean up old source tags - source should be in changeset tags - tags.remove("source:$sidewalkKey") + tags.remove("source:$sidewalkSurfaceKey") } - //TODO: add checks and removes for surface:note type thing, and also smoothness etc. - //TODO: done above, but add tests for those things - /** clear previous answers for the given side */ private fun deleteSidewalkSurfaceAnswerIfExists(side: Side?, tags: Tags) { val sideVal = if (side == null) "" else ":" + side.value diff --git a/app/src/test/java/de/westnordost/streetcomplete/data/osm/edits/update_tags/StringMapChangesBuilderTest.kt b/app/src/test/java/de/westnordost/streetcomplete/data/osm/edits/update_tags/StringMapChangesBuilderTest.kt index 7d2f6b2e9f3..d7c9c148ddc 100644 --- a/app/src/test/java/de/westnordost/streetcomplete/data/osm/edits/update_tags/StringMapChangesBuilderTest.kt +++ b/app/src/test/java/de/westnordost/streetcomplete/data/osm/edits/update_tags/StringMapChangesBuilderTest.kt @@ -2,6 +2,7 @@ package de.westnordost.streetcomplete.data.osm.edits.update_tags import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse import org.junit.Test class StringMapChangesBuilderTest { diff --git a/app/src/test/java/de/westnordost/streetcomplete/quests/AddSidewalkTest.kt b/app/src/test/java/de/westnordost/streetcomplete/quests/AddSidewalkTest.kt index e0fd2ca115b..df49b06ebad 100644 --- a/app/src/test/java/de/westnordost/streetcomplete/quests/AddSidewalkTest.kt +++ b/app/src/test/java/de/westnordost/streetcomplete/quests/AddSidewalkTest.kt @@ -3,10 +3,10 @@ package de.westnordost.streetcomplete.quests import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapEntryAdd import de.westnordost.streetcomplete.data.osm.geometry.ElementPolylinesGeometry import de.westnordost.streetcomplete.quests.sidewalk.AddSidewalk -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.NO -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.SEPARATE -import de.westnordost.streetcomplete.quests.sidewalk.Sidewalk.YES -import de.westnordost.streetcomplete.quests.sidewalk.SidewalkSides +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.NO +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.SEPARATE +import de.westnordost.streetcomplete.osm.sidewalk.Sidewalk.YES +import de.westnordost.streetcomplete.osm.sidewalk.SidewalkSides import de.westnordost.streetcomplete.testutils.p import de.westnordost.streetcomplete.testutils.way import de.westnordost.streetcomplete.util.translate diff --git a/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt new file mode 100644 index 00000000000..c33061f5a06 --- /dev/null +++ b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt @@ -0,0 +1,132 @@ +package de.westnordost.streetcomplete.quests.surface + +import de.westnordost.streetcomplete.data.meta.toCheckDateString +import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapEntryAdd +import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapEntryDelete +import de.westnordost.streetcomplete.data.osm.edits.update_tags.StringMapEntryModify +import de.westnordost.streetcomplete.quests.verifyAnswer +import de.westnordost.streetcomplete.testutils.way +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue + +import org.junit.Test +import java.time.LocalDate + +class AddSidewalkSurfaceTest { + private val questType = AddSidewalkSurface() + + @Test fun `not applicable to road with separate sidewalks`() { + assertIsNotApplicable("sidewalk" to "separate") + } + + @Test fun `not applicable to road with no sidewalks`() { + assertIsNotApplicable("sidewalk" to "no") + } + + @Test fun `applicable to road with sidewalk on both sides`() { + assertIsApplicable("highway" to "residential", "sidewalk" to "both") + } + + @Test fun `applicable to road with sidewalk on only one side`() { + assertIsApplicable("highway" to "residential", "sidewalk" to "left") + + assertIsApplicable("highway" to "residential", "sidewalk" to "right") + } + + @Test fun `applicable to road with sidewalk on one side and separate sidewalk on the other`() { + assertIsApplicable("highway" to "residential", "sidewalk:left" to "yes", "sidewalk:right" to "separate") + + assertIsApplicable("highway" to "residential", "sidewalk:left" to "separate", "sidewalk:right" to "yes") + } + + @Test fun `applicable to road with sidewalk on one side and no sidewalk on the other`() { + assertIsApplicable("highway" to "residential", "sidewalk:left" to "yes", "sidewalk:right" to "no") + + assertIsApplicable("highway" to "residential", "sidewalk:left" to "no", "sidewalk:right" to "yes") + } + + @Test fun `apply asphalt surface on both sides`() { + questType.verifyAnswer( + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.ASPHALT), SurfaceAnswer(Surface.ASPHALT)), + StringMapEntryAdd("sidewalk:both:surface", "asphalt") + ) + } + + @Test fun `apply different surface on each side`() { + questType.verifyAnswer( + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.ASPHALT), SurfaceAnswer(Surface.PAVING_STONES)), + StringMapEntryAdd("sidewalk:left:surface", "asphalt"), + StringMapEntryAdd("sidewalk:right:surface", "paving_stones") + ) + } + + @Test fun `apply generic surface on both sides`() { + questType.verifyAnswer( + SidewalkSurfaceAnswer( + SurfaceAnswer(Surface.PAVED, "note"), + SurfaceAnswer(Surface.PAVED, "note")), + StringMapEntryAdd("sidewalk:both:surface", "paved"), + StringMapEntryAdd("sidewalk:both:surface:note", "note") + ) + } + + @Test fun `updates check_date`() { + questType.verifyAnswer( + mapOf("sidewalk:both:surface" to "asphalt", "check_date:sidewalk:both:surface" to "2000-10-10"), + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.ASPHALT), SurfaceAnswer(Surface.ASPHALT)), + StringMapEntryModify("sidewalk:both:surface", "asphalt", "asphalt"), + StringMapEntryModify("check_date:sidewalk:both:surface", "2000-10-10", LocalDate.now().toCheckDateString()), + ) + } + + @Test fun `sidewalk surface changes to be the same on both sides`() { + questType.verifyAnswer( + mapOf("sidewalk:left:surface" to "asphalt", "sidewalk:right:surface" to "paving_stones"), + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.CONCRETE), SurfaceAnswer(Surface.CONCRETE)), + StringMapEntryDelete("sidewalk:left:surface", "asphalt"), + StringMapEntryDelete("sidewalk:right:surface", "paving_stones"), + StringMapEntryAdd("sidewalk:both:surface", "concrete") + ) + } + + @Test fun `sidewalk surface changes on each side`() { + questType.verifyAnswer( + mapOf("sidewalk:left:surface" to "asphalt", "sidewalk:right:surface" to "paving_stones"), + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.CONCRETE), SurfaceAnswer(Surface.GRAVEL)), + StringMapEntryModify("sidewalk:left:surface", "asphalt", "concrete"), + StringMapEntryModify("sidewalk:right:surface", "paving_stones", "gravel"), + ) + } + + @Test fun `smoothness tag removed when surface changes`() { + questType.verifyAnswer( + mapOf("sidewalk:both:surface" to "asphalt", "sidewalk:both:smoothness" to "excellent"), + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.PAVING_STONES), SurfaceAnswer(Surface.PAVING_STONES)), + StringMapEntryDelete("sidewalk:both:smoothness", "excellent"), + StringMapEntryModify("sidewalk:both:surface", "asphalt","paving_stones") + ) + } + + @Test fun `keep separate sidewalk surface tagging and remove smoothness when surface changes`() { + questType.verifyAnswer( + mapOf("sidewalk:left:surface" to "asphalt", + "sidewalk:right:surface" to "asphalt", + "sidewalk:left:smoothness" to "excellent", + "sidewalk:right:smoothness" to "good" + ), + SidewalkSurfaceAnswer(SurfaceAnswer(Surface.PAVING_STONES), SurfaceAnswer(Surface.PAVING_STONES)), + StringMapEntryModify("sidewalk:left:surface", "asphalt", "paving_stones"), + StringMapEntryModify("sidewalk:right:surface", "asphalt", "paving_stones"), + StringMapEntryDelete("sidewalk:left:smoothness", "excellent"), + StringMapEntryDelete("sidewalk:right:smoothness", "good"), + ) + } + + private fun assertIsApplicable(vararg pairs: Pair) { + assertTrue(questType.isApplicableTo(way(nodes = listOf(1,2,3), tags = mapOf(*pairs)))) + } + + private fun assertIsNotApplicable(vararg pairs: Pair) { + assertFalse(questType.isApplicableTo(way(nodes = listOf(1,2,3), tags = mapOf(*pairs)))) + } +} From 664aa203002fb278080a96fd6d9f2c65c542f2df Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Tue, 8 Feb 2022 20:56:00 +0000 Subject: [PATCH 03/15] Improve checking if surface changed --- .../quests/surface/AddSidewalkSurface.kt | 47 +++++++++++++------ .../quests/surface/AddSidewalkSurfaceTest.kt | 11 +++-- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index a8bfa64d1c7..89f46fba2f7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -62,13 +62,19 @@ class AddSidewalkSurface : OsmFilterQuestType() { override fun createForm() = AddSidewalkSurfaceForm() override fun applyAnswerTo(answer: SidewalkSurfaceAnswer, tags: Tags, timestampEdited: Long) { - val previousLeftOsmValue = tags["sidewalk:left:surface"] - val previousRightOsmValue = tags["sidewalk:right:surface"] + val leftChanged = answer.left?.let { sideSurfaceChanged(it, Side.LEFT, tags) } + val rightChanged = answer.right?.let { sideSurfaceChanged(it, Side.RIGHT, tags) } - // Need to consider this so that smoothness values for each side are checked and deleted if necessary - val bothSidesPreviouslyDefinedSeparately = previousLeftOsmValue!=null && previousRightOsmValue != null && previousLeftOsmValue == previousRightOsmValue + if (leftChanged == true) { + deleteSmoothnessKeys(Side.LEFT, tags) + deleteSmoothnessKeys(Side.BOTH, tags) + } + if (rightChanged == true) { + deleteSmoothnessKeys(Side.RIGHT, tags) + deleteSmoothnessKeys(Side.BOTH, tags) + } - if (answer.left == answer.right && !bothSidesPreviouslyDefinedSeparately) { + if (answer.left == answer.right) { answer.left?.let { applySidewalkSurfaceAnswerTo(it, Side.BOTH, tags) } deleteSidewalkSurfaceAnswerIfExists(Side.LEFT, tags) deleteSidewalkSurfaceAnswerIfExists(Side.RIGHT, tags) @@ -92,20 +98,23 @@ class AddSidewalkSurface : OsmFilterQuestType() { LEFT("left"), RIGHT("right"), BOTH("both") } + private fun sideSurfaceChanged(surface: SurfaceAnswer, side: Side, tags: Tags): Boolean { + val previousSideValue = tags["sidewalk:${side.value}:surface"] + val previousBothOsmValue = tags["sidewalk:both:surface"] + val osmValue = surface.value.osmValue + + return if (previousSideValue != null && previousSideValue != osmValue) { + true + } else previousBothOsmValue != null && previousBothOsmValue != osmValue + } + private fun applySidewalkSurfaceAnswerTo(surface: SurfaceAnswer, side: Side, tags: Tags) { val sidewalkKey = "sidewalk:" + side.value val sidewalkSurfaceKey = "$sidewalkKey:surface" - val osmValue = surface.value.osmValue - val previousOsmValue = tags[sidewalkSurfaceKey] - - tags.updateWithCheckDate(sidewalkSurfaceKey, osmValue) - // remove smoothness tag if surface was changed - if (previousOsmValue != null && previousOsmValue != osmValue) { - tags.remove("$sidewalkKey:smoothness") - tags.remove("$sidewalkKey:smoothness:date") - tags.removeCheckDatesForKey("$sidewalkKey:smoothness") - } + + tags.updateWithCheckDate(sidewalkSurfaceKey, surface.value.osmValue) + // add/remove note - used to describe generic surfaces if (surface.note != null) { tags["$sidewalkSurfaceKey:note"] = surface.note @@ -116,6 +125,14 @@ class AddSidewalkSurface : OsmFilterQuestType() { tags.remove("source:$sidewalkSurfaceKey") } + /** clear smoothness tags for the given side*/ + private fun deleteSmoothnessKeys(side: Side, tags: Tags) { + val sidewalkKey = "sidewalk:" + side.value + tags.remove("$sidewalkKey:smoothness") + tags.remove("$sidewalkKey:smoothness:date") + tags.removeCheckDatesForKey("$sidewalkKey:smoothness") + } + /** clear previous answers for the given side */ private fun deleteSidewalkSurfaceAnswerIfExists(side: Side?, tags: Tags) { val sideVal = if (side == null) "" else ":" + side.value diff --git a/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt index c33061f5a06..b1c6ae616c3 100644 --- a/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt +++ b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt @@ -98,7 +98,7 @@ class AddSidewalkSurfaceTest { ) } - @Test fun `smoothness tag removed when surface changes`() { + @Test fun `smoothness tag removed when surface changes, same on both sides`() { questType.verifyAnswer( mapOf("sidewalk:both:surface" to "asphalt", "sidewalk:both:smoothness" to "excellent"), SidewalkSurfaceAnswer(SurfaceAnswer(Surface.PAVING_STONES), SurfaceAnswer(Surface.PAVING_STONES)), @@ -107,18 +107,19 @@ class AddSidewalkSurfaceTest { ) } - @Test fun `keep separate sidewalk surface tagging and remove smoothness when surface changes`() { + @Test fun `remove smoothness when surface changes, different on each side`() { questType.verifyAnswer( mapOf("sidewalk:left:surface" to "asphalt", - "sidewalk:right:surface" to "asphalt", + "sidewalk:right:surface" to "concrete", "sidewalk:left:smoothness" to "excellent", "sidewalk:right:smoothness" to "good" ), SidewalkSurfaceAnswer(SurfaceAnswer(Surface.PAVING_STONES), SurfaceAnswer(Surface.PAVING_STONES)), - StringMapEntryModify("sidewalk:left:surface", "asphalt", "paving_stones"), - StringMapEntryModify("sidewalk:right:surface", "asphalt", "paving_stones"), + StringMapEntryDelete("sidewalk:left:surface", "asphalt"), + StringMapEntryDelete("sidewalk:right:surface", "concrete"), StringMapEntryDelete("sidewalk:left:smoothness", "excellent"), StringMapEntryDelete("sidewalk:right:smoothness", "good"), + StringMapEntryAdd("sidewalk:both:surface", "paving_stones") ) } From b42f1bb4f89839fbf6cae3595c1ef58fe6675667 Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Sat, 12 Feb 2022 14:15:40 +0000 Subject: [PATCH 04/15] Display surface as floating circular image --- app/build.gradle.kts | 3 ++ .../quests/surface/AddSidewalkSurfaceForm.kt | 11 ++++---- .../view/StreetSideSelectPuzzle.kt | 20 +++++++++++++ .../res/layout/view_side_select_puzzle.xml | 28 +++++++++++++++++++ 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 266f1174751..a93d239c2bb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -183,6 +183,9 @@ dependencies { // opening hours parser implementation("ch.poole:OpeningHoursParser:0.26.0") + + // circular image view + implementation("de.hdodenhof:circleimageview:3.1.0") } /** Localizations that should be pulled from POEditor etc. */ diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt index 10fa6aabc9f..c0274cecff1 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt @@ -140,16 +140,15 @@ class AddSidewalkSurfaceForm : AbstractQuestFormAnswerFragment + + + + From 0e40b343bab4a260eacb33ac89abab46df4a8a4e Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Sat, 12 Feb 2022 16:30:30 +0000 Subject: [PATCH 05/15] Fix surface image icon display --- app/build.gradle.kts | 3 -- .../quests/surface/AddSidewalkSurfaceForm.kt | 8 ++++-- .../view/StreetSideSelectPuzzle.kt | 20 ------------- .../res/layout/view_side_select_puzzle.xml | 28 ------------------- 4 files changed, 5 insertions(+), 54 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a93d239c2bb..266f1174751 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -183,9 +183,6 @@ dependencies { // opening hours parser implementation("ch.poole:OpeningHoursParser:0.26.0") - - // circular image view - implementation("de.hdodenhof:circleimageview:3.1.0") } /** Localizations that should be pulled from POEditor etc. */ diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt index c0274cecff1..d0589ee51a1 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt @@ -15,8 +15,10 @@ import de.westnordost.streetcomplete.quests.StreetSideRotater import de.westnordost.streetcomplete.quests.sidewalk.imageResId import de.westnordost.streetcomplete.quests.sidewalk.titleResId import de.westnordost.streetcomplete.util.normalizeDegrees +import de.westnordost.streetcomplete.view.DrawableImage import de.westnordost.streetcomplete.view.ResImage import de.westnordost.streetcomplete.view.ResText +import de.westnordost.streetcomplete.view.RotatedCircleDrawable import de.westnordost.streetcomplete.view.image_select.ImageListPickerDialog import kotlin.math.absoluteValue @@ -140,14 +142,14 @@ class AddSidewalkSurfaceForm : AbstractQuestFormAnswerFragment - - - - From 86daf49cba28f442f10bee93de55a323b4071c4c Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Sun, 13 Feb 2022 13:13:16 +0000 Subject: [PATCH 06/15] Show unknown icons correctly for left hand drive and remove unneeded prefilling --- .../quests/surface/AddSidewalkSurfaceForm.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt index d0589ee51a1..f43540f2467 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt @@ -44,17 +44,19 @@ class AddSidewalkSurfaceForm : AbstractQuestFormAnswerFragment showSurfaceSelectionDialog(isRight) } - val defaultResId = R.drawable.ic_street_side_unknown + val defaultResId = + if (isLeftHandTraffic) R.drawable.ic_street_side_unknown_l + else R.drawable.ic_street_side_unknown - binding.puzzleView.setLeftSideImage(ResImage(leftSide?.value?.asItem()?.drawableId ?: defaultResId)) - binding.puzzleView.setRightSideImage(ResImage(rightSide?.value?.asItem()?.drawableId ?: defaultResId)) - binding.puzzleView.setLeftSideText(leftSide?.value?.asItem()?.titleId?.let { ResText(it) }) - binding.puzzleView.setRightSideText(rightSide?.value?.asItem()?.titleId?.let { ResText(it) }) + binding.puzzleView.setLeftSideImage(ResImage(defaultResId)) + binding.puzzleView.setRightSideImage(ResImage(defaultResId)) initStateFromTags() From 4d5278354bfcb0780ef422286f0acceab2cc3b7d Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Thu, 17 Feb 2022 18:19:57 +0000 Subject: [PATCH 07/15] Add sidewalk surface icon --- .../quests/surface/AddSidewalkSurface.kt | 2 +- .../drawable/ic_quest_sidewalk_surface.xml | 133 ++++++++++++++++++ res/graphics/quest/sidewalk_surface.svg | 47 +++++++ 3 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_quest_sidewalk_surface.xml create mode 100644 res/graphics/quest/sidewalk_surface.svg diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 89f46fba2f7..b136599270b 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -51,7 +51,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { override val changesetComment = "Add surface of sidewalks" override val wikiLink = "Key:sidewalk" - override val icon = R.drawable.ic_quest_footway_surface + override val icon = R.drawable.ic_quest_sidewalk_surface override val isSplitWayEnabled = true override val questTypeAchievements = listOf(PEDESTRIAN, WHEELCHAIR, OUTDOORS) override val defaultDisabledMessage = R.string.default_disabled_msg_difficult_and_time_consuming diff --git a/app/src/main/res/drawable/ic_quest_sidewalk_surface.xml b/app/src/main/res/drawable/ic_quest_sidewalk_surface.xml new file mode 100644 index 00000000000..2fe558498ef --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_sidewalk_surface.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/graphics/quest/sidewalk_surface.svg b/res/graphics/quest/sidewalk_surface.svg new file mode 100644 index 00000000000..2a26de7eb6c --- /dev/null +++ b/res/graphics/quest/sidewalk_surface.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3b5ba3f1ae6712f584c30469035b5b25cba1755c Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Fri, 25 Feb 2022 09:43:21 +0000 Subject: [PATCH 08/15] Don't include side in check_date --- .../streetcomplete/quests/surface/AddSidewalkSurface.kt | 9 +++------ .../quests/surface/AddSidewalkSurfaceTest.kt | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index b136599270b..3b5e0dcd349 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -86,11 +86,8 @@ class AddSidewalkSurface : OsmFilterQuestType() { deleteSidewalkSurfaceAnswerIfExists(null, tags) // only set the check date if nothing was changed - for (side in arrayOf("both", "left", "right")) { - if ((!tags.hasChanges && tags.containsKey("sidewalk:$side:surface")) || - tags.hasCheckDateForKey("sidewalk:$side:surface")) { - tags.updateCheckDateForKey("sidewalk:$side:surface") - } + if (!tags.hasChanges || tags.hasCheckDateForKey("sidewalk:surface")) { + tags.updateCheckDateForKey("sidewalk:surface") } } @@ -113,7 +110,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { val sidewalkKey = "sidewalk:" + side.value val sidewalkSurfaceKey = "$sidewalkKey:surface" - tags.updateWithCheckDate(sidewalkSurfaceKey, surface.value.osmValue) + tags[sidewalkSurfaceKey] = surface.value.osmValue // add/remove note - used to describe generic surfaces if (surface.note != null) { diff --git a/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt index b1c6ae616c3..f3cff40ecf0 100644 --- a/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt +++ b/app/src/test/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceTest.kt @@ -72,10 +72,10 @@ class AddSidewalkSurfaceTest { @Test fun `updates check_date`() { questType.verifyAnswer( - mapOf("sidewalk:both:surface" to "asphalt", "check_date:sidewalk:both:surface" to "2000-10-10"), + mapOf("sidewalk:both:surface" to "asphalt", "check_date:sidewalk:surface" to "2000-10-10"), SidewalkSurfaceAnswer(SurfaceAnswer(Surface.ASPHALT), SurfaceAnswer(Surface.ASPHALT)), StringMapEntryModify("sidewalk:both:surface", "asphalt", "asphalt"), - StringMapEntryModify("check_date:sidewalk:both:surface", "2000-10-10", LocalDate.now().toCheckDateString()), + StringMapEntryModify("check_date:sidewalk:surface", "2000-10-10", LocalDate.now().toCheckDateString()), ) } From e3597ebbbebdb41040656bf95ea42350bbc4687e Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Fri, 25 Feb 2022 10:07:05 +0000 Subject: [PATCH 09/15] Simplify element filter --- .../quests/surface/AddSidewalkSurface.kt | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 3b5e0dcd349..f94ec00e669 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -21,31 +21,13 @@ class AddSidewalkSurface : OsmFilterQuestType() { and area != yes and motorroad != yes and ( - sidewalk = both or sidewalk = left or sidewalk = right or + sidewalk ~ both|left|right or (sidewalk:left = yes and sidewalk:right ~ yes|no|separate) or (sidewalk:right = yes and sidewalk:left ~ yes|no|separate) ) and ( ${SIDEWALK_SURFACE_KEYS.joinToString(" and ") {"!$it"}} - or sidewalk:both:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:both:surface older today -4 years - or sidewalk:left:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:left:surface older today -4 years - or sidewalk:right:surface ~ ${ANYTHING_UNPAVED.joinToString("|")} and sidewalk:right:surface older today -4 years - or ${SIDEWALK_SURFACE_KEYS.joinToString(" or ") {"$it older today -8 years"}} - or ( - sidewalk:both:surface ~ paved|unpaved|cobblestone - and !sidewalk:both:surface:note - and !note:sidewalk:both:surface - ) - or ( - sidewalk:left:surface ~ paved|unpaved|cobblestone - and !sidewalk:left:surface:note - and !note:sidewalk:left:surface - ) - or ( - sidewalk:right:surface ~ paved|unpaved|cobblestone - and !sidewalk:right:surface:note - and !note:sidewalk:right:surface - ) + or sidewalk:surface older today -8 years ) """ From 3590944046b57253d7a65724915341ef81ea341a Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Fri, 25 Feb 2022 10:09:14 +0000 Subject: [PATCH 10/15] Better comment --- .../streetcomplete/quests/surface/AddSidewalkSurface.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index f94ec00e669..3cb5e0e7218 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -67,7 +67,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { } deleteSidewalkSurfaceAnswerIfExists(null, tags) - // only set the check date if nothing was changed + // only set the check date if nothing was changed or if check date was already set if (!tags.hasChanges || tags.hasCheckDateForKey("sidewalk:surface")) { tags.updateCheckDateForKey("sidewalk:surface") } From f2b5842d236d66b8565806c939242764bda3fa4f Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Fri, 25 Feb 2022 10:16:26 +0000 Subject: [PATCH 11/15] Check for sidewalk:both --- .../streetcomplete/quests/surface/AddSidewalkSurface.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 3cb5e0e7218..bedcc42bc38 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -22,6 +22,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { and motorroad != yes and ( sidewalk ~ both|left|right or + sidewalk:both = yes (sidewalk:left = yes and sidewalk:right ~ yes|no|separate) or (sidewalk:right = yes and sidewalk:left ~ yes|no|separate) ) From 2435b2986d386a115028d8662a39a161404fcb9d Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Sun, 27 Feb 2022 18:05:31 +0000 Subject: [PATCH 12/15] Comment about filter and fix achievements --- .../streetcomplete/quests/surface/AddSidewalkSurface.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index bedcc42bc38..327aa8466f6 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -1,20 +1,18 @@ package de.westnordost.streetcomplete.quests.surface import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.data.meta.ANYTHING_UNPAVED import de.westnordost.streetcomplete.data.meta.SIDEWALK_SURFACE_KEYS import de.westnordost.streetcomplete.data.meta.hasCheckDateForKey import de.westnordost.streetcomplete.data.meta.removeCheckDatesForKey import de.westnordost.streetcomplete.data.meta.updateCheckDateForKey -import de.westnordost.streetcomplete.data.meta.updateWithCheckDate import de.westnordost.streetcomplete.data.osm.osmquests.OsmFilterQuestType import de.westnordost.streetcomplete.data.osm.osmquests.Tags -import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.OUTDOORS import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.PEDESTRIAN import de.westnordost.streetcomplete.data.user.achievements.QuestTypeAchievement.WHEELCHAIR class AddSidewalkSurface : OsmFilterQuestType() { + // Only roads with 'complete' sidewalk tagging (at least one side has sidewalk, other side specified) override val elementFilter = """ ways with highway ~ trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential @@ -36,7 +34,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { override val wikiLink = "Key:sidewalk" override val icon = R.drawable.ic_quest_sidewalk_surface override val isSplitWayEnabled = true - override val questTypeAchievements = listOf(PEDESTRIAN, WHEELCHAIR, OUTDOORS) + override val questTypeAchievements = listOf(PEDESTRIAN, WHEELCHAIR) override val defaultDisabledMessage = R.string.default_disabled_msg_difficult_and_time_consuming override fun getTitle(tags: Map) : Int = From d4d6bad4ca9ad82029530ec6f414da5b14ad7bf0 Mon Sep 17 00:00:00 2001 From: arrival-spring Date: Sun, 27 Feb 2022 19:05:22 +0000 Subject: [PATCH 13/15] Fixes after merge and tidying --- .../westnordost/streetcomplete/quests/QuestsModule.kt | 2 ++ .../quests/surface/AddSidewalkSurface.kt | 2 +- .../quests/surface/AddSidewalkSurfaceForm.kt | 11 +++-------- .../quests/surface/AddSidewalkSurfaceTest.kt | 4 ++-- 4 files changed, 8 insertions(+), 11 deletions(-) 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 ac2717b70d6..a1b71fc096d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -120,6 +120,7 @@ import de.westnordost.streetcomplete.quests.surface.AddFootwayPartSurface import de.westnordost.streetcomplete.quests.surface.AddPathSurface import de.westnordost.streetcomplete.quests.surface.AddPitchSurface import de.westnordost.streetcomplete.quests.surface.AddRoadSurface +import de.westnordost.streetcomplete.quests.surface.AddSidewalkSurface import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingBusStop import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingCrosswalk import de.westnordost.streetcomplete.quests.tactile_paving.AddTactilePavingKerb @@ -406,6 +407,7 @@ whether the postbox is still there in countries in which it is enabled */ AddCyclewaySegregation(), // Cyclosm, Valhalla, Bike Citizens Bicycle Navigation... AddFootwayPartSurface(), AddCyclewayPartSurface(), + AddSidewalkSurface(), AddCyclewayWidth(arSupportChecker), // should be after cycleway segregation /* should best be after road surface because it excludes unpaved roads, also, need to search diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 327aa8466f6..0bf58f3fc2d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -20,7 +20,7 @@ class AddSidewalkSurface : OsmFilterQuestType() { and motorroad != yes and ( sidewalk ~ both|left|right or - sidewalk:both = yes + sidewalk:both = yes or (sidewalk:left = yes and sidewalk:right ~ yes|no|separate) or (sidewalk:right = yes and sidewalk:left ~ yes|no|separate) ) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt index f43540f2467..f82fa9119bd 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurfaceForm.kt @@ -27,10 +27,6 @@ class AddSidewalkSurfaceForm : AbstractQuestFormAnswerFragment Date: Sun, 27 Feb 2022 20:35:56 +0100 Subject: [PATCH 14/15] shortcut --- .../westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt index c74d76c4cc0..7765d069383 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/osm/sidewalk/SidewalkParser.kt @@ -26,8 +26,7 @@ private fun createSidewalksDefault(tags: Map): LeftAndRightSidew "left" -> LeftAndRightSidewalk(left = YES, right = NO) "right" -> LeftAndRightSidewalk(left = NO, right = YES) "both" -> LeftAndRightSidewalk(left = YES, right = YES) - "no" -> LeftAndRightSidewalk(left = NO, right = NO) - "none" -> LeftAndRightSidewalk(left = NO, right = NO) + "no", "none" -> LeftAndRightSidewalk(left = NO, right = NO) "separate" -> LeftAndRightSidewalk(left = SEPARATE, right = SEPARATE) else -> null } From 71a523db6e32419a4367f7f80318dfa8499095d8 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Sun, 27 Feb 2022 20:36:04 +0100 Subject: [PATCH 15/15] consistent naming + simplify return statement --- .../streetcomplete/quests/surface/AddSidewalkSurface.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt index 0bf58f3fc2d..be89778b519 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/surface/AddSidewalkSurface.kt @@ -77,13 +77,12 @@ class AddSidewalkSurface : OsmFilterQuestType() { } private fun sideSurfaceChanged(surface: SurfaceAnswer, side: Side, tags: Tags): Boolean { - val previousSideValue = tags["sidewalk:${side.value}:surface"] + val previousSideOsmValue = tags["sidewalk:${side.value}:surface"] val previousBothOsmValue = tags["sidewalk:both:surface"] val osmValue = surface.value.osmValue - return if (previousSideValue != null && previousSideValue != osmValue) { - true - } else previousBothOsmValue != null && previousBothOsmValue != osmValue + return previousSideOsmValue != null && previousSideOsmValue != osmValue + || previousBothOsmValue != null && previousBothOsmValue != osmValue } private fun applySidewalkSurfaceAnswerTo(surface: SurfaceAnswer, side: Side, tags: Tags)