Fixed
-
π₯ App crashes immediately on launch on cameraless x86 devices (BlissOS / Surface Go 2) (#187): On devices whose camera service returns
nullfromCameraManager.getCameraIdList()(e.g. BlissOS x86_64 desktop builds with no camera HAL), react-native-vision-camera'sCameraDevicesManagerthrew aNullPointerExceptionwhile 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_anywheremode the N-tap gesture is now also detected natively inMainActivity.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 deliverstouchendto 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_enabledflag. 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 installfails with "Failed to apply patch for package react-native-webview" (#184): Thereact-native-webviewpatch 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"), abortingpostinstallon every platform. Fixed by regenerating the patch from source so the headers are correct. Also hardened.gitattributeswith a*.patch text eol=lfrule 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
textZoomwhich only scaled text size, causing card contents in Home Assistant dashboards to overflow their containers. Zoom now applies a CSSzoomproperty 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 CSSzoomtodocument.bodyinstead β 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 betweensetLockTaskPackages()andstartLockTask(). On Android 12+ devices (Lenovo, Samsung, KTC), this DPM call triggers a window policy change mid-sequence that disrupts lock task startup, leavingBootLockActivitystuck andMainActivityunable to take over. Fixed by movingsetScreenCaptureDisabledto afterstartLockTask()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
screensaverEnabledtofalse, 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
screenOncommand not working afterscreenOffin 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.screenOnandscreenOffare 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 sharedScreenControllerobject used by both MQTT and REST.