ScreenTinker
1fc50ec263
chore(release): v1.9.34-alpha7
2026-08-13 13:41:46 -05:00
ScreenTinker
72fd2314b5
chore(release): v1.9.34-alpha6
2026-08-12 15:15:43 -05:00
ScreenTinker
350ca58f22
chore(release): v1.9.34-alpha5
2026-08-12 14:49:13 -05:00
ScreenTinker
ffceaf2c1f
chore(release): v1.9.34-alpha4
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-08-12 11:53:35 -05:00
ScreenTinker
6cd697c3fc
chore(release): v1.9.34-alpha3
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-08-11 23:23:31 -05:00
ScreenTinker
77d41ae73e
chore(release): v1.9.34-alpha2
2026-08-11 22:34:53 -05:00
ScreenTinker
6830fe58ea
chore(release): v1.9.34-alpha1
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-08-11 21:54:55 -05:00
ScreenTinker
f58c537d15
chore(release): v1.9.33
CI / Unit tests (node --test) (push) Has been cancelled
CI / OpenAPI spec lint (push) Has been cancelled
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Has been cancelled
CI / Boot smoke + version check (push) Has been cancelled
2026-08-07 20:47:58 -05:00
ScreenTinker
b9b1870472
chore(release): v1.9.32
2026-08-07 17:36:46 -05:00
ScreenTinker
70b2227fa8
chore(release): v1.9.31
2026-08-06 21:08:14 -05:00
ScreenTinker
3b9ad08454
chore(release): v1.9.29
2026-08-06 08:39:26 -05:00
ScreenTinker
a85e067260
chore(release): v1.9.29-rc5
2026-08-05 23:00:59 -05:00
ScreenTinker
ba45c2d60c
chore(release): v1.9.29-rc4
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-08-05 16:32:56 -05:00
ScreenTinker
c170861124
chore(release): v1.9.29-rc3
2026-08-05 11:37:53 -05:00
ScreenTinker
5ce094b1f8
chore(release): v1.9.29-rc2
2026-08-05 00:06:20 -05:00
ScreenTinker
b15b17f5dd
chore(release): v1.9.29-rc1
2026-08-04 23:29:37 -05:00
ScreenTinker
ff7bfb2ded
chore(release): v1.9.28
CI / Unit tests (node --test) (push) Has been cancelled
CI / OpenAPI spec lint (push) Has been cancelled
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Has been cancelled
CI / Boot smoke + version check (push) Has been cancelled
2026-07-30 23:02:18 -05:00
Claude
d978a5d2a6
Make per-item scheduling work on Android 7 instead of blanking the screen
...
ScheduleEval uses java.time — Instant, LocalDate, ZoneId — which is API 26. minSdk is 24, and core
library desugaring was never enabled, so on Android 7.0/7.1 the first evaluation threw
NoClassDefFoundError. Those API levels are still common on cheap signage sticks and older TV boxes.
The damage was much worse than a failed check, because NoClassDefFoundError is an Error, not an
Exception. The evaluator's deliberate fail-open guard — written so that "a blank screen is worse
than an over-running promo" — did not catch it. The Error propagated out of scheduleAllows, through
firstActiveIndex and updatePlaylist, past another catch(Exception), and was only swallowed at the
service boundary. Because updatePlaylist aborted before the download block, no content was fetched
either; and on a cold start from cache the same Error reached a handler that clears the playlist
cache. So the moment anyone used dayparting or expiry, those panels sat on "waiting for content"
with nothing downloaded and nothing cached, and a reboot did not help. The stated contract was
inverted on exactly the hardware it was meant to protect.
Two changes. Desugaring is the real fix: java.time now exists on API 24/25, so the code runs as
written. The guard is widened to Throwable as well, so this class of failure can never again slip
past a catch that was written to be total — that is belt and braces, not the fix.
Release build assembles cleanly with desugaring on; 134 Android JVM tests green. Still to confirm on
a real API 24/25 image before release — the unit tests run on the JVM, where java.time always
exists, which is precisely why this was invisible to them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uaeo9MvzKoyXuN6ZsbhtkL
2026-07-30 21:20:41 -05:00
ScreenTinker
752f39ea43
chore(release): v1.9.27
2026-07-30 19:16:55 -05:00
ScreenTinker
d70764991e
chore(release): v1.9.26
2026-07-30 18:43:35 -05:00
ScreenTinker
3f0db335d2
chore(release): v1.9.25
2026-07-29 20:38:47 -05:00
ScreenTinker
2906e559cb
Advance the versionCode baseline past the published test builds
...
Three prereleases were cut for #234 and handed to the reporter, consuming versionCodes
89 through 93 via VERSION_CODE overrides that were never written back to this file. The
committed default was still 88, so bump-version.sh would have produced 89 for 1.9.25 —
an APK that installs over nothing anyone has been testing, since Android refuses a
lower-or-equal code, and silently so from the user's side.
Set to 93 so the next bump lands on 94, above every published build.
Lesson worth keeping: a VERSION_CODE override for a one-off build leaves this file lying
about where the release line actually is.
2026-07-29 20:38:46 -05:00
ScreenTinker
c115ad5e62
chore(release): v1.9.24
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-28 23:37:59 -05:00
ScreenTinker
bcb1b5c7a3
chore(release): v1.9.23
2026-07-28 20:43:34 -05:00
ScreenTinker
19d1e3e19f
chore(release): v1.9.22
2026-07-28 14:58:22 -05:00
ScreenTinker
2d4ebb800f
chore(release): v1.9.21
2026-07-28 14:01:09 -05:00
ScreenTinker
8caf908d3c
chore(release): v1.9.20
2026-07-28 13:18:21 -05:00
ScreenTinker
00c294cb3b
chore(release): v1.9.20-beta1
2026-07-28 12:53:08 -05:00
ScreenTinker
6e0b2464d7
chore(release): v1.9.19
2026-07-27 21:18:47 -05:00
ScreenTinker
90fd73b38c
chore(release): v1.9.18
2026-07-27 20:40:51 -05:00
ScreenTinker
d6f81171c2
chore(release): v1.9.17
2026-07-27 11:43:23 -05:00
ScreenTinker
1036333982
chore(release): v1.9.16
2026-07-27 10:37:11 -05:00
ScreenTinker
593458d519
chore(release): v1.9.15
2026-07-24 21:12:22 -05:00
ScreenTinker
df7ecd6881
chore(release): v1.9.14
2026-07-24 15:54:27 -05:00
ScreenTinker
7b4e5bf416
chore(release): v1.9.14-beta1
2026-07-23 22:10:05 -05:00
ScreenTinker
98473d57f6
chore(release): v1.9.13
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-23 12:52:01 -05:00
ScreenTinker
ea99ae5e8d
chore(release): v1.9.13-beta1
2026-07-23 12:39:30 -05:00
ScreenTinker
79ab849641
chore(release): v1.9.12
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-22 21:09:09 -05:00
ScreenTinker
6b5b401f7c
chore(release): v1.9.11
2026-07-20 16:59:56 -05:00
screentinker
96b71a0d56
feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) ( #204 )
...
Client-side GL Transitions v1 across all three players with never-blank degradation: shader lib + generated manifest + real-WebGL CI, transition-as-widget normalization, persistent WebGL/GLES2 compositors (web/Tizen/native Android), image↔video wipes, SSRF-hardened media proxy, decode-gated image preload, dashboard picker. Fixes the playlist change-fingerprint that dropped transition edits. Alpha + on-device soak validated.
2026-07-20 16:45:32 -05:00
ScreenTinker
af89eaa75b
chore(release): v1.9.10
CI / Unit tests (node --test) (push) Has been cancelled
CI / OpenAPI spec lint (push) Has been cancelled
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Has been cancelled
CI / Boot smoke + version check (push) Has been cancelled
2026-07-17 20:24:39 -05:00
ScreenTinker
79cf4cac2b
chore(release): v1.9.9
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-15 16:06:18 -05:00
ScreenTinker
87d5c5e1d7
chore(release): v1.9.8
2026-07-15 10:06:11 -05:00
ScreenTinker
f10373551f
chore(release): v1.9.7
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-13 23:10:57 -05:00
ScreenTinker
3c59f647ac
chore(release): v1.9.6
2026-07-13 12:12:03 -05:00
ScreenTinker
40efaa1fed
chore(release): v1.9.5
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
2026-07-12 23:32:37 -05:00
screentinker
501ffb11c1
feat(device-owner): tier foundation + QR provisioning + content-expiry & device enhancements ( #168 )
...
Device-owner tier substrate + silent install, end-to-end QR provisioning (Android 12+ compliance, APK-derived checksum, URL pre-seed, zero-touch onboarding, guided a11y screen), content-expiry (#157 ) with player no-restart deferral, and the device-enhancement batch (#10/#12/#13/#14). Backward-compatible with 1.9.3 clients; all autonomous behaviors opt-in. QA + security review green. Closes #161 , #157 , #159 .
2026-07-12 19:41:07 -05:00
ScreenTinker
f7e1b4dc69
chore(release): v1.9.4
2026-07-10 11:57:43 -05:00
ScreenTinker
dfd954d2ad
chore(release): v1.9.3
2026-07-08 17:23:08 -05:00
ScreenTinker
57cdaf7e4e
feat(apk): v4 liveness contract + caching-cluster fix + reconnect-safe downloads
...
APK v4 — client-only (Android player). Brings the reference client up to the locked
v4 liveness contract and fixes the "stuck downloading / offline in CMS" caching bug:
- v4 liveness watchdog (LivenessWatchdog): half-open detection via server-silence,
arm-ONLY-after device:heartbeat-ack (degrade-safe), 45s±10s jittered threshold,
exp backoff 1/2/4/8/16→30s ±20%, no-poll; reconnect delegates to the #148
ConnectionGuard (teardown-before-reopen, single socket).
- Caching two-root fix: callTimeout + .part+Content-Length integrity + atomic swap
(CacheValidation), onPlayerError advance, re-ack cached content + reconnect re-ack.
- Screen resilience (PlaylistSelection): a pending/failed download never blanks the
screen — keep-current, swap only fully-valid content.
- Reconnect-safe background downloads (DownloadCoordinator): single-flight per
contentId + bounded pool + failure backoff + cancellation; a reconnect mid-fetch
can't orphan/duplicate/storm. Refuse 206 partials.
- v4 client identity block on register (client_type/version/platform/contract_version).
Tests: 52 JVM unit tests (watchdog, cache validation, reproduce-then-prove download
stall/truncation/reconnect-mid-download, screen selection, assembly soak).
Depends on the server device:heartbeat-ack (core pass) — degrade-safe until then.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 09:57:53 -05:00