Skip to content

Feature/sta 227 - #946

Open
HughG wants to merge 96 commits into
mainfrom
feature/STA-227
Open

HughG wants to merge 96 commits into
mainfrom
feature/STA-227

Conversation

@HughG

@HughG HughG commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

Hi Dave, sorry this has been delayed so long! I'm taking a break from the daily grind of job-hunting, so maybe I can get this finished at last.

Implemented generation of in-app help screens from Markdown files.

  • The existing Help screens are still used by default. To view the new ones, turn on the relevant Settings -> Debug option in the app, then restart it.
  • One expected change which I think is okay, is that the FAQ sub-screens now have "Frequently Asked Questions" as the header, rather than "FAQ".
  • One issue with the new screens is that the FAQ page in-text headings are at one level lower than before, hence the heading text is smaller. Could hack in a workaround to use a higher heading level for those sub-pages.
  • The new screens are currently only there for English.
  • Generation of the website should still work, even though the Markdown files moved, because I updated the jekyll build step to copy them into the expected plate. I tested it at one point, but can't remember how now, so it may or may not still work!

I think the next steps are as follows, either in this ticket, or in a follow-on if this is okay to merge.

  • Write a little script to pull out translated Markdown files for all other locales.
  • Create a separate Weblate Component for each Markdown file.
  • Pre-populate the translations on Weblate for each Markdown component with the text pulled from the already-translated help string files. (I can probably knock up a script to create the files, but I'm not sure how easy it would be to bulk-upload them — I've never tried.)
  • Once at least a few locales are tested, switch to the new code permanently, then remove the old code.

Then someone could think about actually editing the files! Weblate seems to be smart enough if you add/remove new sections: it adds a matching English section to each translated Markdown file.

HughG and others added 30 commits October 31, 2025 13:41
Currently translated at 2.7% (2 of 73 strings)

Translation: Soundscape Android/Android Help Pages
Translate-URL: https://hosted.weblate.org/projects/soundscape-android/android-help-pages/en_GB/
…Mrardown and a translation, to see how it appears in Weblate.
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Soundscape Android/Android Help Pages
Translate-URL: https://hosted.weblate.org/projects/soundscape-android/android-help-pages/
Reading the generated baselines files from the device with adb fails because "/data/data/org/scottishtecharmy.soundscape" isn't world-readable, only world-traversable.  Making sub-dirs world-read/-traverse doesn't help.
Read the expected baselines from the correct place.
Got one test working.

The copying of new/different results out from the emulated device is still not working, though ChatGPT has another idea.
Tried this to copy to emulated SD card, but that doesn't work on recent Android SDKs.

ChatGPT's next suggestion was to gather all the results to a TAR file on the Android side and stream it out via adb, but I think I can just get the test to write diffs to the Gradle build folder directly, instead of to the Android filesystem.
Finally got one regression test working.  I learned that the tests are running entirely on the device, so have no access to the host filesystem, only to assets built into the test APK.  So, I had to use the TAR approach.
build.gradle.kts
* Make the pull & extract step run automatically with tests, and clean up the temp TAR file.

ComposeSnapshotTestUtils.kt
* Dump out all the modifiers as well as bounds (but stripping object IDs).
* Compare baseline and snapshot ignoring line endings, which may differ if the host is Windows.

menu_help_and_tutorials.txt
* Add back the regression file, with object details.
build.gradle.kts
* Make the pull & extract step run automatically with tests, and clean up the temp TAR file.

ComposeSnapshotTestUtils.kt
* Dump out all the modifiers as well as bounds (but stripping object IDs).
* Compare baseline and snapshot ignoring line endings, which may differ if the host is Windows.

menu_help_and_tutorials.txt
* Add back the regression file, with object details.
HelpScreenRegressionTest.kt
* Use existing AndroidX utility for escaping strings for filenames.
* Temporarily paste in the list of help sections, before converting to test parameters.
ComposeSnapshotTestUtils.kt
Help and Tutorials.txt
* More ID-stripping to avoid irrelevant diffs.

HelpScreenRegressionTest.kt
* Parameterised for main pages, but not FAQs yet.
HelpScreenRegressionTest.kt
* Parameterised for FAQs as well.
Just the very start, mostly "TODO" comments.
It's producing a slightly different layout and I'm not sure why, so I'm trying to capture and log the structure as the composables are called (with the help of Gemini Agent).

First I need to ignore the "$<N>" names of nested lambda classes in the diffs
Hopefully, once I switch the "Help and Tutorials" screen over to MarkdownHelpScreen I'll now be able to figure out what's really changed about the structure, without all the Anrdoid UI class details obscuring it ... unless the difference is in those details :-\
- Ignore depth of nested lambdas.
- Ignore main class renaming.
…ests, for faster feedback.

(Mostly by Gemini 3 Flash. Doesn't quite build yet.)
(Again, by Gemini 3 Flash.  Still doesn't quite build :-\)
Needs you to compile with JDK 19 as in GitHub, or at least not one so new that the testFixtures plugin won't recognise it, such as JDK 25.

The tests don't run due to fmod not being loaded in the test context, so that's next to fix.
Suggested by Gemini 3 Flash.  Doesn't work because the log order is different when the layout is non-lazy, but worth committing this change to keep for now.
HughG added 17 commits October 2, 2026 10:59
…use nightlyUnitTest to be configured before the testDebugUnitTest tasks are ready.
… with newer Gradle.

The tests still don't pass, though.  The baselines aren't being found, and in any case the help screens don't appear in the app -- just a black background with some error message.
I should have done this way back in b93363c when I moved them.
This is needed because the merge moved the Markdown help code/tests from using PreferenceManager to PreferenceProvider.
…ound on classpath

This is for Markdown help regression test files, which need to also be available as assets for test reasons.
They've changed too much in recent Android SDK versions to be worth comparing.
I checked these ones and they all look reasonable - minor structure, wording, and bounds changes.  A few need a more careful look.
Two pages had been renamed.

"page_Using Media Controls.txt" is actually fine, I think: the difference is because the cross-platform Markdown layout process produces larger gaps between paragraphs, so the "Next" and "Previous" media control descriptions are off the bottom of the emulated screen.  If I look at the page manually in the emulator, it's fine when I scroll it up.
# Conflicts:
#	app/src/main/assets/help/en/help-about-soundscape.pa.md
#	app/src/main/assets/help/en/help-ahead-of-me.pa.md
#	app/src/main/assets/help/en/help-around-me.pa.md
#	app/src/main/assets/help/en/help-audio-beacon.pa.md
#	app/src/main/assets/help/en/help-automatic-callouts.pa.md
#	app/src/main/assets/help/en/help-creating-markers.ar.md
#	app/src/main/assets/help/en/help-creating-markers.bg.md
#	app/src/main/assets/help/en/help-creating-markers.bn.md
#	app/src/main/assets/help/en/help-creating-markers.ca.md
#	app/src/main/assets/help/en/help-creating-markers.cs.md
#	app/src/main/assets/help/en/help-creating-markers.da.md
#	app/src/main/assets/help/en/help-creating-markers.de.md
#	app/src/main/assets/help/en/help-creating-markers.el.md
#	app/src/main/assets/help/en/help-creating-markers.en-GB.md
#	app/src/main/assets/help/en/help-creating-markers.es.md
#	app/src/main/assets/help/en/help-creating-markers.et.md
#	app/src/main/assets/help/en/help-creating-markers.fa.md
#	app/src/main/assets/help/en/help-creating-markers.fi.md
#	app/src/main/assets/help/en/help-creating-markers.fr-CA.md
#	app/src/main/assets/help/en/help-creating-markers.fr.md
#	app/src/main/assets/help/en/help-creating-markers.ha.md
#	app/src/main/assets/help/en/help-creating-markers.hi.md
#	app/src/main/assets/help/en/help-creating-markers.hr.md
#	app/src/main/assets/help/en/help-creating-markers.hu.md
#	app/src/main/assets/help/en/help-creating-markers.id.md
#	app/src/main/assets/help/en/help-creating-markers.is.md
#	app/src/main/assets/help/en/help-creating-markers.it.md
#	app/src/main/assets/help/en/help-creating-markers.ja.md
#	app/src/main/assets/help/en/help-creating-markers.ko.md
#	app/src/main/assets/help/en/help-creating-markers.md
#	app/src/main/assets/help/en/help-creating-markers.mr.md
#	app/src/main/assets/help/en/help-creating-markers.nb.md
#	app/src/main/assets/help/en/help-creating-markers.nl.md
#	app/src/main/assets/help/en/help-creating-markers.pl.md
#	app/src/main/assets/help/en/help-creating-markers.pt-BR.md
#	app/src/main/assets/help/en/help-creating-markers.pt.md
#	app/src/main/assets/help/en/help-creating-markers.ro.md
#	app/src/main/assets/help/en/help-creating-markers.ru.md
#	app/src/main/assets/help/en/help-creating-markers.sk.md
#	app/src/main/assets/help/en/help-creating-markers.sl.md
#	app/src/main/assets/help/en/help-creating-markers.sr.md
#	app/src/main/assets/help/en/help-creating-markers.sv.md
#	app/src/main/assets/help/en/help-creating-markers.sw.md
#	app/src/main/assets/help/en/help-creating-markers.ta.md
#	app/src/main/assets/help/en/help-creating-markers.te.md
#	app/src/main/assets/help/en/help-creating-markers.th.md
#	app/src/main/assets/help/en/help-creating-markers.tr.md
#	app/src/main/assets/help/en/help-creating-markers.uk.md
#	app/src/main/assets/help/en/help-creating-markers.ur.md
#	app/src/main/assets/help/en/help-creating-markers.vi.md
#	app/src/main/assets/help/en/help-creating-markers.zh-CN.md
#	app/src/main/assets/help/en/help-customizing-markers.ar.md
#	app/src/main/assets/help/en/help-customizing-markers.bg.md
#	app/src/main/assets/help/en/help-customizing-markers.bn.md
#	app/src/main/assets/help/en/help-customizing-markers.ca.md
#	app/src/main/assets/help/en/help-customizing-markers.cs.md
#	app/src/main/assets/help/en/help-customizing-markers.da.md
#	app/src/main/assets/help/en/help-customizing-markers.de.md
#	app/src/main/assets/help/en/help-customizing-markers.el.md
#	app/src/main/assets/help/en/help-customizing-markers.en-GB.md
#	app/src/main/assets/help/en/help-customizing-markers.es.md
#	app/src/main/assets/help/en/help-customizing-markers.et.md
#	app/src/main/assets/help/en/help-customizing-markers.fa.md
#	app/src/main/assets/help/en/help-customizing-markers.fi.md
#	app/src/main/assets/help/en/help-customizing-markers.fr-CA.md
#	app/src/main/assets/help/en/help-customizing-markers.fr.md
#	app/src/main/assets/help/en/help-customizing-markers.ha.md
#	app/src/main/assets/help/en/help-customizing-markers.hi.md
#	app/src/main/assets/help/en/help-customizing-markers.hr.md
#	app/src/main/assets/help/en/help-customizing-markers.hu.md
#	app/src/main/assets/help/en/help-customizing-markers.id.md
#	app/src/main/assets/help/en/help-customizing-markers.is.md
#	app/src/main/assets/help/en/help-customizing-markers.it.md
#	app/src/main/assets/help/en/help-customizing-markers.ja.md
#	app/src/main/assets/help/en/help-customizing-markers.ko.md
#	app/src/main/assets/help/en/help-customizing-markers.md
#	app/src/main/assets/help/en/help-customizing-markers.mr.md
#	app/src/main/assets/help/en/help-customizing-markers.nb.md
#	app/src/main/assets/help/en/help-customizing-markers.nl.md
#	app/src/main/assets/help/en/help-customizing-markers.pl.md
#	app/src/main/assets/help/en/help-customizing-markers.pt-BR.md
#	app/src/main/assets/help/en/help-customizing-markers.pt.md
#	app/src/main/assets/help/en/help-customizing-markers.ro.md
#	app/src/main/assets/help/en/help-customizing-markers.ru.md
#	app/src/main/assets/help/en/help-customizing-markers.sk.md
#	app/src/main/assets/help/en/help-customizing-markers.sl.md
#	app/src/main/assets/help/en/help-customizing-markers.sr.md
#	app/src/main/assets/help/en/help-customizing-markers.sv.md
#	app/src/main/assets/help/en/help-customizing-markers.sw.md
#	app/src/main/assets/help/en/help-customizing-markers.ta.md
#	app/src/main/assets/help/en/help-customizing-markers.te.md
#	app/src/main/assets/help/en/help-customizing-markers.th.md
#	app/src/main/assets/help/en/help-customizing-markers.tr.md
#	app/src/main/assets/help/en/help-customizing-markers.uk.md
#	app/src/main/assets/help/en/help-customizing-markers.ur.md
#	app/src/main/assets/help/en/help-customizing-markers.vi.md
#	app/src/main/assets/help/en/help-customizing-markers.zh-CN.md
#	app/src/main/assets/help/en/help-frequently-asked-questions.pa.md
#	app/src/main/assets/help/en/help-gps-accuracy.ar.md
#	app/src/main/assets/help/en/help-gps-accuracy.bg.md
#	app/src/main/assets/help/en/help-gps-accuracy.bn.md
#	app/src/main/assets/help/en/help-gps-accuracy.ca.md
#	app/src/main/assets/help/en/help-gps-accuracy.cs.md
#	app/src/main/assets/help/en/help-gps-accuracy.da.md
#	app/src/main/assets/help/en/help-gps-accuracy.de.md
#	app/src/main/assets/help/en/help-gps-accuracy.el.md
#	app/src/main/assets/help/en/help-gps-accuracy.en-GB.md
#	app/src/main/assets/help/en/help-gps-accuracy.es.md
#	app/src/main/assets/help/en/help-gps-accuracy.et.md
#	app/src/main/assets/help/en/help-gps-accuracy.fa.md
#	app/src/main/assets/help/en/help-gps-accuracy.fi.md
#	app/src/main/assets/help/en/help-gps-accuracy.fr-CA.md
#	app/src/main/assets/help/en/help-gps-accuracy.fr.md
#	app/src/main/assets/help/en/help-gps-accuracy.ha.md
#	app/src/main/assets/help/en/help-gps-accuracy.hi.md
#	app/src/main/assets/help/en/help-gps-accuracy.hr.md
#	app/src/main/assets/help/en/help-gps-accuracy.hu.md
#	app/src/main/assets/help/en/help-gps-accuracy.id.md
#	app/src/main/assets/help/en/help-gps-accuracy.is.md
#	app/src/main/assets/help/en/help-gps-accuracy.it.md
#	app/src/main/assets/help/en/help-gps-accuracy.ja.md
#	app/src/main/assets/help/en/help-gps-accuracy.ko.md
#	app/src/main/assets/help/en/help-gps-accuracy.md
#	app/src/main/assets/help/en/help-gps-accuracy.mr.md
#	app/src/main/assets/help/en/help-gps-accuracy.nb.md
#	app/src/main/assets/help/en/help-gps-accuracy.nl.md
#	app/src/main/assets/help/en/help-gps-accuracy.pa.md
#	app/src/main/assets/help/en/help-gps-accuracy.pl.md
#	app/src/main/assets/help/en/help-gps-accuracy.pt-BR.md
#	app/src/main/assets/help/en/help-gps-accuracy.pt.md
#	app/src/main/assets/help/en/help-gps-accuracy.ro.md
#	app/src/main/assets/help/en/help-gps-accuracy.ru.md
#	app/src/main/assets/help/en/help-gps-accuracy.sk.md
#	app/src/main/assets/help/en/help-gps-accuracy.sl.md
#	app/src/main/assets/help/en/help-gps-accuracy.sr.md
#	app/src/main/assets/help/en/help-gps-accuracy.sv.md
#	app/src/main/assets/help/en/help-gps-accuracy.sw.md
#	app/src/main/assets/help/en/help-gps-accuracy.ta.md
#	app/src/main/assets/help/en/help-gps-accuracy.te.md
#	app/src/main/assets/help/en/help-gps-accuracy.th.md
#	app/src/main/assets/help/en/help-gps-accuracy.tr.md
#	app/src/main/assets/help/en/help-gps-accuracy.uk.md
#	app/src/main/assets/help/en/help-gps-accuracy.ur.md
#	app/src/main/assets/help/en/help-gps-accuracy.vi.md
#	app/src/main/assets/help/en/help-gps-accuracy.zh-CN.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ar.md
#	app/src/main/assets/help/en/help-how-soundscape-works.bg.md
#	app/src/main/assets/help/en/help-how-soundscape-works.bn.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ca.md
#	app/src/main/assets/help/en/help-how-soundscape-works.cs.md
#	app/src/main/assets/help/en/help-how-soundscape-works.da.md
#	app/src/main/assets/help/en/help-how-soundscape-works.de.md
#	app/src/main/assets/help/en/help-how-soundscape-works.el.md
#	app/src/main/assets/help/en/help-how-soundscape-works.en-GB.md
#	app/src/main/assets/help/en/help-how-soundscape-works.es.md
#	app/src/main/assets/help/en/help-how-soundscape-works.et.md
#	app/src/main/assets/help/en/help-how-soundscape-works.fa.md
#	app/src/main/assets/help/en/help-how-soundscape-works.fi.md
#	app/src/main/assets/help/en/help-how-soundscape-works.fr-CA.md
#	app/src/main/assets/help/en/help-how-soundscape-works.fr.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ha.md
#	app/src/main/assets/help/en/help-how-soundscape-works.hi.md
#	app/src/main/assets/help/en/help-how-soundscape-works.hr.md
#	app/src/main/assets/help/en/help-how-soundscape-works.hu.md
#	app/src/main/assets/help/en/help-how-soundscape-works.id.md
#	app/src/main/assets/help/en/help-how-soundscape-works.is.md
#	app/src/main/assets/help/en/help-how-soundscape-works.it.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ja.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ko.md
#	app/src/main/assets/help/en/help-how-soundscape-works.md
#	app/src/main/assets/help/en/help-how-soundscape-works.mr.md
#	app/src/main/assets/help/en/help-how-soundscape-works.nb.md
#	app/src/main/assets/help/en/help-how-soundscape-works.nl.md
#	app/src/main/assets/help/en/help-how-soundscape-works.pa.md
#	app/src/main/assets/help/en/help-how-soundscape-works.pl.md
#	app/src/main/assets/help/en/help-how-soundscape-works.pt-BR.md
#	app/src/main/assets/help/en/help-how-soundscape-works.pt.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ro.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ru.md
#	app/src/main/assets/help/en/help-how-soundscape-works.sk.md
#	app/src/main/assets/help/en/help-how-soundscape-works.sl.md
#	app/src/main/assets/help/en/help-how-soundscape-works.sr.md
#	app/src/main/assets/help/en/help-how-soundscape-works.sv.md
#	app/src/main/assets/help/en/help-how-soundscape-works.sw.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ta.md
#	app/src/main/assets/help/en/help-how-soundscape-works.te.md
#	app/src/main/assets/help/en/help-how-soundscape-works.th.md
#	app/src/main/assets/help/en/help-how-soundscape-works.tr.md
#	app/src/main/assets/help/en/help-how-soundscape-works.uk.md
#	app/src/main/assets/help/en/help-how-soundscape-works.ur.md
#	app/src/main/assets/help/en/help-how-soundscape-works.vi.md
#	app/src/main/assets/help/en/help-how-soundscape-works.zh-CN.md
#	app/src/main/assets/help/en/help-markers.pa.md
#	app/src/main/assets/help/en/help-my-location.pa.md
#	app/src/main/assets/help/en/help-nearby-markers.pa.md
#	app/src/main/assets/help/en/help-routes.pa.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ar.md
#	app/src/main/assets/help/en/help-siri-voice-commands.bg.md
#	app/src/main/assets/help/en/help-siri-voice-commands.bn.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ca.md
#	app/src/main/assets/help/en/help-siri-voice-commands.cs.md
#	app/src/main/assets/help/en/help-siri-voice-commands.da.md
#	app/src/main/assets/help/en/help-siri-voice-commands.de.md
#	app/src/main/assets/help/en/help-siri-voice-commands.el.md
#	app/src/main/assets/help/en/help-siri-voice-commands.en-GB.md
#	app/src/main/assets/help/en/help-siri-voice-commands.es.md
#	app/src/main/assets/help/en/help-siri-voice-commands.et.md
#	app/src/main/assets/help/en/help-siri-voice-commands.fa.md
#	app/src/main/assets/help/en/help-siri-voice-commands.fi.md
#	app/src/main/assets/help/en/help-siri-voice-commands.fr-CA.md
#	app/src/main/assets/help/en/help-siri-voice-commands.fr.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ha.md
#	app/src/main/assets/help/en/help-siri-voice-commands.hi.md
#	app/src/main/assets/help/en/help-siri-voice-commands.hr.md
#	app/src/main/assets/help/en/help-siri-voice-commands.hu.md
#	app/src/main/assets/help/en/help-siri-voice-commands.id.md
#	app/src/main/assets/help/en/help-siri-voice-commands.is.md
#	app/src/main/assets/help/en/help-siri-voice-commands.it.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ja.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ko.md
#	app/src/main/assets/help/en/help-siri-voice-commands.md
#	app/src/main/assets/help/en/help-siri-voice-commands.mr.md
#	app/src/main/assets/help/en/help-siri-voice-commands.nb.md
#	app/src/main/assets/help/en/help-siri-voice-commands.nl.md
#	app/src/main/assets/help/en/help-siri-voice-commands.pa.md
#	app/src/main/assets/help/en/help-siri-voice-commands.pl.md
#	app/src/main/assets/help/en/help-siri-voice-commands.pt-BR.md
#	app/src/main/assets/help/en/help-siri-voice-commands.pt.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ro.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ru.md
#	app/src/main/assets/help/en/help-siri-voice-commands.sk.md
#	app/src/main/assets/help/en/help-siri-voice-commands.sl.md
#	app/src/main/assets/help/en/help-siri-voice-commands.sr.md
#	app/src/main/assets/help/en/help-siri-voice-commands.sv.md
#	app/src/main/assets/help/en/help-siri-voice-commands.sw.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ta.md
#	app/src/main/assets/help/en/help-siri-voice-commands.te.md
#	app/src/main/assets/help/en/help-siri-voice-commands.th.md
#	app/src/main/assets/help/en/help-siri-voice-commands.tr.md
#	app/src/main/assets/help/en/help-siri-voice-commands.uk.md
#	app/src/main/assets/help/en/help-siri-voice-commands.ur.md
#	app/src/main/assets/help/en/help-siri-voice-commands.vi.md
#	app/src/main/assets/help/en/help-siri-voice-commands.zh-CN.md
#	app/src/main/assets/help/en/help-tips.pa.md
#	app/src/main/assets/help/en/help-using-media-controls.pa.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ar.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.bg.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.bn.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ca.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.cs.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.da.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.de.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.el.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.en-GB.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.es.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.et.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.fa.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.fi.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.fr-CA.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.fr.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ha.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.hi.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.hr.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.hu.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.id.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.is.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.it.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ja.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ko.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.mr.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.nb.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.nl.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.pa.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.pl.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.pt-BR.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.pt.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ro.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ru.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.sk.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.sl.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.sr.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.sv.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.sw.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ta.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.te.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.th.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.tr.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.uk.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.ur.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.vi.md
#	app/src/main/assets/help/en/help-using-soundscape-offline.zh-CN.md
#	app/src/main/assets/help/en/help-voice-commands.ar.md
#	app/src/main/assets/help/en/help-voice-commands.bg.md
#	app/src/main/assets/help/en/help-voice-commands.bn.md
#	app/src/main/assets/help/en/help-voice-commands.ca.md
#	app/src/main/assets/help/en/help-voice-commands.cs.md
#	app/src/main/assets/help/en/help-voice-commands.da.md
#	app/src/main/assets/help/en/help-voice-commands.de.md
#	app/src/main/assets/help/en/help-voice-commands.el.md
#	app/src/main/assets/help/en/help-voice-commands.en-GB.md
#	app/src/main/assets/help/en/help-voice-commands.es.md
#	app/src/main/assets/help/en/help-voice-commands.et.md
#	app/src/main/assets/help/en/help-voice-commands.fa.md
#	app/src/main/assets/help/en/help-voice-commands.fi.md
#	app/src/main/assets/help/en/help-voice-commands.fr-CA.md
#	app/src/main/assets/help/en/help-voice-commands.fr.md
#	app/src/main/assets/help/en/help-voice-commands.ha.md
#	app/src/main/assets/help/en/help-voice-commands.hi.md
#	app/src/main/assets/help/en/help-voice-commands.hr.md
#	app/src/main/assets/help/en/help-voice-commands.hu.md
#	app/src/main/assets/help/en/help-voice-commands.id.md
#	app/src/main/assets/help/en/help-voice-commands.is.md
#	app/src/main/assets/help/en/help-voice-commands.it.md
#	app/src/main/assets/help/en/help-voice-commands.ja.md
#	app/src/main/assets/help/en/help-voice-commands.ko.md
#	app/src/main/assets/help/en/help-voice-commands.md
#	app/src/main/assets/help/en/help-voice-commands.mr.md
#	app/src/main/assets/help/en/help-voice-commands.nb.md
#	app/src/main/assets/help/en/help-voice-commands.nl.md
#	app/src/main/assets/help/en/help-voice-commands.pl.md
#	app/src/main/assets/help/en/help-voice-commands.pt-BR.md
#	app/src/main/assets/help/en/help-voice-commands.pt.md
#	app/src/main/assets/help/en/help-voice-commands.ro.md
#	app/src/main/assets/help/en/help-voice-commands.ru.md
#	app/src/main/assets/help/en/help-voice-commands.sk.md
#	app/src/main/assets/help/en/help-voice-commands.sl.md
#	app/src/main/assets/help/en/help-voice-commands.sr.md
#	app/src/main/assets/help/en/help-voice-commands.sv.md
#	app/src/main/assets/help/en/help-voice-commands.sw.md
#	app/src/main/assets/help/en/help-voice-commands.ta.md
#	app/src/main/assets/help/en/help-voice-commands.te.md
#	app/src/main/assets/help/en/help-voice-commands.th.md
#	app/src/main/assets/help/en/help-voice-commands.tr.md
#	app/src/main/assets/help/en/help-voice-commands.uk.md
#	app/src/main/assets/help/en/help-voice-commands.ur.md
#	app/src/main/assets/help/en/help-voice-commands.vi.md
#	app/src/main/assets/help/en/help-voice-commands.zh-CN.md
#	app/src/main/assets/help/en/help-voices.pa.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ar.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.bg.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.bn.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ca.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.cs.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.da.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.de.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.el.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.en-GB.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.es.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.et.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.fa.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.fi.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.fr-CA.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.fr.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ha.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.hi.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.hr.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.hu.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.id.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.is.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.it.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ja.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ko.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.mr.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.nb.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.nl.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.pl.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.pt-BR.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.pt.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ro.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ru.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.sk.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.sl.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.sr.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.sv.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.sw.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ta.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.te.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.th.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.tr.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.uk.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.ur.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.vi.md
#	app/src/main/assets/help/en/help-why-is-soundscape-working-offline-.zh-CN.md
#	app/src/main/assets/help/en/user.pa.md
#	gradle/libs.versions.toml
#	shared/src/commonMain/kotlin/org/scottishtecharmy/soundscape/navigation/SharedNavGraph.kt
IntelliJ's auto-merge left me with a bunch of 0-byte files instead of the correct content, for the new/renamed files.
After the merge there was a duplicate definition of robolectric.

I added TODO comments for the new Help features on main which I haven't implemented in my branch.
Updated this page, which I created manually, to reflect the correct order in the current app.
I'm pretty sure the pages are right, now, and not planning to change anything significant, so we don't need these on main.
@HughG
HughG changed the base branch from original-android-only to main October 15, 2026 07:04
I had left in the code which generated the log output for the regression tests.
@HughG
HughG deployed to development October 16, 2026 11:32 — with GitHub Actions Active
@HughG
HughG deployed to development October 16, 2026 11:32 — with GitHub Actions Active
@HughG
HughG deployed to development October 16, 2026 11:32 — with GitHub Actions Active
@HughG
HughG deployed to development October 16, 2026 11:32 — with GitHub Actions Active
The main branch doesn't have one subfolder per language, it just has all files in one flat folder, with the language code in the filename.
@HughG

HughG commented Oct 16, 2026

Copy link
Copy Markdown
Collaborator Author

Hi again, @davecraig. I've merged in the KMP changes and got the Markdown help pages basically working, tested for English (not sure how to test other locales), with a couple of TODOs. Come to think of it, I suspect other locales will not work until you translate the entry page, help-and-tutorials.md.

The website docs still appear to build correctly, but whatever script you have for regenerating the Markdown from the resource strings will need to updated to write them to '/app/src/main/assets/help`.

So, this branch should be ready to merge, but I can't guarantee it won't break main.

This branch was successfully deployed

1 active deployment
development — 713958c9 Deployed Oct 16, 2026 by HughG via Build and test iOS app #1612
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants