v2.1.0 - Analytics & i18n Support
✨ What's New in v2.1.0
⚠️ Breaking Changes (Compose UI layer only)
-
GrantDialog/GrantGroupDialog/GrantAndServiceDialog— string params replaced byGrantDialogStrings
The individualStringparameters on each dialog composable have been replaced by a singlestrings: GrantDialogStringsparameter. -
IosPermissionHandlerrenamed toPermissionHandler(iOS custom handler authors only)
The interface used to implement customRawPermissionhandlers on iOS has been renamed fromIosPermissionHandlertoPermissionHandler.
✨ New: GrantEventListener — Permission Funnel Analytics
Attach an optional listener to any handler to observe the full permission flow lifecycle (onRequested, onGranted, onDenied, onRationaleShown, onSettingsGuideShown, onSettingsOpened).
✨ New: GrantDialogStrings — i18n via CompositionLocal
Replace per-callsite string overrides with a single app-level provider using GrantDialogStringsProvider.
🐛 Bug Fixes
- Issue #41 — Double-denial dead-end (Android): Escalates to settings guide when the OS returns
DENIEDafter a rationale has already been shown. - Issue #33 —
LOCATION_ALWAYSPARTIAL stuck: Fixed false positiveonGrantedwhen background location was denied but foreground was granted. - iOS — requestWithCustomUi missing events: Custom-UI flow now correctly emits all
GrantEventListenerevents. - iOS — Group Handler Rationale: Fixed inconsistent rationale display for group requests on iOS.
- iOS — Avoid double location dialogs: Removed spurious
requestWhenInUseAuthorization()beforerequestAlwaysAuthorization()to prevent UI flicker.
♻️ Internal Refactoring
- Unified state machine: Merged
handleStatus()andhandleStatusWithCustomUi()into a single logic path. - Test Integrity: Refactored unit tests to remove deceptive/meaningless checks and added robust assertions.