## yuroyami/syncplay-mobile — v0.25.0…v0.26.0

_92 commits._

### Features
- **feat(visualizer): warn about flashing light once, and follow reduce motion** (d89590d)
- **feat(kite): study a linked song in seconds and switch to the visualizer without a gap** (ff230f6)
- **feat(about): draw the about popup in liquid glass** (0ef767f)
- **feat(ios): move vlckit to 4.0.0a24** (d8870b6)
- **feat(gif): open the GIF panel where it was left** (373a8fa)
- **feat(about): box the description and fit short phones** (327ea33)
- **feat(ui): fade notices in and out** (85f55f5)
- **feat(home): put a v before the version** (2758a25)
- **feat(home): keep five recent rooms under the join key** (c5f8de2)
- **feat(chapters): show a still frame for each chapter** (e2b1def)
- **feat(exo): show chapters from Matroska and MP4 files** (bb40922)
- **feat(i18n): list the app in Android's per-app language setting** (a7d91dc)
- **feat(subtitles): send the episode and the file hash with a search** (9980d98)
- **feat(net): say why a connection failed** (81ce895)
- **feat(tls): encrypt hosted rooms on request; trust by fingerprint** (c686c7a)
- **feat(ios): picture in picture for AVPlayer and KitePlayer** (7a6cc5e)
- **feat(player): show the buffered band on mpv, KitePlayer and AVPlayer** (354d456)
- **feat(media): show lost folder access and missing playlist files** (17ee7a6)
- **feat(log): hide identifying text in the log, and bound its size** (c2145c6)
- **feat(server): limit what the hosted server admits** (75fef04)
- **feat(about): list the open source licences; add the privacy manifest** (f51e764)
- **feat(sync): close a small drift with a speed nudge that nobody notices** (4ed804a)
- **feat(sync): age each State by its own delay, not a smoothed average** (7b64651)
- **feat(desktop): open a video file or link dropped onto the window** (32e4e6a)
- **feat(desktop): show a scrollbar on long panels and screens** (7f2a65d)
- **feat(desktop): hide the mouse pointer with the room controls** (bb69c57)
- **feat(a11y): keep the room controls on screen while a screen reader runs** (6112a77)
- **feat(release): put the iOS download and install note in one cell** (d8d89db)
- **feat(release): collapse downloads and align the download tables** (f076ad4)
- **feat(release): the downloads compare two builds in one table, and headings do the folding** (69b3c7b)
- **feat(release): the release page leads with the logo, and downloads say what each build can do** (dde7230)

### Fixes
- **fix(home): keep the recent rooms still while a room opens** (08ce114)
- **fix(server): stop cleanly when a client leaves during the stop** (9a8e549)
- **fix(strings): name no site in the link note** (d817736)
- **perf(room): skip unchanged rail cells and cache focus outlines** (e8cb3cb)
- **fix(desktop): leave arrow keys to a focused slider, stepper or field** (b061485)
- **perf(gif): bound animated image loads on iOS and desktop** (123f60e)
- **perf(android): add a baseline profile and its generator** (fc64d8d)
- **fix(i18n): return to the device language at once below Android 13** (257f110)
- **perf(mpv): start each core off the main thread** (2e3733c)
- **fix(settings): open the file actions again after a cancel** (3f5effc)
- **fix(join): join from links, shortcuts and Quick Actions at any time** (914404c)
- **fix(media): keep headset buttons and system controls away from the room** (17c0e39)
- **fix(player): keep the mpv volume and add Exo subtitles without a reload** (e968048)
- **fix(ui): shrink text before it is cut, and test at 1.3 text scale** (7f7d563)
- **fix(player): announce each file once, carry track picks across files** (4dabc3e)
- **fix(net): never send a timed-out message again after a reconnect** (f84154e)
- **fix(server): drop only the client whose handler fails** (9376a42)
- **fix(i18n): pick the plural form by the language on screen** (83b7543)
- **fix(ios): declare the non-exempt encryption that the app ships** (06bd15c)
- **fix(ios): remove the unused photo library purpose string** (74db612)
- **fix(strings): word the room notices as Syncplay does** (1bad81f)
- **fix(pip): offer picture-in-picture only where the device supports it** (f9963d7)
- **fix(tv): keep remote focus in an open side panel, and give it back on close** (857dbd5)
- **fix(mpv): set options and load files off the main thread** (6d3360a)
- **fix(ios): build the pods for iOS 15.0, like the Xcode project** (777e055)
- **fix(ui): make the stepper arrows 48dp tall so a finger can reach them** (5ca9738)
- **fix(release): find the previous release relative to the version being written** (5e9c5ba)
- **fix(ios): the app needs iOS 15.0, and everything that quoted 14.1 now says so** (1eceba3)
- **fix(release): the changelog names its version once** (d651e4f)

### Backend
- **Update AltStore source for v0.25.0** (c816526)

### Tests
- **test(ios): run the connection handler tests on the Mac** (324c17d)
- **test(server): cover commands that arrive before the handshake** (3564d52)
- **test(sync): record real sessions and replay them offline** (b67aa76)
- **test(sync): cover engine stops, buffering and the handshake deadline** (30a8f1f)
- **test(harness): put the harness preference store back before each render** (cfce3f2)
- **test(sync): run two clients against the built-in server in one test** (36634ab)
- **test(a11y): fail a render when a control has no spoken name** (a497525)

### Docs
- **docs(changelog): write the 0.26.0 release notes** (c4449e5)
- **docs(security): update the known limits** (7b4dfe8)
- **docs(privacy): record the store answers and update the policy** (52d85ac)
- **docs(strings): tell translators what each placeholder holds** (b50980f)
- **docs: rewrite the project documents in plain language** (5c60504)
- **docs: rewrite code comments and KDoc in plain language** (6ccecf0)
- **docs(release): rewrite the 0.24.0 notes as one credited list** (051de50)
- **docs(release): rewrite the 0.25.0 notes in plain changelog style** (eb6f785)
- **docs(release): 0.25.0 says what changed, without the flourishes** (2b2f5e8)
- **docs(release): the notes say who asked, who reported and who wrote it** (e4671a3)
- **docs(release): 0.25.0 names the issues it closes, and the keyboard fix it forgot** (f971fa1)

### Chore
- **build: move to version 0.26.0 and the newest toolchain** (43387d1)
- **build(deps): move to Haze 2.0.0 with the glass blur in performance mode** (b99bfc6)
- **ci(release): add mpv's symbol files to the native debug symbols** (f876c3a)
- **build: turn on the build cache and the configuration cache** (305a8c7)
- **build(gates): fail on blocking reads outside the startup read** (f85d24a)
- **build(gates): find the source sets on disk** (10eb56b)
- **build(release): refuse a placeholder Play note, check the changelog** (6e9f21d)
- **ci(release): run the tests before anything is built** (9be10f1)
- **build(deps): move to KitePlayer 0.0.27 and check each APK's libraries** (06464e2)
- **build(release): fail without apksigner, check certificate and version** (387f5cf)
- **build: delete the tasks that checked a removed version table** (f236225)
- **build(gates): read the string resources with an XML parser** (bae6b70)
- **build(deps): remove the unused Compose Unstyled library** (e6f5ca9)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/yuroyami/syncplay-mobile?utm_source=github-action)._