Features
- feat(systems): add PokeDaisy to GB, GBC, DS and hacks (#653) @ItsRetroPup
- feat(settings): unify NeoGlass styling across settings and systems (#687) @misobadev
- feat(systems): add the Play Store build of ARMSX3 to PS3 (#679) @ItsRetroPup
- feat(launch): support PS3 packages, serials, shortcuts and native ports (#691) @misobadev
- feat(settings): check for systems updates on demand (#696) @Codegnosis
- feat(search): open search with the West face button (#673) @ItsRetroPup
- feat(ui): unify NeoGlass dialogs and selection styling (#708) @misobadev
- feat(settings): add a game preview videos toggle (#709) @misobadev
- feat(games): add a configurable preview video delay (#712) @misobadev
- feat(ui): animate systems and game grids (#714) @misobadev
- feat(secondary): add an option to hide the system logo on the second screen (#677) @ItsRetroPup
- feat(neo-sync): apply NeoGlass styling and refine dashboard controls (#724) @misobadev
- feat(discovery): add the Discovery tab (#702) @ItsRetroPup
- feat(discovery): rebuild the board on the systems grid and refresh Android apps (#734) @misobadev
- feat(settings): add a performance mode for low-end devices (#737) @misobadev
- feat(systems): add Xendroid+ to Xbox 360 (#740) @ItsRetroPup
Fixes
- fix(collections): default smart collection rules to title (#649) @ItsRetroPup
- fix(ps3): scan ps3 and chd files (#650) @ItsRetroPup
- fix(tools): clear a finished tool's progress bar and report cleanup rows it couldn't remove (#651) @Codegnosis
- fix(romm): time out stalled downloads and fail archives that won't unpack (#635) @Codegnosis
- fix(romm): say why connecting to RomM failed, in the app language (#656) @Codegnosis
- fix(android): release a removed ROM folder's storage grant (#657) @Codegnosis
- fix(romm): say why browsing RomM failed, in the app language (#659) @Codegnosis
- fix(romm): fail stalled save and state transfers, not slow ones (#666) @Codegnosis
- fix(romm): write ROM downloads at the disk's pace, and fail on a full disk (#667) @Codegnosis
- fix(tools): keep the organiser's and cleanup's results when Tools is left mid-run (#668) @Codegnosis
- fix: stop custom sound imports and music track copies hanging on a full disk (#669) @Codegnosis
- fix(scan): keep the library on screen when Android ROM storage is unavailable (#671) @Codegnosis
- fix(scripts): point the systems JSON checker and formatter at assets/systems (#675) @Codegnosis
- fix(systems): name Xbox 360 so it sorts after Xbox (#680) @Codegnosis
- fix(neosync): give the NeoSync dialogues their own navigation layer (#681) @Codegnosis
- fix(input): open the Options panel from a pad's or remote's Menu (≡) button (#683) @Codegnosis
- fix(tools): count a ROM folder as skipped by the organiser on Android only when it can't be read (#688) @Codegnosis
- fix(launch): detect missing RetroArch cores before starting a game (#689) @misobadev
- fix(steamos): make custom save folders work on desktop and with a controller (#617) @ItsRetroPup
- fix(ra): refresh game catalogues without an app update (#665) @ItsRetroPup
- fix(esde): keep the picked ES-DE folder on Android without All files access (#692) @Codegnosis
- fix(neosync): close the delete, success and error dialogues once on Enter, and keep the save list's highlight (#693) @Codegnosis
- fix(picker): act once per Enter or arrow key in the in-app folder and file picker (#694) @Codegnosis
- fix(update): stop the app-update download at a failed write and remove the partial file (#695) @Codegnosis
- fix(neosync): keep the picked standalone save folder on Android without All files access (#700) @Codegnosis
- fix(search): remove the West shortcut buttons but keep the input (#706) @misobadev
- fix(update): end a stalled app-update download, let it be cancelled, and correct the Android error (#707) @Codegnosis
- fix(ui): make the Later and Cancel labels readable on the update and folder dialogues (#710) @Codegnosis
- fix(systems): map Steam and Amazon to ScreenScraper's PC Windows platform (#715) @Codegnosis
- fix(steam): stop the Steam Store scraper replacing metadata from other sources (#716) @Codegnosis
- fix(update): check the app update against the release, skip it without an AppImage, clean up old downloads (#718) @Codegnosis
- fix(scraper): keep scrape sessions to each game's own system (#720) @Codegnosis
- fix(romm): don't mark games as failing to sync when a RomM browse load fails (#721) @Codegnosis
- fix(neosync): say how a custom folder upload went, and don't let one unreadable folder hide saves (#722) @Codegnosis
- fix(neosync): show a game's failed save sync as failed, and only take the server's word for a full account (#723) @Codegnosis
- fix(neosync): keep a game's save sync up to date with the cloud (#725) @Codegnosis
- fix(neosync): don't mark games as failing to sync when listing the cloud files fails (#726) @Codegnosis
- fix(neosync): say when the online saves couldn't be loaded, instead of "No online saves found" (#727) @Codegnosis
- fix(neosync): sync PS2 memory cards, and recheck shared cards around a game session (#728) @Codegnosis
- fix(neosync): give up on NeoSync requests the server doesn't answer (#730) @Codegnosis
- fix(neosync): match RetroArch memory cards by the path they're uploaded under (#733) @Codegnosis
- fix(neosync): keep the save list's loading state to its own loads (#732) @Codegnosis
- fix(neosync): wait for the save list's rows before acting on one (#735) @Codegnosis
- fix(romm): don't fail the library link with another RomM load's error (#736) @Codegnosis
- fix(neosync): time out sign-in and billing requests, and say so in the app language (#731) @Codegnosis
- fix(neosync): send an upgrade or cancellation once, and say when one may have gone through (#738) @Codegnosis
- fix(neosync): don't let a cloud list fetched before a delete bring the save back (#739) @Codegnosis
- fix(neosync): give up on save uploads and downloads that stop moving (#741) @Codegnosis
- fix(neosync): stop a late launch sync dropping other games' downloads (#742) @Codegnosis
- fix(neosync): turn the save list's pages with L2/R2 (#743) @Codegnosis
- fix(romm): say why "Link library" couldn't load RomM's platforms (#744) @Codegnosis
- fix(systems): keep the Android system's ScreenScraper id across launches (#745) @Codegnosis
- fix(romm): close a RomM request's connection when it times out (#746) @Codegnosis
- fix(neosync): let a controller reach the delete prompt's switch (#747) @Codegnosis
- fix(launch): fill {file.localuri} in desktop launch arguments (#748) @Codegnosis
- fix(l10n): stop gluing plural endings onto words in the Tools messages (#749) @Codegnosis
- fix(game-list): keep a rebuilt game list behind the random-game dialogue (#751) @Codegnosis
- fix(steam): run the Steam Store scraper once at a time (#754) @Codegnosis
- fix(update): download app updates into a private folder of their own (#756) @Codegnosis
- fix(neosync): fit the save folders system list on short screens (#757) @Codegnosis
- fix(scan): scan every system folder that differs only in case (#752) @ItsRetroPup
- fix(settings): scroll the move user data dialogue on short screens (#758) @Codegnosis
- fix(scraper): stop media downloads and say so when the quota runs out (#759) @Codegnosis
- fix(systems): prefer the manifest system list over the GitHub API (#760) @misobadev
- fix(settings): make a user data move survive its log and abort cleanly (#763) @Codegnosis
- fix(scraper): fetch failed media again and report the quota at sign-in (#764) @Codegnosis
- fix(scraper): write downloaded media whole or not at all (#766) @Codegnosis
- fix(neosync): say what a plan change did; stop e-mail checks on back (#767) @Codegnosis
- fix(romm): sync saves when only the states listing fails, and ask again once (#768) @Codegnosis
- fix(neosync): don't report a failed "cloud is newer" download as synced, or write it after a launch (#770) @Codegnosis
- fix(systems): relaunch a DroidDeck game while DroidDeck is still running (#772) @Codegnosis
- fix(gamepad): keep two connected pads' sticks and D-pads apart (#774) @Codegnosis
- fix(romm): say when Link library couldn't read RomM, and reload the platform list each run (#775) @Codegnosis
- fix(neosync): reload the save list page after a delete (#777) @Codegnosis
- fix(window): use window_manager 0.6.0 native API (#795) @misobadev
- fix(android): reduce idle battery drain from the shared audio engine (#771) @Shape6253
- fix(setup): show scraped art after the wizard moves the user data (#779) @Codegnosis
- fix(android): let the volume keys through to Android (#780) @Codegnosis
- fix(neosync): keep a failed folder upload from turning every game red (#781) @Codegnosis
- fix(android): let the Files app write to NeoStation's folder (#790) @Codegnosis
- fix(settings): move the database whole and say why a move failed (#791) @Codegnosis
- fix(romm): sync standalone save folders without a NeoSync login (#794) @Codegnosis
- fix(scraper): keep edited metadata in "New content only" scrapes (#797) @Codegnosis
- fix(romm): keep playtime sync working on RomM 5.4 (#792) @Codegnosis
- fix(ci): pin linux-x64 build to ubuntu-24.04 (#801) @misobadev
Maintenance
- refactor(ui): simplify theme colours and refine system cards (#705) @misobadev
- refactor(saf): remove two helpers that call methods Android lacks (#750) @Codegnosis
- refactor(scraper): drop the media downloader's unread classification (#753) @Codegnosis
- test(steam): fix the single-run test's timing under load (#761) @Codegnosis
- test(neosync): fix the custom folder busy test's timing under load (#778) @Codegnosis
- ci: install the GTK, X11 and Xi packages the tests now build against (#798) @Codegnosis
- build: update Flutter, dependencies and Android toolchain (#796) @misobadev
- test(romm): format the playtime access test for Dart 3.13 (#799) @Codegnosis
- chore: prepare 0.16.0 release (#800) @misobadev
- fix(ci): pin linux-x64 build to ubuntu-24.04 (#801) @misobadev
Dependencies
- build(deps): bump the pub-dependencies group with 4 updates (#654) @dependabot[bot]
- feat(ui): animate systems and game grids (#714) @misobadev
- build(deps): bump sqlite3 from 3.7.1 to 3.8.0 in the pub-dependencies group (#713) @dependabot[bot]
- build(deps): bump the pub-dependencies group with 4 updates (#769) @dependabot[bot]
- build: update Flutter, dependencies and Android toolchain (#796) @misobadev
- chore: prepare 0.16.0 release (#800) @misobadev
Full Changelog: v0.15.1+132...v0.16.0+133