diff --git a/backend/main.py b/backend/main.py index cdfc0c3..997d908 100644 --- a/backend/main.py +++ b/backend/main.py @@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "884" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "885" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/index.html b/backend/static/index.html index 4752806..cc215cf 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -101,9 +101,9 @@ - - - + + +
@@ -583,10 +583,10 @@ - - - - + + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 1d1a348..9c1a424 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '884'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '885'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen diff --git a/backend/static/js/pages/map.js b/backend/static/js/pages/map.js index dda7473..4cce79c 100644 --- a/backend/static/js/pages/map.js +++ b/backend/static/js/pages/map.js @@ -1582,10 +1582,14 @@ window.Page_map = (() => { } async function _acquireWakeLock() { - if (!('wakeLock' in navigator)) return; + if (!('wakeLock' in navigator) || _wakeLock) return; try { _wakeLock = await navigator.wakeLock.request('screen'); - _wakeLock.addEventListener('release', () => { _wakeLock = null; }); + _wakeLock.addEventListener('release', () => { + _wakeLock = null; + // OS hat Lock entzogen → sofort neu anfordern wenn noch aufzeichnet + if (_recActive) _acquireWakeLock(); + }); } catch {} } diff --git a/backend/static/js/pages/routes.js b/backend/static/js/pages/routes.js index a085587..21e5d6e 100644 --- a/backend/static/js/pages/routes.js +++ b/backend/static/js/pages/routes.js @@ -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) { diff --git a/backend/static/sw.js b/backend/static/sw.js index 020e457..4bb5047 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v884'; +const CACHE_VERSION = 'by-v885'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache