Преглед изворни кода

fix(screenLock): Improve.

 - Add debug logs.
 - Re-request wake lock if it is released by the OS because of page
visibility.
factor2
Hristo Terezov пре 2 година
родитељ
комит
74f605e045
1 измењених фајлова са 57 додато и 12 уклоњено
  1. 57
    12
      react/features/base/conference/middleware.web.ts

+ 57
- 12
react/features/base/conference/middleware.web.ts Прегледај датотеку

19
 /**
19
 /**
20
  * Releases the screen lock.
20
  * Releases the screen lock.
21
  *
21
  *
22
- * @returns {void}
22
+ * @returns {Promise}
23
  */
23
  */
24
-function releaseScreenLock() {
24
+async function releaseScreenLock() {
25
     if (screenLock) {
25
     if (screenLock) {
26
-        screenLock.release();
26
+        if (!screenLock.released) {
27
+            logger.debug('Releasing wake lock.');
28
+
29
+            try {
30
+                await screenLock.release();
31
+            } catch (e) {
32
+                logger.error(`Error while releasing the screen wake lock: ${e}.`);
33
+            }
34
+        }
35
+        screenLock.removeEventListener('release', onWakeLockReleased);
27
         screenLock = undefined;
36
         screenLock = undefined;
37
+        document.removeEventListener('visibilitychange', handleVisibilityChange);
38
+    }
39
+}
40
+
41
+/**
42
+ * Requests a new screen wake lock.
43
+ *
44
+ * @returns {void}
45
+ */
46
+function requestWakeLock() {
47
+    if (navigator.wakeLock?.request) {
48
+        navigator.wakeLock.request('screen')
49
+            .then(lock => {
50
+                screenLock = lock;
51
+                screenLock.addEventListener('release', onWakeLockReleased);
52
+                document.addEventListener('visibilitychange', handleVisibilityChange);
53
+                logger.debug('Wake lock created.');
54
+            })
55
+            .catch(e => {
56
+                logger.error(`Error while requesting wake lock for screen: ${e}`);
57
+            });
58
+    }
59
+}
60
+
61
+/**
62
+ * Page visibility change handler that re-requests the wake lock if it has been released by the OS.
63
+ *
64
+ * @returns {void}
65
+ */
66
+async function handleVisibilityChange() {
67
+    if (screenLock?.released && document.visibilityState === 'visible') {
68
+        // The screen lock have been released by the OS because of document visibility change. Lets try to request the
69
+        // wake lock again.
70
+        await releaseScreenLock();
71
+        requestWakeLock();
28
     }
72
     }
29
 }
73
 }
30
 
74
 
75
+/**
76
+ * Wake lock released handler.
77
+ *
78
+ * @returns {void}
79
+ */
80
+function onWakeLockReleased() {
81
+    logger.debug('Wake lock released');
82
+}
83
+
31
 MiddlewareRegistry.register(store => next => action => {
84
 MiddlewareRegistry.register(store => next => action => {
32
     const { dispatch, getState } = store;
85
     const { dispatch, getState } = store;
33
     const { enableForcedReload } = getState()['features/base/config'];
86
     const { enableForcedReload } = getState()['features/base/config'];
43
             dispatch(setSkipPrejoinOnReload(false));
96
             dispatch(setSkipPrejoinOnReload(false));
44
         }
97
         }
45
 
98
 
46
-        if (navigator.wakeLock?.request) {
47
-            navigator.wakeLock.request('screen')
48
-                .then(lock => {
49
-                    screenLock = lock;
50
-                })
51
-                .catch(e => {
52
-                    logger.error(`Error while requesting wake lock for screen: ${e}`);
53
-                });
54
-        }
99
+        requestWakeLock();
55
 
100
 
56
         break;
101
         break;
57
     }
102
     }

Loading…
Откажи
Сачувај