Repository navigation
Conversation
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
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
|
Timber removal is integrated through PR #68.
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. |
|
Final confirmation — Claude coordinator — PR #66 head Confirmed:
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 |
Record release review fixes and validation
|
Final confirmation — Claude coordinator — PR #66 head Confirmed:
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 |
|
Final confirmation — Claude coordinator — PR #66 head Confirmed:
This confirms the release candidate. It is not a merge decision: merging to |
…ation Record compatibility decisions and revalidate Android APIs
|
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).
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 |
|
Final confirmation — Claude coordinator — PR #66 head Confirmed:
Not verified after the review fixes: physical devices, API 31, and the This confirms the release candidate. It is not a merge decision: merging to |
Release 3.0.0
Replace the 2.x mutable overlay API with immutable
OverlaySpecconfiguration and synchronousOverlayResultoperations. 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
OverlayViewManager, update throughOverlaySpec.copyor the Java builder, and inspect each operation result. The old fluent/visibility methods and permission dialog are removed without deprecated bridges.ACTIVITY_DESTROYEDfor operations after Activity-owned cleanup.spec.alpha, end it on mode changes and UP/CANCEL, and preserve explicit caller alpha updates and failed-restoration retry.com.github.75py:Android-OverlayViewManager:<version>on JitPack. Kotlin stdlib is transitive even in Java-only apps.See the migration guide, changelog, and latest review/validation record.
Latest review-fix validation
Product head
e344aa5c05420b8c75be6a84b332090812c09ac4was reviewed and integrated through #71; #70 covers CI and migration cleanup. Later checkpoint changes are documentation only.b036288.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
Integration
Candidate:
536e4db1bd3848e55a5f51893a9f92d31930397f, synchronized withwork/3.0.0.#70 was integrated at
87c753dafter Claude approval and CI success. #71 was integrated at4b9b2a7after 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
536e4dbafter 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.