Skip to content

chore(release): bump to versionCode 24 / versionName 1.0.24#77

Closed
stozo04 wants to merge 7 commits into
mainfrom
chore/bump-version-1.0.24
Closed

chore(release): bump to versionCode 24 / versionName 1.0.24#77
stozo04 wants to merge 7 commits into
mainfrom
chore/bump-version-1.0.24

Conversation

@stozo04

@stozo04 stozo04 commented Jun 19, 2026

Copy link
Copy Markdown
Owner

Release-readiness + launch-hardening changes, batched while clearing Play Console gates.

1. Version bump (original purpose)

versionCode 23 → 24, versionName 1.0.23 → 1.0.24. 23 was already consumed by a prior upload (Play rejected the re-upload); 24 is unique.

2. EU Geo-blocking compliance record

docs/play-store/eu-geo-blocking-compliance.md — audit against Regulation (EU) 2018/302 (the notice Play shows on "the world" availability). Verdict: compliant by construction.

3. Clear deprecated edge-to-edge APIs — androidx.activity 1.8.2 → 1.13.0

Play flagged Release 23 for Window.setStatusBarColor/setNavigationBarColor (deprecated in Android 15, R8-minified p51.a). Not app code — they live in androidx.activity 1.8.2's enableEdgeToEdge(). 1.13.0 avoids them on API 35+.

4. Test fixes (uncovered while build-verifying #3)

The unit suite hadn't compiled on main. Both pre-existing issues fixed:

  • Compile break: codec-settle *_MS Long constants were refactored to Duration; tests repointed via .inWholeMilliseconds.
  • Stale assertion: saveBoomerang … Share expected a RAW to persist, but BoomerangRenderWorker deletes the raw after a successful render. Updated to one BOOMERANG / zero RAW. Production save path unchanged — stale test, not a bug.

5. CI: unit-test gate (the safety net that was missing)

.github/workflows/unit-tests.yml — runs :app:testDebugUnitTest (JDK 17 / Gradle 9.5) on every code PR and push to main, as a hard gate. There was no CI running tests, which is how #4 reached a production release unnoticed. Firebase not required (google-services plugins are conditional on the gitignored json).

6. Commit the Gradle wrapper jar (latent build bug)

gradle/wrapper/gradle-wrapper.jar was gitignored and never committed, so ./gradlew fails on any fresh clone or CI ("Unable to access jarfile"). Un-ignored and committed (this is what initially failed the new CI job in #5).

Verification

  • Clean build debug + release green, lint-vital clean, R8 + signed, exit 0.
  • Unit tests: 192/192 green, now enforced in CI (JVM unit tests ✓ on this PR).

🤖 Generated with Claude Code

https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6

stozo04 and others added 7 commits June 19, 2026 11:48
versionCode 23 was already consumed by a prior Play Console upload, so
Play rejected the re-upload with "Version code 23 has already been used."
Bump to 24 for the production release of OpenLoop.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
…e audit

Play Console shows an informational notice on "the world" availability linking
to the Geo-blocking Regulation. Audited all Kotlin source, Gradle deps, and the
manifest against the regulation's three discrimination axes (location-based
access, region-gated features, payment discrimination) — OpenLoop is compliant
by construction: no location awareness, no region-gated features, no payments.

Documents the verdict, the three-axis code sweep, the non-code Play Console
checklist, and a future re-audit trigger.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
… edge-to-edge APIs

Play Console flagged Release 23 for using the deprecated
android.view.Window.setStatusBarColor / setNavigationBarColor (reported as the
R8-minified class p51.a). The app's own code never calls these (grep is clean);
the calls come from inside androidx.activity 1.8.2's enableEdgeToEdge()
(EdgeToEdgeApi29.setUp paints the bar scrims via the now-deprecated setters).

1.13.0 (current stable) rewrote enableEdgeToEdge() to avoid those setters on
API 35+, which is Google's sanctioned fix. No app-code change needed —
MainActivity already calls enableEdgeToEdge() correctly. Build-verified: clean
debug + release, lint-vital clean, R8 + signed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
The unit-test suite stopped compiling on main: DeviceMediaHintsTest and
SamsungReversePreviewRegressionTest referenced SAMSUNG_POST_TRANSFORM_CODEC_SETTLE_MS
and PRE_REVERSE_CODEC_SETTLE_MS, but those Long-millisecond constants were
refactored to kotlin.time.Duration (SAMSUNG_POST_TRANSFORM_CODEC_SETTLE = 500.ms,
PRE_REVERSE_CODEC_SETTLE = 400.ms) without updating the tests.

Repoint via .inWholeMilliseconds, preserving each assertion's original intent
(== 500ms, >= 200ms). Test-only; no production change. Suite compiles again
(191/192 green; the one remaining failure — saveBoomerang/Share — is a separate
pre-existing issue unmasked by this fix, tracked for follow-up).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
…havior

Root-caused the one remaining unit failure (NoSuchElementException). It was a
stale test, NOT a save-flow bug: BoomerangRenderWorker (mirrored by
FakeBoomerangRenderScheduler) registers the boomerang then deletes the now-
intermediate raw ("the original raw video is no longer needed after a successful
boomerang render"). The test predated that cleanup step and still asserted a RAW
persisted, so `saved.single { it.kind == RAW }` found nothing.

Update the assertions to current behavior: after save, exactly one BOOMERANG
remains and no RAW; the boomerang still links to the raw it was promoted from,
verified via a new FakeVideoStorageRepository.lastPromotedRawId (the raw row
itself is gone). Test-only; production save path is unchanged and correct.

Full unit suite now 192/192 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
There was no CI running unit tests — the suite silently stopped compiling on main
(codec-settle _MS→Duration rename) and a stale saveBoomerang assertion drifted,
neither caught before a production release. This adds the missing hard gate so a
broken or non-compiling test fails the PR.

JDK 17 / Gradle 9.5 (matches the project toolchain). chmod +x gradlew first since
the repo is Windows-authored (gradlew committed mode 100644). Firebase not
required — google-services/crashlytics plugins are applied only when
app/google-services.json exists (gitignored), so a fresh CI checkout tests clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
…lones)

.gitignore wrongly excluded gradle/wrapper/gradle-wrapper.jar (a generic-template
mistake), so it was never checked in. Gradle requires the wrapper jar to be
committed; without it `./gradlew` fails with "Unable to access jarfile
gradle-wrapper.jar" on any fresh checkout — which is exactly why the new
unit-test CI job failed, and why a brand-new clone couldn't build either.

Un-ignore and commit the jar (45 KB, the same one used for local builds against
Gradle 9.5.0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6
@stozo04 stozo04 closed this Jun 23, 2026
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.

1 participant