Fix: Wake Lock Re-Acquire nach unfreiwilligem Release + visibilitychange-Handler (routes.js + map.js, SW by-v885)

This commit is contained in:
rene 2026-05-12 18:03:35 +02:00
parent 9deb04c02d
commit 8f39c22a7f
6 changed files with 57 additions and 14 deletions

View file

@ -763,7 +763,8 @@ window.Page_routes = (() => {
_recPolyline = L.polyline([], { color: '#ef4444', weight: 5, opacity: 0.9 }).addTo(_recMap);
navigator.wakeLock?.request('screen').then(wl => { _recWakeLock = wl; }).catch(() => {});
await _recAcquireWakeLock();
document.addEventListener('visibilitychange', _recOnVisibility);
_recWatchId = navigator.geolocation.watchPosition(pos => {
const lat = pos.coords.latitude, lon = pos.coords.longitude;
@ -852,6 +853,24 @@ window.Page_routes = (() => {
}, 5000);
}
async function _recAcquireWakeLock() {
if (!('wakeLock' in navigator) || _recWakeLock) return;
try {
_recWakeLock = await navigator.wakeLock.request('screen');
_recWakeLock.addEventListener('release', () => {
_recWakeLock = null;
// OS hat Lock entzogen (Anruf, Tab-Wechsel etc.) → sofort neu anfordern
if (_recActive) _recAcquireWakeLock();
});
} catch {}
}
function _recOnVisibility() {
if (_recActive && document.visibilityState === 'visible' && !_recWakeLock) {
_recAcquireWakeLock();
}
}
async function _stopRecInOvl(save) {
if (!_recActive && save) return;
_recActive = false;
@ -859,6 +878,7 @@ window.Page_routes = (() => {
if (_recTimerInt) { clearInterval(_recTimerInt); _recTimerInt = null; }
if (_recInactTimer){ clearTimeout(_recInactTimer); _recInactTimer = null; }
if (_recWakeLock) { try { await _recWakeLock.release(); } catch {} _recWakeLock = null; }
document.removeEventListener('visibilitychange', _recOnVisibility);
_recOvl?.removeEventListener('touchstart', _onRecOvlTouch);
_recOvl?.removeEventListener('pointerdown', _onRecOvlTouch);
@ -1706,7 +1726,8 @@ window.Page_routes = (() => {
};
// GPS-Watch
navigator.wakeLock?.request('screen').then(wl => { _navWakeLock = wl; }).catch(() => {});
await _navAcquireWakeLock();
document.addEventListener('visibilitychange', _navOnVisibility);
let _navFirstFix = true;
_navWatchId = navigator.geolocation.watchPosition(pos => {
const { latitude: lat, longitude: lon } = pos.coords;
@ -1852,10 +1873,28 @@ window.Page_routes = (() => {
}, 10000);
}
async function _navAcquireWakeLock() {
if (!('wakeLock' in navigator) || _navWakeLock) return;
try {
_navWakeLock = await navigator.wakeLock.request('screen');
_navWakeLock.addEventListener('release', () => {
_navWakeLock = null;
if (_navWatchId !== null) _navAcquireWakeLock();
});
} catch {}
}
function _navOnVisibility() {
if (_navWatchId !== null && document.visibilityState === 'visible' && !_navWakeLock) {
_navAcquireWakeLock();
}
}
function _closeNav() {
if (_navWatchId !== null) { navigator.geolocation.clearWatch(_navWatchId); _navWatchId = null; }
if (_navInactTimer) { clearTimeout(_navInactTimer); _navInactTimer = null; }
if (_navWakeLock) { try { _navWakeLock.release(); } catch {} _navWakeLock = null; }
document.removeEventListener('visibilitychange', _navOnVisibility);
if (_navWalkMeta && _navWalkMeta.trackLen > 1) {
const pct = Math.round(_navMaxIdx / (_navWalkMeta.trackLen - 1) * 100);
if (pct >= 50) {