Files
iOS/Sources/App/Frontend/Extensions/WebViewController+Kiosk.swift
nstefanelli 9ca16127c8 Fix kiosk screensaver idle timer not resetting on touch (#4434)
## Summary
- Kiosk screensaver idle timer was not resetting on user interaction —
`recordKioskActivity()` was defined but never called
- WKWebView consumes touch events before UIKit idle detection, so the
timer counted down from kiosk activation rather than last touch
- Added a tap gesture recognizer on the WebView (`cancelsTouchesInView =
false`) to detect taps without interfering with normal interaction
- Added `scrollViewWillBeginDragging` delegate hook to detect
scroll/drag interactions

## Test plan
- [ ] Enable kiosk mode with 30s screensaver timeout
- [ ] Tap on the WebView dashboard — idle timer should reset
- [ ] Scroll on the dashboard — idle timer should reset
- [ ] Stop interacting — screensaver should appear after configured
timeout
- [ ] Verify normal WebView interaction (taps, links, scrolling) still
works normally

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Nick Stefanelli <nstefanelli@users.noreply.github.com>
2026-03-23 09:28:44 +01:00

45 lines
1.3 KiB
Swift

import Shared
import UIKit
// MARK: - Kiosk Mode Extension
extension WebViewController {
/// Setup kiosk mode integration with KioskModeManager
/// Call this from viewDidLoad
func setupKioskMode() {
KioskModeManager.shared.setup(using: self)
setupKioskTouchDetection()
}
// MARK: - Status Bar & Home Indicator
var kioskPrefersStatusBarHidden: Bool {
KioskModeManager.shared.prefersStatusBarHidden
}
var kioskPrefersHomeIndicatorAutoHidden: Bool {
KioskModeManager.shared.prefersHomeIndicatorAutoHidden
}
// MARK: - Touch Handling
/// Add a tap gesture recognizer to detect WebView touches for the idle timer.
/// WKWebView consumes touch events, so without this the idle timer never resets.
private func setupKioskTouchDetection() {
let tap = UITapGestureRecognizer(target: self, action: #selector(kioskTouchDetected))
tap.cancelsTouchesInView = false
tap.delegate = self
webView.addGestureRecognizer(tap)
}
@objc private func kioskTouchDetected() {
recordKioskActivity()
}
/// Record user touch activity to reset the screensaver idle timer
func recordKioskActivity() {
guard KioskModeManager.shared.isKioskModeActive else { return }
KioskModeManager.shared.recordActivity(source: "touch")
}
}