persistentBottomBarWindowInsets

Android implementation for bottom bars that remain pinned to the screen edge.

Android 15/API 35 started enforcing edge-to-edge for apps targeting the new SDK, so on those devices the app can draw behind the navigation area and must explicitly keep persistent controls clear of WindowInsets.navigationBars. Older Android releases, especially the Pixel 3a XL/API 32 case with the classic three-button navigation bar, already give the app a window whose bottom is above the system bar. Applying navigationBars there adds the same inset a second time, producing the release-only-looking gap that triggered this helper. Returning zero before API 35 preserves the legacy window contract; returning navigationBars on API 35+ preserves enforced edge-to-edge.

Returns the bottom system inset that persistent bottom controls should apply.

This exists as a named API because using WindowInsets.navigationBars directly at every call site is wrong for this app: some hosts already resize the content window above the navigation bar, while newer edge-to-edge hosts expect the app to reserve that space itself. The visible failure was a Docker/Play release looking different from an Android Studio install on a Pixel 3a XL with the three-button navigation bar: bottom navigation and sticky buttons were lifted by exactly one navigation-bar height. Callers should use this helper for persistent bottom UI instead of deciding platform inset behavior locally.

iOS implementation for bottom bars that remain pinned to the screen edge.

The Android workaround must not leak into iOS because the UIKit/Compose host keeps the usual safe area contract for home indicator and bottom system affordances. Persistent buttons and navigation bars still need WindowInsets.navigationBars here to avoid sitting under the home indicator. The release regression was caused by Android's split behavior between legacy resized windows and enforced edge-to-edge, not by a common Compose layout problem. Keeping the iOS actual explicit makes the platform split intentional and protects future cleanups from flattening both platforms back to the same, Android-biased inset rule.