// screenLockManager.js - Manages screen wake lock to prevent screen from turning off // Uses the Screen Wake Lock API: https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API let wakeLock = null; let isLockEnabled = false; /** * Requests a screen wake lock to prevent the screen from turning off * @returns {Promise} - True if wake lock was acquired successfully */ export async function acquireWakeLock() { if (!isScreenWakeLockSupported()) { console.warn('[ScreenLockManager] Screen Wake Lock API not supported in this browser'); return false; } try { // Release any existing wake lock first await releaseWakeLock(); // Request a new wake lock wakeLock = await navigator.wakeLock.request('screen'); isLockEnabled = true; console.log('[ScreenLockManager] Screen Wake Lock acquired'); // Add event listeners to reacquire the lock when needed setupWakeLockListeners(); return true; } catch (error) { console.error('[ScreenLockManager] Error acquiring wake lock:', error); isLockEnabled = false; return false; } } /** * Releases the screen wake lock if one is active * @returns {Promise} - True if wake lock was released successfully */ export async function releaseWakeLock() { if (!wakeLock) { return true; // No wake lock to release } try { await wakeLock.release(); wakeLock = null; isLockEnabled = false; console.log('[ScreenLockManager] Screen Wake Lock released'); return true; } catch (error) { console.error('[ScreenLockManager] Error releasing wake lock:', error); return false; } } /** * Checks if the Screen Wake Lock API is supported in this browser * @returns {boolean} - True if supported */ export function isScreenWakeLockSupported() { return 'wakeLock' in navigator && 'request' in navigator.wakeLock; } /** * Returns the current status of the wake lock * @returns {boolean} - True if wake lock is currently active */ export function isWakeLockActive() { return isLockEnabled && wakeLock !== null; } /** * Sets up event listeners to reacquire the wake lock when needed * (e.g., when the page becomes visible again after being hidden) */ function setupWakeLockListeners() { // When the page becomes visible again, reacquire the wake lock document.addEventListener('visibilitychange', handleVisibilityChange); // When the screen orientation changes, reacquire the wake lock if ('screen' in window && 'orientation' in window.screen) { window.screen.orientation.addEventListener('change', handleOrientationChange); } } /** * Handles visibility change events to reacquire wake lock when page becomes visible */ async function handleVisibilityChange() { if (isLockEnabled && document.visibilityState === 'visible') { // Only try to reacquire if we previously had a lock await acquireWakeLock(); } } /** * Handles orientation change events to reacquire wake lock */ async function handleOrientationChange() { if (isLockEnabled) { // Some devices may release the wake lock on orientation change await acquireWakeLock(); } } /** * Initializes the screen lock manager * @param {Object} options - Configuration options * @param {boolean} options.autoAcquire - Whether to automatically acquire wake lock on init * @returns {Promise} - True if initialization was successful */ export async function initScreenLockManager(options = {}) { const { autoAcquire = true } = options; // Default to true - automatically acquire on init // Check for support const isSupported = isScreenWakeLockSupported(); console.log(`[ScreenLockManager] Screen Wake Lock API ${isSupported ? 'is' : 'is not'} supported`); // Automatically acquire wake lock if supported (now default behavior) if (autoAcquire && isSupported) { return await acquireWakeLock(); } return isSupported; }