소스 검색

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,15 +19,68 @@ let screenLock: WakeLockSentinel | undefined;
19 19
 /**
20 20
  * Releases the screen lock.
21 21
  *
22
- * @returns {void}
22
+ * @returns {Promise}
23 23
  */
24
-function releaseScreenLock() {
24
+async function releaseScreenLock() {
25 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 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 84
 MiddlewareRegistry.register(store => next => action => {
32 85
     const { dispatch, getState } = store;
33 86
     const { enableForcedReload } = getState()['features/base/config'];
@@ -43,15 +96,7 @@ MiddlewareRegistry.register(store => next => action => {
43 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 101
         break;
57 102
     }

Loading…
취소
저장