chore(release): bump to versionCode 24 / versionName 1.0.24#77
Closed
stozo04 wants to merge 7 commits into
Closed
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release-readiness + launch-hardening changes, batched while clearing Play Console gates.
1. Version bump (original purpose)
versionCode23 → 24,versionName1.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.activity1.8.2 → 1.13.0Play flagged Release 23 for
Window.setStatusBarColor/setNavigationBarColor(deprecated in Android 15, R8-minifiedp51.a). Not app code — they live inandroidx.activity1.8.2'senableEdgeToEdge(). 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:*_MSLong constants were refactored toDuration; tests repointed via.inWholeMilliseconds.saveBoomerang … Shareexpected a RAW to persist, butBoomerangRenderWorkerdeletes 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.jarwas gitignored and never committed, so./gradlewfails 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
JVM unit tests✓ on this PR).🤖 Generated with Claude Code
https://claude.ai/code/session_01VfQSmotWLfDS4e1CJo9AW6