This is the concept for achievements.
Achievements gained will be shown to the user immediately in a dialog when granted. He can later look at them in a special screen for that. An achievement contains a picture, a title, optionally a short text and optionally one or several links.
The picture itself is part of the gratification, so it should look interesting itself. The title should already make clear what it was awarded for.
The text is either used to explain how the data added is useful, to introduce the user to OSM and/or to explain the link(s).
A link is something like a collectible: The links awarded in achievements will in turn be added to the users' link collection. At any time, the user can have a look at his link collection on a special screen for that.
Depending on the achievement awarded, the links may lead to (open source/free)...
Most, if not all achievements will follow a very simple pattern of just being awarded if X quests of a certain group or in total have been solved. The achievements will probably be "leveled", meaning that the user will f.e. get an achievement for solving 50, 100, 500 etc. quests. In the achievement screen, these will probably be displayed stacked, or even only the last.
So for general activity:
Solved a certain number of quests related to an interest group:
Where I need most help is finding the links: Both the links to things that introduce the user to OSM, showcase how certain OSM data is used and cool map-related things in general.
You can help by contributing here!:
https://wiki.openstreetmap.org/wiki/User:Westnordost/StreetComplete/Achievements
The feature is planned for v19.0 but don't hang, draw and quarter me if it takes longer. There is always something unplanned in this project. F.e. what's inside v17 was not really planned as well but took me almost a month of work.
footnote 1:
Certainly a nice thing to add, also as gratification, but the problem here is that these maps might be very volatile and vanish after some time from the internet. They'd probably have to be kept on my server or even bundled into the app. The latter would be a problem if these maps are not under a CC license, which most of them are. Also, maintaining and extending such a list of "interesting maps" is going to be a continuous curation job.
One important thing is for the achievements to also be applied retroactively — for people with very large amounts of edits already made in SC
for people with very large amounts of edits already made in SC
And for those who lost stars in an old phone or resetted an install :-)
Yes, don't worry
Maybe we could create a leader board per city/state/geographic region/nation/continent? 😙🎶
The way this could work is that on like every 50 edits the changeset numbers created since the last transmission are send to a server which stores the changeset number until the changesets are closed.
Then the server would read the changeset and add the number of changes to the user stats.
The position of each change will influence the user's score for the city/state/geographic region/nation/continent.
This could help to motivate people to do more, since there's competition.
You could also just add a list of user IDs to a friend list (which is stored in the private account settings of OSM as array) and show to the user on each start how the friends are doing, like how many points they make per day on average on the last 30 days and how much you're doing 😙🎶
Thank you for your thoughts how this could work technically, the idea is certainly alluring and a little competition can certainly have the effect of ramping up the motivation. However, the effect it will also have is that there will be people who solve the quests to get a better rank and not to contribute something to OSM. This can negatively affect the quality of the contributed data.
Since there is no verification of the data added, like I assume there is for Google maps, I'll not want to include direct comparisons of users like leaderboards into the app, at least until it is technically feasible to have other users verify the info added by the user.
It would become technically feasible once it is possible to make (Overpass) queries like for example "return all shops whose opening hours had last been set by user agent StreetComplete".
This can negatively affect the quality of the contributed data.
Sure, but there are since the beginning stats for OpenStreetMap which lists the users with the most changesets, the most edited points etc.
I see, that your App might attract more beginners, but I doubt someone will get so addictive to it, that they will try to cheat the system.
It's more though to be a 'get off your couch' motivation - which can be helpful at times 😉
Since there is no verification of the data added, like I assume there is for Google maps
Actually OSM supports that changesets should be checked. Never used this feature and haven't read the documentation how it's supposed to work, but it's there and we can use it - when appropriate.
Google Maps has a "verification" which is basically non-existing. Sure you probably cannot rename your favorite Pub on the map to something ridiculous... but real checks are not done to edits. See also:
I'll not want to include direct comparisons of users like leaderboards into the app, at least until it is technically feasible to have other users verify the info added by the user.
I understand this position. As I already pointed out I doubt it's really a threat to the data quality.
But we have to start somewhere anyway, so maybe the best option is to create the account wide star function and extend it to a clickable star, which shows how much quests has been solved in each region/city/etc.
This paper might help to design the achievement system
From weekly osm:
Researchers from Heidelberg University’s GIScience Research Group have published a paper on the role of spatially structured scoring systems as a motivational element in location-based games. They found that players who are confronted with a spatially structured scoring system are more likely to have a longer playing time, walk longer distances, and be more willing to take detours than those facing a spatially random scoring system.
http://k1z.blog.uni-heidelberg.de/2020/02/24/behavioural-effects-of-spatially-structured-scoring-systems-in-location-based-serious-games-a-case-study-in-the-context-of-openstreetmap/
I just read over it. ~I have the impression that I read this before, but don't remember where.~ Actually, I remember, it was a talk on the FOSSGIS 2018, it's from the same person as the paper:
https://media.ccc.de/v/2018-5329-spielbasierte_ansatze_in_der_geodatenerfassung (it's in German)
The study A/B-tested two different scoring systems, one that would give a random score for each solved quest and one that would give different scores based on the location of the solved quest ("spatially structured scoring system"). I wonder why this paper appears almost two years later after the talk.
Back to the paper, I'd summarize the findings as:
My very short critique of this paper would be that the participant group was not exactly big and of course, they knew they were part of a study, which is simply a different user group as the "normal StreetComplete user" as they had to take the app for a walk instead of an own motivation to contribute something to OSM.
But more importantly, the playing field was centered on the university campus, likely the starting point of all the participants, and incidentally that was also the area where the most score could be achieved in the spatial scoring system. So, it's really no wonder why most participants in that group stayed in this area.
Overall, this limits the validity of the findings somewhat and the findings as such are also not really surprising. However, I don't want to sound too harsh, the paper is still a good exercise of scientific work.
As for the applicability to StreetComplete: It suggests that by changing the scoring system from 1 quest = 1 star to something where the star count is based on the location, such as under-surveyed areas would help fill those gaps.
First off, in parts, we already have something similar: In areas, where the most important things are solved, there are simply less quests (=less stars) to solve. Also, I believe that users tend to have a sense for the importance of a quest, so they tend to go somewhere where there are (still) meaningful quests to solve. Also, the upcoming achievements will bolster the sense of meaningfulness for certain quest types because they showcase how it is used and in parts explain how it can be used.
Second, what makes areas survey-worthy and how to identify it? My answer to this would be the presence of certain quests that are perceived as very important (f.e. add road name). But then, it would rather make sense to award more stars not based on location, but based on the type of quest: Important quests award more stars, unimportant ones, less.
This idea also floated my mind some time but in the end I dropped it, because what is important and what not is somewhat up to each individual in OSM. Introducing this I fear would result in endless discussions in this tracker to readjust how much score each individual quest should grant.
Instead, the achievements will add a bit of this. If there is an application that uses certain data, that makes the collected data point more important. Most achievements will be based around providing a link that showcases the collected data of a group of quests for a specific interest. If there is no map or app that uses certain data, the user's motivation to solve certain quests (f.e. bench backrest) will be lower than if they see and can try out how it is used (f.e. osmbuildings).
This is why it is important to grant the "level 1" f an achievement that contains the first link relatively early
users [...] tend to go somewhere where there are (still) meaningful quests to solve.
N=1, but I can confirm that I go out of my way to solve quests I think are important (ex: house number).
N=2, we're getting somewhere. I put much more effort into "important" quests (though I have most of my stars from solving building types and levels from the car)
The following links will turn up in StreetComplete so far. It's WIP, more will be added.
Introduction
_Learning more about OpenStreetMap and its community._
Wiki: The wiki is your starting point to everything related OpenStreetMap
learnOSM: New to OpenStreetMap? This is a beginner's guideContributing
_Editors and other ways to contribute to OpenStreetMap._
Pic4Review Contribute to OSM simply by looking at pictures of your city
iD: Simple OSM editor for the browser. Optimized for the desktop or large tablets
JOSM: Fully-featured OSM editor for the desktop
Vespucci: Advanced OSM editor for AndroidShowcase
_Maps, services and apps that use OSM data, some of which you contributed yourself!_
CyclOSM: A map for bicyclists
BRouter: The routing engine for bicyclists. Also available as an app for offline navigation.
Wheelmap: A map for finding wheelchair accessible places
OSM Buildings: A map that shows the buildings in 3D
OpenVegeMap: Discover vegetarian and vegan restaurants in your city
TouchMapper: Create tactile maps easily for any address
Mapy.cz Tactile: Tactile maps for the visually impaired in various scales
ÖPNVKarte: A map of public transport routes and stops
Openrouteservice (wheelchair profile): Turn by turn navigation for wheelchair users
Nominatim: The geocoder for OSM data, used by many other servicesGoodies
_Interesting map-related stuff, not necessarily having that much to do with OSM._
City Roads: Render all roads of a city, for printing on T-Shirts, mugs, …
uMap: Create maps with custom data quickly and embed them in your site
MyOSMatic: Generate printable city maps in a few easy steps, optionally with a street directory
Show me the way: Watch OSM edits happen in real time
Do you have any feedback so far regarding the wording?
I have nothing to say about the wording.
But it might be nice to metion that games like Pokemon GO also use OSM
in context of SC I would not call iD easy. Maybe "editor allowing to add new objects and make any kind of edit" would describe it better? It is intended as explanation also for people whose first contact with OSM is SC.
https://anvaka.github.io/city-roads/ is both generating pretty map, fast and is properly crediting OSM. It went a bit viral some time ago.
Maybe mentioning some community channels including one using specific mediums (like Telegram channel, Slack channel etc) would be also a good idea? Not everyone will be interested in all of them but maybe someone already using communicator X will be interested in joining OSM channel?
I just remembered that https://www.reddit.com/r/openstreetmap/comments/6isju5/openstreetmap_websitesapps_to_share/ has quite well-curated list.
@matkoniecz Suggestions what else to add go here: https://wiki.openstreetmap.org/wiki/User:Westnordost/StreetComplete/Achievements
I think including the community index one way or another in the app is a good idea. But one thing after another.
By the way, regarding iD, I tried it on my smartphone and it is absolutely unusable there. The layout is not ideal for such a small screen but more importantly the performance is abysmal. This is why I wrote "optimized for the desktop" because the desktop has more power (though even on my beefy gaming/dev PC it's kind of slow). Using Firefox here. Does anyone have similar experiences, or is my smartphone just shitty?
No, iD is known to be unusable on smartphones, for many reasons. IIRC they have an open issue for that. And yes, mentioning that would be a good idea.
In general I guess this is a good idea and it takes some ideas from https://github.com/westnordost/StreetComplete/issues/178#issuecomment-299734982 and https://github.com/westnordost/StreetComplete/issues/1485.
A thing I miss in the wiki are the things you listed below the "Contributing" headline here, i.e. more tools that users can find/use to contribute in other (easy) ways. I would e.g. add NotesReview by @ENT8R to that list, because that can be used to directly review SC notes.
Next batch:
There will be the following achievements. The names are not final. Each level of one achievement will have the same icon, same title and same description. Only the unlocked links differ.
The links mentioned below will be awarded in that order in the different levels of the achievement.
What do you think of the wordings?
First Quest Solved
Welcome to the OpenStreetMap community!
Surveyor
You solved %d quests! Keep going to unlock more achievements that contain links to OSM and other map-related apps and projects!
Links: wiki, umap, learnosm, show-me-the-way, myosmatic, city-roadsRegular
You contributed %d days to OSM with this app! Regular contributors are the backbone of OSM, thanks for your dedication! ❤
Links: pic4review, ideditor, vespucciBicyclist
You solved %d quests that help bicyclists!
Links: cyclosm, brouterMobility
You solved %d quests that help wheelchair users get around town!
Links: wheelmap, openrouteservice-wheelchairPostman
You helped to locate %d addresses!nThis data is essential not only for the postman but also for any navigation system.
Links: nominatimHigh-Rise
You solved %d building related quests.nNote that this app asks for the housenumber of a building only after its type has been determined.
Links: osm_buildingsSixth Sense
You solved %d quests that are interesting for visually impaired.
Links: touch_mapper, mapy_tactileRunner
You solved %d quests that are interesting for people on foot!
Links: öpnvkarteKind to Animals
You solved %d quests that are interesting for people living on a no-meat diet!
Links: openvegemapOn the Road
You solved %d quests that improve detail on the street infrastructure, putting the "street" in OpenStreetMap!
Links: osrm, openrouteservice
The reason for why each achievement will have one title & description for all the levels is:
The user will be able to look at his achievements again later-on. In this view, only each the last achieved level of an achievement is shown, because it'll have the same icon anyway. I'd say people won't want to look through identical-looking achievements only because they have a different title.
Links can be looked at in a separate screen.
One thing I am missing out on with this decision is the possibility to spread usage tips like I suggested at https://github.com/westnordost/StreetComplete/issues/178#issuecomment-299736029
Though, I am not sure if so much is necessary. Most basic usage should be covered by the automatic tutorial.
I think it'd be useful if "You solved %d quests that help bicyclists!" and "You solved %d quests that help wheelchair users get around town!" were followed by an explanations of which quests are these
Well, there would be nothing surprising.
Wheelchair related quests are those with the wheelchair icon, bicycle quests are the pink ones (currently blue ones - I made the bicycle ones pink in the new update)
On 13 March 2020 09:30:04 CET, Kuba Orlik notifications@github.com wrote:
I think it'd be useful if "You solved %d quests that help bicyclists!"
and "You solved %d quests that help wheelchair users get around town!"
were followed by an explanations of which quests are these
(just brainstorming) maybe a button that shows only cycling/wheelchair-related quests on the map, then? If the type of the quests is obvious, their location might not - and they might be hidden because of an abundance of other type of quests
This is how the UI will look probably https://westnordost.de/misc/streetcomplete-achievements-etc.m4v
What would be the reasons pro and contra showing achievements that haven't been unlocked yet? Does anybody have some input? And what is your opinion? What I see:
Pro
Contra
Weak Contra
So far I planned the achievements to be "surprises" - one doesn't know what is unlocked and when it is unlocked, mainly because of that one contra point. But it is not a final decision.
So far I planned the achievements to be "surprises" - one doesn't know what is unlocked and when it is unlocked, mainly because of that one contra point. But it is not a final decision.
I think this is the right decision, but you should keep in mind that the people you're most worried about are going to search the internet for a list of achievements... and sooner or later, one of them is going to post a list that the others can find.
or they can just look at the github
and sooner or later, one of them is going to post a list that the others can find.
https://github.com/westnordost/StreetComplete/issues/1715#issuecomment-598400703 :joy:
Haha, you two. I forgot there was a list upthread. 🤦♂ I thought they'd have to poke through the source code. 😉
Haha, I am not worried about people looking through the source code. That's each one potential developer :-)
The achievements are defined here: https://github.com/westnordost/StreetComplete/blob/box2dview/app/src/main/java/de/westnordost/streetcomplete/data/user/achievements/AchievementsModule.kt#L269-L494
I'd also say that achievement lists online are not bad. This would be rather a sign of a "fan community", just like games have their (often) wikia.org communities where you can look up the secret hidden details of the game.
I guess if people do that, they are really keen on contributing, so this would be fine IMHO.
Also there may be a compromise between "show all unlocked" and "show no unlocked":
Pro: they can speculate and solve the quests of that certain type if they guess it correctly
Next batch:
There will be the following achievements. The names are not final. Each level of one achievement will have the same icon, same title and same description. Only the unlocked links differ.
The links mentioned below will be awarded in that order in the different levels of the achievement.What do you think of the wordings?
. . .
Are you sure about always having the same title for the achievement? I like the idea of granting users a new, slightliy more 'honorable' title when they achieved something (cf. suggestions on the OSM-wiki). I see that for some tasks you have quite some achievements, this would require lots of different titles, but then, how about levels? E.g. 'Lvl. 2 Bicyclist'
The level is displayed next to the title anyway.
So I planned to redesign the main view like this.

Opinions?
Nice! I really like the much wieder field of view.
Two small things:
a) It seems to me the center of the black star and the white circles is not on the same height. b) Why doesnt it have a white circle? Is it not a button? If it isn't, why not open the achievements-showcase on click.
I could imaginge that new users might confuse UI buttons with quest icons, both being (mostly) circular and white. Maybe a border could set the buttons off a bit better.
p.S.: Talking about the alignment of the star, I now realise, that for all the quests, the circle with the icon and the circular part of the white questmarker don't share the same center point. (what has been seen can never be unseen...)
Reminds me a bit of the Vespucci UI with the hamburger menu which is nice IMHO, nice to have common parts.
As @Sequynth as pointed out, the star having no background looks off to be honest.
Some quick reactions:
a) It seems to me the center of the black star and the white circles is not on the same height. b) Why doesnt it have a white circle? Is it not a button? If it isn't, why not open the achievements-showcase on click.
Yes, it is not a button. I could make the star smaller, so it is the same width as the buttons.
It does not open the achievements-showcase (aka "My Profile") because then it would be non-obvious for the user how to get to the "My Profile" screen. The tutorial mentions that you can login later via the profile screen, but who would expect it is behind a "star" button?
Remove the notification button and put it in the menu.
A possibility. But what advantages would it have? The notification button is invisible most of the time anyway. It is only shown when an achievement is unlocked, the user got an OSM message and when a new version has been released to show the changelog.
Swap the location of the upload and download buttons, since upload is more closely related to number of stars.
The upload button though is only shown when auto-sync is off.
Unsure how I feel about the undo button so far away from the other pieces of information about quests.
It is at the bottom so it is easily reachable with the thumb and because it is occluded while the quest form is open.
One possibility would be to not show the star at all, but just the counter.
The notification button is invisible most of the time anyway.
Oops, missed that. I did say they were quick reactions :laughing:
The upload button though is only shown when auto-sync is off.
Yes; when auto-sync is on, the download button would move over.
It is time for some alpha testing. Caution, hot, and probably very buggy. Who wants to try it out? Please write the bugs you find here or via email instead of posting an issue.
https://github.com/westnordost/StreetComplete/releases/tag/v19.0-alpha1
I am getting an exeption shortly after the first start, and then imidiatly at all next starts:
2020-04-22 08:47:57.628 1196-1266/de.westnordost.streetcomplete.debug E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-2
Process: de.westnordost.streetcomplete.debug, PID: 1196
java.lang.IllegalStateException: userDetails.profileImageUrl must not be null
at de.westnordost.streetcomplete.data.user.UserController$updateUser$1$1.invokeSuspend(UserController.kt:55)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:238)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
At the moment the Surveyor Achievement is showing me 8120 Solved Quest, but the Star Counter only 4087. Seems like the downloaded statistics were not applied everywhere. (The Star counter has updated, but my feeling is to the count of the first statistic download then processing of changesets was not finished. So I think the star counter is updated to the value of the last statistic download not the current or something like that.
I like the new UI in particular the quest download notification.
(after quick fixing the crash above) Clicking on the right most icon in the profil (the links to other projects I think):
2020-04-22 09:02:59.343 2563-2563/de.westnordost.streetcomplete.debug E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.westnordost.streetcomplete.debug, PID: 2563
android.content.res.Resources$NotFoundException: Drawable de.westnordost.streetcomplete.debug:drawable/ic_link_weeklyosm with resource ID #0x7f08013d
Caused by: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v24/ic_link_weeklyosm.xml from drawable resource ID #0x7f08013d
at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:847)
at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:631)
at android.content.res.Resources.getDrawableForDensity(Resources.java:888)
at android.content.res.Resources.getDrawable(Resources.java:827)
at android.content.Context.getDrawable(Context.java:635)
at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:454)
at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:144)
at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:132)
at androidx.appcompat.content.res.AppCompatResources.getDrawable(AppCompatResources.java:104)
at androidx.appcompat.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:86)
at androidx.appcompat.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:94)
at de.westnordost.streetcomplete.user.GroupedLinksAdapter$LinkViewHolder.onBind(GroupedLinksAdapter.kt:55)
at de.westnordost.streetcomplete.user.GroupedLinksAdapter.onBindViewHolder(GroupedLinksAdapter.kt:48)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:561)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:20693)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
at android.view.View.layout(View.java:20693)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20693)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins(RecyclerView.java:9587)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1685)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
at android.view.View.measure(View.java:23190)
2020-04-22 09:02:59.351 2563-2563/de.westnordost.streetcomplete.debug E/AndroidRuntime: at android.view.ViewGroup.measureChild(ViewGroup.java:6720)
at androidx.viewpager2.widget.ViewPager2.onMeasure(ViewPager2.java:498)
at android.view.View.measure(View.java:23190)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23190)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23190)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
at android.view.View.measure(View.java:23190)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2725)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1575)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1858)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1463)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7190)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalArgumentException: R is not a valid verb. Failure occurred at position 2 of path: STRING_TOO_LARGE
at android.util.PathParser.nCreatePathDataFromString(Native Method)
at android.util.PathParser.access$200(PathParser.java:24)
at android.util.PathParser$PathData.<init>(PathParser.java:76)
at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:2016)
at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1967)
at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:819)
at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:717)
at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
2020-04-22 09:02:59.352 2563-2563/de.westnordost.streetcomplete.debug E/AndroidRuntime: at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:833)
... 91 more
Thanks for the reports! Fixed most of it, though the thing with the achievements is something I cannot reproduce, particularly the "8120". Questions:
Nevermind, I found the culprit. Was just a display issue.
This is how the interface looks like now btw. Thanks @Akasch, I just finished the new download progress view yesterday.

Upload arrow is only shown if autosync is off, notification bell is only shown if there is at least one pending notification. Download-button moved back into the menu.
IMHO, this looks great.
oh I was wondering now that it shows what quests are being downloaded will we also get the abillity to look at logs of the times ?
The times are written to the system log. It looks like this:
I/QuestDownload: Quest types already in local store: AddBikeParkingCapacity, AddBikeParkingCover, AddBikeParkingType, AddBuildingLevels, AddBuildingType, AddBusStopName, AddBusStopShelter, AddCrossingType, AddCycleway, AddFerryAccessMotorVehicle, AddFerryAccessPedestrian, AddForestLeafType, AddHousenumber, AddIsBuildingUnderground, AddMaxHeight, AddMaxWeight, AddMotorcycleParkingCapacity, AddOneway, AddOpeningHours, AddOrchardProduce, AddParkingAccess, AddParkingFee, AddPathSurface, AddPlaceName, AddPlaygroundAccess, AddPostboxCollectionTimes, AddProhibitedForPedestrians, AddRailwayCrossingBarrier, AddRecyclingContainerMaterials, AddRecyclingType, AddReligionToPlaceOfWorship, AddRoadName, AddRoadSurface, AddRoofShape, AddSidewalk, AddSport, AddTactilePavingCrosswalk, AddToiletAvailability, AddToiletsFee, AddTracktype, AddTrafficSignalsSound, AddWayLit, AddWheelchairAccessToilets, DetermineRecyclingGlass, MarkCompletedHighwayConstruction, OsmNoteQuestType
I/QuestDownload: (10.04150390625,53.605544099237996,10.0634765625,53.618579364895155) Starting
I/QuestDownload: Quest types to download: AddWheelchairAccessPublicTransport, AddWheelchairAccessOutside, AddTactilePavingBusStop, AddBridgeStructure, AddReligionToWaysideShrine, AddCyclewaySegregation, MarkCompletedBuildingConstruction, AddGeneralFee, AddSelfServiceLaundry, AddHandrail
I/QuestDownload: AddWheelchairAccessPublicTransport: Added 0 new and removed 0 already resolved quests (total: 0) in 1s
I/QuestDownload: AddWheelchairAccessOutside: Added 0 new and removed 0 already resolved quests (total: 0) in 1s
I/QuestDownload: AddTactilePavingBusStop: Added 16 new and removed 0 already resolved quests (total: 16) in 1s
I/QuestDownload: AddBridgeStructure: Added 0 new and removed 0 already resolved quests (total: 0) in 0s
I/QuestDownload: AddReligionToWaysideShrine: Added 0 new and removed 0 already resolved quests (total: 0) in 1s
I/QuestDownload: AddCyclewaySegregation: Added 0 new and removed 0 already resolved quests (total: 0) in 1s
I/QuestDownload: MarkCompletedBuildingConstruction: Added 0 new and removed 0 already resolved quests (total: 0) in 0s
I/QuestDownload: AddGeneralFee: Added 0 new and removed 0 already resolved quests (total: 0) in 1s
I/QuestDownload: AddSelfServiceLaundry: Added 0 new and removed 0 already resolved quests (total: 0) in 0s
I/QuestDownload: AddHandrail: Added 3 new and removed 0 already resolved quests (total: 3) in 1s
I/QuestDownload: (10.04150390625,53.605544099237996,10.0634765625,53.618579364895155) Finished
@westnordost I'm not sure if you intended it, but it seems v19.0-alpha1 was published on f-droid, to the stable channel, with the crash on launch. So I think you will need to push something else soon or you are about to receive a lot of big reports.
Oh no. It is starting already...
On 24 April 2020 05:21:39 CEST, smichel17 notifications@github.com wrote:
@westnordost I'm not sure if you intended it, but it seems v19.0-alpha1
was published on f-droid, to the stable channel, with the crash on
launch. So I think you will need to push something else soon or you are
about to receive a lot of big reports :laugh:
I was going to suggest that you use f-droid's UpdateCheckIgnore option to prevent alpha updates from being deployed, but it turns out you're already using it: UpdateCheckIgnore: (alpha|beta|rc|RC)
As far as I can tell, that ought to match v19.0-alpha1. Can someone do a sanity check on that? Assuming I'm not crazy, I'll open an f-droid bug about it.
edit: added here: https://gitlab.com/fdroid/fdroidserver/-/issues/698#note_331152987
I also asked in matrix whether it's possible to fast-track a release and unfortunately they don't currently have that ability (but it's being worked on).
Ah, I thought I only specified "beta" or something and that is why it showed up. Looks like an F-Droid bug then
Left to do is to add illustrations for the achievements. I need to do at least
Any ideas for motives?
Just tried out the new version (master, ed6ab14):
FATAL EXCEPTION: DefaultDispatcher-worker-2
Process: de.westnordost.streetcomplete, PID: 27109
java.lang.IllegalStateException: userDetails.profileImageUrl must not be null
at de.westnordost.streetcomplete.data.user.UserController$updateUser$1$1.invokeSuspend(UserController.kt:55)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:238)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
FATAL EXCEPTION: DefaultDispatcher-worker-2
Process: de.westnordost.streetcomplete, PID: 27109
java.lang.IllegalStateException: userDetails.profileImageUrl must not be null
at de.westnordost.streetcomplete.data.user.UserController$updateUser$1$1.invokeSuspend(UserController.kt:55)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:238)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
This is the bug I should have fixed in alpha2. It continues to happen with alpha2?
Sometimes the animation seems to lag behind the actual query.
Yes, there is a minimum time one quest type is shown, and that is the time it takes for the checkmark animation to complete. This is deliberate to have a smooth animation. Bonus: When a quest type that takes extremely long is downloaded, it doesn't seem so long because the quests before were so quick ;-)
Once, I ended up in a state where the search indicator was not shown, but selecting "Scan for quests here" from the menu told me that there was an existing scan already. I think this bug might be present in v18, too, so don't worry about it too much :P
I re-did everything though, so if the bug "remains", it is still worth to track it. Tell me if you can reproduce it somehow.
Opening the new menu feels jarring; I'd rather have something like this, or just a plain old dialog like the previous overflow menu.
I agree, a transition animation would be nice. So, no dialog would be used but instead only a view that looks like a dialog (I don't think transition animations are possible with dialogs) and perhaps this can even be done with a layout transition animation. If it can, it would be just a few lines of code. Care to experiment with it?
It continues to happen with alpha2?
Yes, when upgrading an existing install (but not for a fresh install)
Okay, what the henk. The code is
val profileImageUrl = userDetails.profileImageUrl
if (profileImageUrl != null) { // <- line 55
updateAvatar(userDetails.id, profileImageUrl)
}
Ack, sorry, it might actually have been alpha1 from fdroid, I'm not sure. Getting logs off of a real device going back in time a few hours ago is a right pain. Here's another crash, that may have been the actual one I experienced…
E MapFragment: Error on disposing map
E MapFragment: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.mapzen.tangram.MapData.remove()' on a null object reference
E MapFragment: at com.mapzen.tangram.MapController.dispose(MapController.java:220)
E MapFragment: at com.mapzen.tangram.MapView.disposeMap(MapView.java:262)
E MapFragment: at com.mapzen.tangram.MapView.onDestroy(MapView.java:312)
E MapFragment: at de.westnordost.streetcomplete.map.MapFragment.onDestroy(MapFragment.kt:130)
E MapFragment: at de.westnordost.streetcomplete.map.LocationAwareMapFragment.onDestroy(LocationAwareMapFragment.kt:103)
E MapFragment: at de.westnordost.streetcomplete.map.QuestsMapFragment.onDestroy(QuestsMapFragment.kt:78)
E MapFragment: at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2927)
E MapFragment: at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
E MapFragment: at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
E MapFragment: at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
E MapFragment: at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
E MapFragment: at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2922)
E MapFragment: at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
E MapFragment: at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
E MapFragment: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
E MapFragment: at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
E MapFragment: at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
E MapFragment: at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:330)
E MapFragment: at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:365)
E MapFragment: at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:233)
E MapFragment: at android.app.Activity.performDestroy(Activity.java:7195)
E MapFragment: at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1161)
E MapFragment: at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4573)
E MapFragment: at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4609)
E MapFragment: at android.app.ActivityThread.-wrap7(ActivityThread.java)
E MapFragment: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
E MapFragment: at android.os.Handler.dispatchMessage(Handler.java:102)
E MapFragment: at android.os.Looper.loop(Looper.java:154)
E MapFragment: at android.app.ActivityThread.main(ActivityThread.java:6682)
E MapFragment: at java.lang.reflect.Method.invoke(Native Method)
E MapFragment: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
E MapFragment: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
I've seen the search indicator go through the quests once, but for every new scan it gets stuck at the AddName quest and eventually aborts. When I click on a AddName quest on the map while the AddName quest icon is shown in the search indicator the app crashes. This does not happen when clicking on other quests, but maybe id does when their icon would shown in the indicator, but that i cant test atm.
Once, I ended up in a state where the search indicator was not shown, but selecting "Scan for quests here" from the menu told me that there was an existing scan already. I think this bug might be present in v18, too, so don't worry about it too much :P
I see this as well, im running the alpha2. Also, when I minimize the map, the SC icon still appears in the status bar and says that a search is still running.
I'd love to post Logs, but where can i find them?
Talking about the alignment of the star, I now realise, that for all the quests, the circle with the icon and the circular part of the white questmarker don't share the same center point. (what has been seen can never be unseen...)
Thanks for fixing that :)
EDIT: I guess its the same issue as #1791
Bonus: When a quest type that takes extremely long is downloaded, it doesn't seem so long because the quests before were so quick ;-)
This section got long. for tl;dr, skip to second set of bullet points.
I know that it's in vogue right now to hide information from users (see also: Windows 10 "progress indicators"). When it works, it makes the software seem magical. When it doesn't, I feel like the software has been lying to me. And so, although I seem to be in a minority, I strongly dislike this trend. I associate it with exploitative software that tries to take agency away from its users.
I know this is a difficult problem to solve, because the queries are running asynchronously but the animation is shown in order, so any visualization that only shows a single element at a time necessarily shows a simplified representation. I'd still really like it if we can do these things when possible:
After checking what my animations were set to, I tested with animator duration at 0.5x and off, and was pleased with the results; off was my favorite, even if less pretty. While doing this, I realized that the checkbox animation is actually just a fixed duration (previously I thought it was a progress bar for downloading the quest data).
So, my suggestions are:
It would also be interesting if there were a way to show how many queries are remaining. Not sure how I would do that, though. Maybe a circle around the outside (determinate progress indicator) to show the % of queries that are finished?
I agree, a [menu] transition animation would be nice. […] Care to experiment with it?
Yes, but not soon. Momentum has been picking up at Snowdrift.coop, so I've been shifting my free time towards it, and will likely continue to do so through at least the end of June. …However, if you just left it as is, it'll probably keep getting my attention and I'll take a look at some point to scratch my own itch :laughing:
I don't understand how you can feel so strongly about this. The loading indicator does not lie and does not fake anything. The indicator shows the downloads in exactly the order in which it is executed and only if the download is super-fast, it lags behind a bit to be able to finish showing the animation.
But anyway, I tried out your suggestion to show an icon already with the checkmark animation finished when scrolling in so that it can scroll out right away again already. And I did not like it, it felt like the app skipped downloading that quest type for an unexplained reason.
I am closing this ticket now because I got the news the last thing that is missing will only dripple in slowly over time and not be available on first release anyway.
Sorry if I came on too strong; text is not a good medium for communicating emotions.
There is nothing terribly wrong with StreetComplete's indicator. However, in some ways it reminds me of computing trends that I find deeply offensive. I don't think I did a good job distinguishing between those two.
Put differently: when I notice behavior like this in other apps, I immediately become suspicious of the entire app (is it harvesting my data, trying to get me addicted, etc?). Not because the behavior itself is terrible, but because I've found it often goes hand in hand with anti-user attitudes, so I no longer trust the developers. I have a lot more trust in StreetComplete/you, but it still rubs me the wrong way.
Since I'm the only one who seems to feel this way so far, as a course of action I'd reccommend the same as the menu: leave it as-is and I will either get used to it or come back to scratch my own itch at some point.
For anyone else similarly bothered, 0.5x animator scale is nice (or off entirely).
Most helpful comment
So I planned to redesign the main view like this.
Opinions?