Skip to content

Release 3.0.0 - #66

Open
75py wants to merge 244 commits into
mainfrom
release/3.0.0
Open

75py wants to merge 244 commits into
mainfrom
release/3.0.0

Conversation

@75py

@75py 75py commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

Release 3.0.0

Replace the 2.x mutable overlay API with immutable OverlaySpec configuration and synchronous OverlayResult operations. Activity-owned overlays do not require the system overlay permission; application overlays retain explicit permission and lifetime responsibilities. Ordinary failed removals remain retryable, and Activity destruction releases library-owned references.

Changes and migration

  • Create and retain handles through OverlayViewManager, update through OverlaySpec.copy or the Java builder, and inspect each operation result. The old fluent/visibility methods and permission dialog are removed without deprecated bridges.
  • Correct drag coordinates for RTL, non-zero window origins, rotation, freeform and out-of-bounds windows. Android still controls cross-UID touch delivery; explicit opacity admission is available.
  • Prevent double removal and terminal-state resurrection when detach callbacks re-enter hide/dispose. Report ACTIVITY_DESTROYED for operations after Activity-owned cleanup.
  • Keep drag translucency separate from spec.alpha, end it on mode changes and UP/CANCEL, and preserve explicit caller alpha updates and failed-restoration retry.
  • Preserve host touch listeners during non-draggable creation and updates. DRAGGABLE owns the View listener and replaces the host's listener.
  • Remove the optional Timber module and its unused image/active design claims. Publish only core, using com.github.75py:Android-OverlayViewManager:<version> on JitPack. Kotlin stdlib is transitive even in Java-only apps.
  • Bundle custom lint, update Java/Kotlin samples and migration documentation, and use JDK 17, SDK 36, Gradle 9.4.1, AGP 9.2.1 and minSdk 23. CI also builds and publishes the Release artifact to Maven Local.

See the migration guide, changelog, and latest review/validation record.

Latest review-fix validation

Product head e344aa5c05420b8c75be6a84b332090812c09ac4 was reviewed and integrated through #71; #70 covers CI and migration cleanup. Later checkpoint changes are documentation only.

  • Reproduced the reported defects against old product code: 21 failures among 72 targeted tests at the test-only commit b036288.
  • Fixed candidate: 161 unit tests passed (core 145, lint 12, sample 4), with zero failures/errors/skips. This adds 27 tests to the post-Timber baseline of 134.
  • Debug builds, core Release build/publication and test APK build passed. Lint: zero errors, core 6 warnings and sample 55 warnings.
  • Separate Java/Kotlin consumer: Release/R8 and lint passed. Java-callable public/protected signatures in 15 API classes were unchanged; new internal synthetic helpers are excluded from that source-callable comparison. Enum values are unchanged.
  • API36 sample suite: 31/31 passed, including both freeform cases, with zero failures/errors/skips. Dedicated AVD settings were restored afterward.
  • Follow-up Record compatibility decisions and revalidate Android APIs #73 reran the full sample connected suite with the fixed core on API23 (26/26, 220.09 s), API26 (26/26, 202.95 s), and API35 (31/31, 244.88 s): zero failures/errors/skips on dedicated arm64 AVDs. API23/26 exclude two freeform and three cross-UID tests by SDK filters; API35 includes all five. Settings were restored and the dedicated AVDs were stopped.
  • Record compatibility decisions and revalidate Android APIs #73 also passed all nine requested build/unit/lint/Release-publication tasks and all 161 unit tests. Its only source-file change is KDoc; public signatures and enums are unchanged.
  • The direct re-entry and mode-switch reproductions are Robolectric/backend-callback tests. Physical devices and API31 were not rerun after these review fixes. This follow-up ran sample instrumentation, not the core androidTest suite.

Earlier release validation covers API23/26/35/36, permission denial/grant/re-show, Activity recreation, cross-UID touches, drag displacement, RTL and freeform. Additional API31 had two skipped freeform cases because the host was not visible to input; API35/36 passed those conditions. Those earlier runs are baseline evidence, not a claim that the latest review fixes were rerun on every API. Timber-removal validation records the earlier artifact inspection and UI evidence.

Known limits and decisions

  • README unreleased wording and CHANGELOG date remain unchanged. Update them only when publication is decided.
  • JitPack service-side build and coordinate resolution remain post-tag checks. CI's local publication checks the same Gradle task but does not verify the external service.
  • Reentrant disposal releases ownership immediately; if the outer removal subsequently fails, its result reports the failure but the handle stays DISPOSED. Ordinary failures without re-entry retain the retry path.
  • A host that directly replaces the View listener while DRAGGABLE will also have that listener cleared when leaving the mode. The library owns that listener slot during DRAGGABLE; it cannot inspect a replacement through public Android APIs.
  • Cross-UID behavior depends on Android window policy and opacity clamping. SAME_UID_ONLY does not guarantee UID isolation.
  • A differing XML layout direction is corrected after first layout; the estimated position can briefly appear. Fill gravity with allowOutsideBounds resizes rather than translates.
  • Custom lint checks Builder.setAllowOutsideBounds, not Kotlin constructor/copy arguments.
  • C1 is decided: keep OverlaySpec as a data class. In 3.x, append new properties with defaults to preserve source compatibility for Kotlin constructor/copy calls and Java Builder usage. Constructor/copy binary compatibility for already compiled intermediate libraries is not guaranteed across minor versions. Java callers must use Builder. KDoc and migration guidance state this policy.
  • C2 is decided: retain internal-package conventions and existing RestrictTo annotations/scopes without code changes.
  • C3 is decided: add no compatibility plugin in 3.0.0. Before starting 3.1, use the 3.0.0 tag as an API baseline, compare binary-compatibility-validator with Kotlin Gradle plugin ABI validation, and verify operation with AGP 9 built-in Kotlin.
  • C4 is decided: retain coordination records and shared configuration in main. No files are moved or removed for this decision.

Integration

Candidate: 536e4db1bd3848e55a5f51893a9f92d31930397f, synchronized with work/3.0.0.

#70 was integrated at 87c753d after Claude approval and CI success. #71 was integrated at 4b9b2a7 after Codex approval and CI success. #72 records the final validation and integration without further product changes. The current candidate's CI and SHA-specific Claude confirmation are tracked on this PR.

#73 was integrated at 536e4db after Claude approval of 8f68ae7 and CI success. Its merged tree is identical to the reviewed head. The final release SHA and its CI result are recorded in the latest comments on this PR.

Earlier integration and the user-authorized review exceptions for #61/#62 remain in the committed ledger. Merging this PR to main, tagging and publication are separate actions and were not performed by this review-fix task.

75py and others added 30 commits September 11, 2026 23:57
Record 3.0.0 coordination kickoff and environment blocker
Record first-wave decisions and pause checkpoint
Runs on push/PR to work/3.0.0, release/**, and main using JDK 17 and
Android SDK 34. Assembles debug builds, runs local unit tests, and
runs core/sample Android lint. Uploads test and lint reports as
artifacts on failure. Instrumentation tests are out of scope (T12).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6973iNrpRd7W4ov8ECxyg
SampleAllOptionsActivity and SampleOverrideScreenBrightnessActivity
implemented SeekBarBindingAdapter.OnProgressChanged, a data-binding
internal interface annotated @RestrictTo(LIBRARY_GROUP). Replace it
with the public SeekBar.OnSeekBarChangeListener, bound via a new
custom BindingAdapter (SeekBarChangeBindingAdapter) that maps
android:onSeekBarChangeListener to SeekBar#setOnSeekBarChangeListener.
Update the affected layouts' binding variable types and attribute
names accordingly, and keep the displayed sample source in
SampleOverrideScreenBrightnessActivity.html in sync. Visible behavior
is unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6973iNrpRd7W4ov8ECxyg
Propose OverlayViewManager 3.0 API contract
Add an explicit top-level permissions: contents: read block to
ci.yml (least privilege; the workflow only checks out and builds).
Fix the onDestroy method order in the displayed
SampleOverrideScreenBrightnessActivity.html snippet so it matches
SampleOverrideScreenBrightnessActivity.java exactly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6973iNrpRd7W4ov8ECxyg
Record API approval and staged migration agreement
Add CI workflow and fix sample RestrictedApi lint errors
Record CI integration and toolchain task dispatch
Guard the log buffer with a lock so Timber.Tree#log, called from
arbitrary threads, can never corrupt it or touch the TextView off the
main thread. Coalesce bursts of log calls onto a single pending render
posted to the main thread instead of posting once per line.

Validate setMaxLines: values below 1 now throw IllegalArgumentException,
and shrinking trims the buffer and re-renders immediately. Rendering no
longer relies on a setLength(-1)-style empty-buffer special case.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012s1jVd7uebixtKc4wRY9PD
Make DebugOverlayTree thread-safe and bound its buffer
Remove the stale buildscript { classpath 'com.android.tools.build:gradle:3.2.1' }
block; the plugins DSL is now the single Android Gradle Plugin declaration.
Bump AGP 8.5.1 -> 9.2.1 and the Kotlin Android plugin 1.9.20 -> 2.4.20 to match
(AGP 9.2.x requires Gradle 9.4.1 / JDK 17; see PR body for verified sources).

Task ID: T03

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmQfrNsqxotVG1KkuBMkrH
Bump the Gradle wrapper distributionUrl/distributionSha256Sum to 9.4.1, the
minimum/default Gradle version required by AGP 9.2.x, and add the
distributionSha256Sum entry that was previously missing. JDK 17 remains
pinned via each module's compileOptions and the CI actions/setup-java step.

AGP 9.2 enables built-in Kotlin support by default; explicitly opt out via
android.builtInKotlin=false for this change so the Kotlin Android plugin
keeps being applied unchanged (see PR body for the migration tradeoff).

Task ID: T03

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmQfrNsqxotVG1KkuBMkrH
core, opt-timber, and sample now target compileSdk 36 / targetSdk 36 (Android
16, current Play target requirement) and minSdk 23, aligning the supported
baseline with Settings.canDrawOverlays() per the T01 design proposal
(docs/design/3.0.0-api.md). This is a breaking change for consumers below
API 23 (2.x supported API 21).

Remove the deprecated manifest `package` attribute from core/sample (AGP
already errors on this now that `namespace` is set in build.gradle) and the
stale `tools:overrideLibrary="android.support.test.uiautomator.v18"`
uses-sdk override, which referenced a pre-androidx artifact no longer in the
dependency graph and had become a no-op.

Update CI to install platform 36 / build-tools 36.0.0, the SDK Build Tools
version AGP 9.2.x requires.

Task ID: T03

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmQfrNsqxotVG1KkuBMkrH
75py and others added 15 commits November 1, 2026 16:50
Add the missing TAG declarations to the displayed sample code, document com.github.75py:Android-OverlayViewManager now that core is the only published artifact, and record the Codex review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the Codex validation results and UI evidence, and align the plan with the core-only release candidate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the optional Timber integration
Record the Timber removal integration
Cover removal re-entry, transient drag alpha, host touch listeners and classification after Activity destruction. The transient alpha tests expect the spec to keep the caller's alpha during a drag, so these fail against the current implementation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dispose from a detach callback now releases once without a second removal, and the outer call keeps DISPOSED. The drag's translucent feedback lives on the window, so spec.alpha keeps the caller's value and leaving DRAGGABLE ends it.

The library now touches the View's listener only for its own drag listener, and show or update after Activity destruction reports ACTIVITY_DESTROYED. Also removes dead SDK checks and the per-move log, and documents these contracts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Validate release publication and clarify Kotlin migration
Fix removal re-entry, drag alpha and touch listener ownership
@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Timber removal is integrated through PR #68.

  • Reviewed head: d773e7e83890aeaa4eae9e95750c4fe2b8c02391.
  • Codex coordinator approval and CI success were checked immediately before merge.
  • Release merge commit: 8794018bcc6d67d338982bfaeaddef78db821540, with a tree identical to the reviewed head.
  • work/3.0.0 was fast-forwarded and pushed to the same SHA.
  • This supersedes the pending-integration checkpoint in the committed Timber-removal record. The PR description now covers the single published artifact, 134 unit tests, API 36 sample 31/31, and the core-only Java/Kotlin R8 consumer.

Claude coordinator confirmation and CI for the updated release head are being checked on this PR. Main remains unchanged; tagging and publication have not been performed.

@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Final confirmation — Claude coordinator — PR #66 head 8794018bcc6d67d338982bfaeaddef78db821540.

Confirmed:

  • Base is main and head is release/3.0.0, 230 commits ahead of main. release/3.0.0 and work/3.0.0 are the same SHA, and main is unchanged at c71f7fb.
  • The head's tree is identical to the PR Remove the optional Timber integration #68 reviewed head d773e7e.
  • CI 41287076952 and 41287072499 succeeded on this head, and the PR is CLEAN.
  • The body matches the record: one published artifact, the com.github.75py:Android-OverlayViewManager coordinate, 134 unit tests, the API 36 sample suite at 31/31, the core-only consumer, and API 23/26/35 kept at the 2026-10-31 baseline.
  • The README and migration guide use the new coordinate, and no opt-timber reference remains outside migration guidance and historical records.
  • No 3.0.0 tag exists.

This confirms the candidate at this SHA only. PR #69 will change the head with documentation-only records, so the new head needs its own CI and confirmation. It is not a merge decision: merging to main, tagging and publication are left to the repository owner.

Record release review fixes and validation
@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Final confirmation — Claude coordinator — PR #66 head c1eafebdd04e2a3f77f84a6154d766c6d9a06980.

Confirmed:

  • Base is main and head is release/3.0.0, 241 commits ahead of main. release/3.0.0 and work/3.0.0 are the same SHA, and main is unchanged at c71f7fb.
  • The head's tree is identical to the PR Record release review fixes and validation #72 approved head 1de0028. The only changes since 4b9b2a7 are V3_0_0_PLAN.md and docs/coordination/3.0.0/2026-11-01-review-fixes.md.
  • All three CI runs succeeded on this SHA: 41291721799, 41291718560 and the work/3.0.0 push run 41291740907. The PR is CLEAN.
  • The body names this SHA as the candidate and matches the record: 21 of 72 reproduction failures, 161 unit tests, the API 36 sample suite at 31/31, the core-only consumer, and the distinction from the earlier API baseline.
  • The body states the known limits, including re-entered disposal, the listener ownership limit and C1–C4 as unimplemented recommendations.
  • No 3.0.0 tag exists.

The Gradle and device results come from Codex's runs; Claude reviewed the code and records but did not run them. Physical devices and API 23, 26, 31 and 35 were not rerun for these review fixes.

This confirms the release candidate. It is not a merge decision: merging to main, tagging, publication and C1–C4 are left to the repository owner.

@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Final confirmation — Claude coordinator — PR #66 head a79dcb8254d83eaf72784f524f34a12d68668cb7.

Confirmed:

  • Base is main and head is release/3.0.0, 232 commits ahead of main. release/3.0.0 and work/3.0.0 are the same SHA, and main is unchanged at c71f7fb.
  • The head's tree is identical to the PR Record the Timber removal integration #69 approved head 7ddda53.
  • The only changes since the 8794018 confirmation are V3_0_0_PLAN.md and docs/coordination/3.0.0/2026-11-01-remove-timber.md, with no product, build or test change.
  • All three CI runs succeeded on this SHA: 41287431420, 41287428826 and the work/3.0.0 push run 41287457229. The PR is CLEAN.
  • The body names this SHA as the candidate.
  • No 3.0.0 tag exists.

This confirms the release candidate. It is not a merge decision: merging to main, tagging and publication are left to the repository owner. Before publication, update the changelog date and the README unreleased wording, then check the JitPack build and coordinate after tagging.

…ation

Record compatibility decisions and revalidate Android APIs
@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Codex coordinator — compatibility decisions and post-#71 Android validation complete.

C1–C4 are recorded as owner decisions. OverlaySpec remains a data class with the requested 3.x source/binary compatibility policy in KDoc and migration guidance. Existing internal restrictions and repository records are retained. API compatibility tooling is a pre-3.1 task using the 3.0.0 tag baseline, including BCV/Kotlin Gradle plugin ABI validation comparison and AGP 9 built-in Kotlin verification.

Codex ran all requested Gradle tasks successfully, including Release publication to an isolated Maven repository. All 161 unit tests passed; lint had zero errors (6 core and 55 sample warnings).

Full sample connected suite Passed / executed Failures / errors / skips Gradle elapsed time
API23 AVD 26 / 26 0 / 0 / 0 220.09 s
API26 AVD 26 / 26 0 / 0 / 0 202.95 s
API35 AVD 31 / 31 0 / 0 / 0 244.88 s

API23/26 exclude two freeform and three cross-UID tests by SDK filters; API35 includes them. These exclusions are not counted as runtime skips or passes. All 83 executed tests passed. No device test failed and no product/test correction was made. Physical devices were not connected; this follow-up did not rerun API31/36 or core instrumentation. Dedicated AVDs were stopped and the API35 freeform setting was restored.

Fingerprints, reproducible commands, durations and artifact hashes are in the committed validation record. This PR's body now reflects these decisions and results.

Public API signatures, enums, README unreleased wording and CHANGELOG dates are unchanged. Main remains at c71f7fb950ee2a4ce6cba00be82d1b6e02226789; no main merge, tag or publication was performed.

@75py

75py commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

Final confirmation — Claude coordinator — PR #66 head 536e4db1bd3848e55a5f51893a9f92d31930397f.

Confirmed:

  • Base is main and head is release/3.0.0, 244 commits ahead of main. release/3.0.0 and work/3.0.0 are the same SHA, and main is unchanged at c71f7fb.
  • The head's tree is identical to the PR Record compatibility decisions and revalidate Android APIs #73 approved head 8f68ae7. The only changes since c1eafeb are the plan, the review record, the migration guide and KDoc in OverlaySpec.kt.
  • All three CI runs succeeded on this SHA: 41294640262, 41294636090 and the work/3.0.0 push run 41294665560. The PR is CLEAN.
  • The body names this SHA as the candidate and states the C1–C4 decisions, the API 23, 26 and 35 sample reruns, the five SDK-filtered tests, and what was not rerun.
  • No 3.0.0 tag exists.

Not verified after the review fixes: physical devices, API 31, and the core androidTest suite. The JitPack service build and coordinate resolution remain post-tag checks. The Gradle and device results come from Codex's runs; Claude reviewed the code and records but did not run them.

This confirms the release candidate. It is not a merge decision: merging to main, tagging and publication are left to the repository owner.

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.

2 participants