github RushB-fr/freekiosk v1.2.20-beta.2
FreeKiosk v1.2.20-beta.2 - Stability & WebView Fixes

pre-release4 hours ago

Fixed

  • πŸ’₯ App crashes immediately on launch on cameraless x86 devices (BlissOS / Surface Go 2) (#187): On devices whose camera service returns null from CameraManager.getCameraIdList() (e.g. BlissOS x86_64 desktop builds with no camera HAL), react-native-vision-camera's CameraDevicesManager threw a NullPointerException while building its availability callback. Because the module is instantiated eagerly during TurboModule initialization, this aborted the whole React instance and crashed the app on first launch β€” before any settings could load. Added a patch-package patch (react-native-vision-camera+4.7.3.patch) wrapping that call so a null camera list is treated as "no cameras" instead of crashing. Camera features are simply unavailable on such devices; the app now launches normally.

  • πŸ”“ Stuck in kiosk with no way back to settings when the page fails to load (#180): In WebView mode the normal N-tap-to-settings gesture relies on JavaScript injected into the page, so when the page can't load (server down, Wi-Fi not yet up after a reboot, HTTP error) no taps were ever reported and the user was stranded. Two fixes: (1) the error overlay β€” with its fallback βš™οΈ settings button β€” now appears for any main-document HTTP error code, regardless of the auto-reload setting (previously only for 5xx with auto-reload on), while sub-resource errors (favicons, scripts…) are correctly ignored; (2) the fallback βš™οΈ button now counts toward the N-tap sequence in every return mode, not just "tap anywhere"; (3) in WebView/media tap_anywhere mode the N-tap gesture is now also detected natively in MainActivity.dispatchTouchEvent(), independently of the page's injected JavaScript β€” so the escape still works when the page routes touches into a cross-origin iframe or the OEM WebView never delivers touchend to our listener (the page loads fine but in-page taps were lost). Active by default, gated to the kiosk screen only (never fires while inside Pin/Settings) in WebView/media + tap_anywhere mode, and disableable via the @kiosk_tap_to_settings_native_enabled flag. The hardware Volume-Up Γ—5 shortcut remains the JS-independent escape hatch, now likewise scoped to the kiosk screen so it can't kick the user out of Pin/Settings.

  • 🩹 npm install fails with "Failed to apply patch for package react-native-webview" (#184): The react-native-webview patch had corrupted hunk headers β€” its @@ -a,b +c,d @@ line counts no longer matched the hunk bodies. This was introduced when the SSL-redirect fix (#144) was hand-edited into the patch without recomputing the counts. patch-package 8 rejects such patches with a "hunk header integrity check failed" error (which it surfaces as the generic "could not be parsed"), aborting postinstall on every platform. Fixed by regenerating the patch from source so the headers are correct. Also hardened .gitattributes with a *.patch text eol=lf rule so patch files keep LF line endings on Windows checkouts.

  • πŸ” WebView zoom now scales the full page layout, not just text (#188): The zoom setting previously used Android's textZoom which only scaled text size, causing card contents in Home Assistant dashboards to overflow their containers. Zoom now applies a CSS zoom property on the root element, scaling text, images, and layout containers uniformly.

  • πŸ” New "Home Assistant" zoom mode that re-flows dashboards (#188): Zooming <html> (the "Standard" mode) enlarged Home Assistant card contents without resizing the cards, so they overflowed. HADashboard avoids this by applying CSS zoom to document.body instead β€” HA measures its card layout from the body, so zooming the body makes the dashboard re-flow its columns and fill the screen. Added a Zoom mode selector under Display β†’ Web Page Zoom: Standard (zooms <html>, unchanged default) and Home Assistant (zooms <body>, matching HADashboard's method). Opt-in, since a few non-HA sites may render differently.

  • πŸ”„ Black screen / stuck on "Starting kiosk…" after reboot in Device Owner mode (#176): Regression introduced in v1.2.20 (#172 fix). setScreenCaptureDisabled(adminComponent, true) was called between setLockTaskPackages() and startLockTask(). On Android 12+ devices (Lenovo, Samsung, KTC), this DPM call triggers a window policy change mid-sequence that disrupts lock task startup, leaving BootLockActivity stuck and MainActivity unable to take over. Fixed by moving setScreenCaptureDisabled to after startLockTask() so the lock task session is fully established first.

  • πŸ’€ Screensaver toggle resets to off after saving settings in External App mode (#179): When display mode is set to External App, saving settings always forced screensaverEnabled to false, overwriting the user's choice. The screensaver save was correctly moved to apply to all display modes in a prior commit, but the old force-disable in the External App branch was never removed. Deleted the stale override.

  • πŸ”† MQTT screenOn command not working after screenOff in Device Owner mode (#181): When Device Owner is active, lockNow() suspends the React Native JS thread, so MQTT commands routed through the JS event bridge were silently dropped. screenOn and screenOff are now handled natively in the MQTT command handler (same path as the REST API), bypassing the JS bridge entirely. Screen control logic has been extracted into a shared ScreenController object used by both MQTT and REST.

Don't miss a new freekiosk release

NewReleases is sending notifications on new releases.