v2.3.0 — Kotlin 2.4 toolchain · Android 17 LOCAL_NETWORK · location/gallery status fixes
Latest⚠️ Breaking (grant-compose only)
grant-compose no longer publishes the iosX64 target. Compose Multiplatform 1.11 stopped publishing iosX64 artifacts. Every other module (grant-core, grant-core-koin, grant-contacts, grant-calendar, grant-motion, grant-bluetooth, grant-location-always) keeps iosX64. Apps needing grant-compose on an Intel-Mac simulator should stay on 2.2.3.
Added
AppGrant.LOCAL_NETWORK— Android 17 (API 37) introduced theACCESS_LOCAL_NETWORKruntime permission (NEARBY_DEVICES group; enforcement mandatory for apps targeting 37) for talking to LAN devices. Below API 37 and on iOS the grant is a no-op (GRANTED); on iOS the OS prompts automatically on first LAN access whenNSLocalNetworkUsageDescriptionis present. Device-verified end-to-end on a Pixel 6 Pro running Android 17.- Android 17 Contact Picker guidance — KDoc on
CONTACTS/READ_CONTACTSnow points read-only "pick a few contacts" flows to the permission-free Contact Picker.
Fixed
- Approximate-only location misreported as denied. A user picking "Approximate" in the OS dialog grants only COARSE; that usable state used to fail the all-granted check and escalate to
DENIED_ALWAYS. Coarse-only now reportsPARTIAL_GRANTED. requestSuspend()suspended forever when no dialog host was attached. A headless request parked on rationale/settings dialog state with no collector now clears the unrenderable state and completes with the current status.- Android 14+: fully-granted gallery misreported as
DENIED_ALWAYSwhenREAD_MEDIA_VISUAL_USER_SELECTEDstayed denied (ADB grant, MDM policy, auto-reset edge states). Full access is now judged on the required permissions only. - Demo: Scenario 3 "Test Grant Denial Flow" was mis-wired to the gallery request — the denial → rationale → settings walkthrough never ran.
Toolchain
| Component | From | To |
|---|---|---|
| Kotlin | 2.1.0 | 2.4.0 |
| Compose Multiplatform | 1.9.3 | 1.11.1 |
| kotlinx-coroutines | 1.10.2 | 1.11.0 |
| Kover | 0.7.5 | 0.9.8 |
| atomicfu | 0.27.0 | 0.33.0 |
Verification
./gradlew build(all 9 modules, Android + iOS): 2,174 tests executed, 0 failures- Kover line coverage 86.9% against the enforced 85% floor
- LOCAL_NETWORK + denial flows device-verified on Pixel 6 Pro (Android 17)
Full changelog: CHANGELOG.md · Migration guide