Pārlūkot izejas kodu

feat(mute): Add analytics and console logs for audio/video mutes

master
hristoterezov 8 gadus atpakaļ
vecāks
revīzija
0eddef4d62

+ 8
- 0
conference.js Parādīt failu

674
             }).then(([tracks, con]) => {
674
             }).then(([tracks, con]) => {
675
                 tracks.forEach(track => {
675
                 tracks.forEach(track => {
676
                     if (track.isAudioTrack() && this.isLocalAudioMuted()) {
676
                     if (track.isAudioTrack() && this.isLocalAudioMuted()) {
677
+                        sendEvent('conference.audio.initiallyMuted');
678
+                        logger.log('Audio mute: initially muted');
677
                         track.mute();
679
                         track.mute();
678
                     } else if (track.isVideoTrack()
680
                     } else if (track.isVideoTrack()
679
                                     && this.isLocalVideoMuted()) {
681
                                     && this.isLocalVideoMuted()) {
682
+                        sendEvent('conference.video.initiallyMuted');
683
+                        logger.log('Video mute: initially muted');
680
                         track.mute();
684
                         track.mute();
681
                     }
685
                     }
682
                 });
686
                 });
2260
                     if (audioWasMuted ||
2264
                     if (audioWasMuted ||
2261
                         currentDevices.audioinput.length >
2265
                         currentDevices.audioinput.length >
2262
                         availableAudioInputDevices.length) {
2266
                         availableAudioInputDevices.length) {
2267
+                        sendEvent('deviceListChanged.audio.muted');
2268
+                        logger.log('Audio mute: device list changed');
2263
                         muteLocalAudio(true);
2269
                         muteLocalAudio(true);
2264
                     }
2270
                     }
2265
 
2271
 
2269
                         (videoWasMuted ||
2275
                         (videoWasMuted ||
2270
                             currentDevices.videoinput.length >
2276
                             currentDevices.videoinput.length >
2271
                                 availableVideoInputDevices.length)) {
2277
                                 availableVideoInputDevices.length)) {
2278
+                        sendEvent('deviceListChanged.video.muted');
2279
+                        logger.log('Video mute: device list changed');
2272
                         muteLocalVideo(true);
2280
                         muteLocalVideo(true);
2273
                     }
2281
                     }
2274
                 }));
2282
                 }));

+ 7
- 0
modules/API/API.js Parādīt failu

2
 
2
 
3
 import * as JitsiMeetConferenceEvents from '../../ConferenceEvents';
3
 import * as JitsiMeetConferenceEvents from '../../ConferenceEvents';
4
 import { parseJWTFromURLParams } from '../../react/features/base/jwt';
4
 import { parseJWTFromURLParams } from '../../react/features/base/jwt';
5
+import { sendEvent } from '../../react/features/analytics';
5
 import { getJitsiMeetTransport } from '../transport';
6
 import { getJitsiMeetTransport } from '../transport';
6
 
7
 
7
 import { API_ID } from './constants';
8
 import { API_ID } from './constants';
8
 
9
 
10
+const logger = require('jitsi-meet-logger').getLogger(__filename);
11
+
9
 declare var APP: Object;
12
 declare var APP: Object;
10
 
13
 
11
 /**
14
 /**
52
         'display-name':
55
         'display-name':
53
             APP.conference.changeLocalDisplayName.bind(APP.conference),
56
             APP.conference.changeLocalDisplayName.bind(APP.conference),
54
         'toggle-audio': () => {
57
         'toggle-audio': () => {
58
+            sendEvent('api.toggle.audio');
59
+            logger.log('Audio toggle: API command received');
55
             APP.conference.toggleAudioMuted(false /* no UI */);
60
             APP.conference.toggleAudioMuted(false /* no UI */);
56
         },
61
         },
57
         'toggle-video': () => {
62
         'toggle-video': () => {
63
+            sendEvent('api.toggle.video');
64
+            logger.log('Video toggle: API command received');
58
             APP.conference.toggleVideoMuted(false /* no UI */);
65
             APP.conference.toggleVideoMuted(false /* no UI */);
59
         },
66
         },
60
         'toggle-film-strip': APP.UI.toggleFilmstrip,
67
         'toggle-film-strip': APP.UI.toggleFilmstrip,

+ 4
- 2
modules/UI/shared_video/SharedVideo.js Parādīt failu

533
         if (APP.conference.isLocalAudioMuted()
533
         if (APP.conference.isLocalAudioMuted()
534
             && !this.mutedWithUserInteraction
534
             && !this.mutedWithUserInteraction
535
             && !this.isSharedVideoVolumeOn()) {
535
             && !this.isSharedVideoVolumeOn()) {
536
-
536
+            sendEvent("sharedvideo.audio.unmuted");
537
+            logger.log('Shared video: audio unmuted');
537
             this.emitter.emit(UIEvents.AUDIO_MUTED, false, false);
538
             this.emitter.emit(UIEvents.AUDIO_MUTED, false, false);
538
             this.showMicMutedPopup(false);
539
             this.showMicMutedPopup(false);
539
         }
540
         }
546
     smartAudioMute() {
547
     smartAudioMute() {
547
         if (!APP.conference.isLocalAudioMuted()
548
         if (!APP.conference.isLocalAudioMuted()
548
             && this.isSharedVideoVolumeOn()) {
549
             && this.isSharedVideoVolumeOn()) {
549
-
550
+            sendEvent("sharedvideo.audio.muted");
551
+            logger.log('Shared video: audio muted');
550
             this.emitter.emit(UIEvents.AUDIO_MUTED, true, false);
552
             this.emitter.emit(UIEvents.AUDIO_MUTED, true, false);
551
             this.showMicMutedPopup(true);
553
             this.showMicMutedPopup(true);
552
         }
554
         }

+ 7
- 1
modules/keyboardshortcut/keyboardshortcut.js Parādīt failu

4
 import { sendEvent } from '../../react/features/analytics';
4
 import { sendEvent } from '../../react/features/analytics';
5
 import { SpeakerStats } from '../../react/features/speaker-stats';
5
 import { SpeakerStats } from '../../react/features/speaker-stats';
6
 
6
 
7
+const logger = require('jitsi-meet-logger').getLogger(__filename);
8
+
7
 /**
9
 /**
8
  * The reference to the shortcut dialogs when opened.
10
  * The reference to the shortcut dialogs when opened.
9
  */
11
  */
28
     // register SPACE shortcut in two steps to insure visibility of help message
30
     // register SPACE shortcut in two steps to insure visibility of help message
29
     KeyboardShortcut.registerShortcut(" ", null, function() {
31
     KeyboardShortcut.registerShortcut(" ", null, function() {
30
         sendEvent("shortcut.talk.clicked");
32
         sendEvent("shortcut.talk.clicked");
33
+        logger.log('Talk shortcut pressed');
31
         APP.conference.muteAudio(true);
34
         APP.conference.muteAudio(true);
32
     });
35
     });
33
     KeyboardShortcut._addShortcutToHelp("SPACE","keyboardShortcuts.pushToTalk");
36
     KeyboardShortcut._addShortcutToHelp("SPACE","keyboardShortcuts.pushToTalk");
119
                 $(":focus").is("textarea"))) {
122
                 $(":focus").is("textarea"))) {
120
                 var key = self._getKeyboardKey(e).toUpperCase();
123
                 var key = self._getKeyboardKey(e).toUpperCase();
121
                 if(key === " ") {
124
                 if(key === " ") {
122
-                    if(APP.conference.isLocalAudioMuted())
125
+                    if(APP.conference.isLocalAudioMuted()) {
126
+                        sendEvent("shortcut.talk.released");
127
+                        logger.log('Talk shortcut released');
123
                         APP.conference.muteAudio(false);
128
                         APP.conference.muteAudio(false);
129
+                    }
124
                 }
130
                 }
125
             }
131
             }
126
         };
132
         };

+ 15
- 2
react/features/base/conference/actions.js Parādīt failu

1
 // @flow
1
 // @flow
2
 
2
 
3
+import { sendEvent } from '../../analytics';
3
 import { JitsiConferenceEvents } from '../lib-jitsi-meet';
4
 import { JitsiConferenceEvents } from '../lib-jitsi-meet';
4
 import { setAudioMuted, setVideoMuted } from '../media';
5
 import { setAudioMuted, setVideoMuted } from '../media';
5
 import {
6
 import {
39
 
40
 
40
 import type { Dispatch } from 'redux';
41
 import type { Dispatch } from 'redux';
41
 
42
 
43
+const logger = require('jitsi-meet-logger').getLogger(__filename);
44
+
42
 /**
45
 /**
43
  * Adds conference (event) listeners.
46
  * Adds conference (event) listeners.
44
  *
47
  *
69
     conference.on(
72
     conference.on(
70
         JitsiConferenceEvents.STARTED_MUTED,
73
         JitsiConferenceEvents.STARTED_MUTED,
71
         () => {
74
         () => {
75
+            const audioMuted = Boolean(conference.startAudioMuted);
76
+            const videoMuted = Boolean(conference.startVideoMuted);
77
+
78
+            sendEvent(
79
+                `startmuted.server.audio.${audioMuted ? 'muted' : 'unmuted'}`);
80
+            sendEvent(
81
+                `startmuted.server.video.${videoMuted ? 'muted' : 'unmuted'}`);
82
+            logger.log(`Start muted: ${audioMuted ? 'audio, ' : ''}${
83
+                videoMuted ? 'video' : ''}`);
84
+
72
             // XXX Jicofo tells lib-jitsi-meet to start with audio and/or video
85
             // XXX Jicofo tells lib-jitsi-meet to start with audio and/or video
73
             // muted i.e. Jicofo expresses an intent. Lib-jitsi-meet has turned
86
             // muted i.e. Jicofo expresses an intent. Lib-jitsi-meet has turned
74
             // Jicofo's intent into reality by actually muting the respective
87
             // Jicofo's intent into reality by actually muting the respective
77
             // TODO Maybe the app needs to learn about Jicofo's intent and
90
             // TODO Maybe the app needs to learn about Jicofo's intent and
78
             // transfer that intent to lib-jitsi-meet instead of lib-jitsi-meet
91
             // transfer that intent to lib-jitsi-meet instead of lib-jitsi-meet
79
             // acting on Jicofo's intent without the app's knowledge.
92
             // acting on Jicofo's intent without the app's knowledge.
80
-            dispatch(setAudioMuted(Boolean(conference.startAudioMuted)));
81
-            dispatch(setVideoMuted(Boolean(conference.startVideoMuted)));
93
+            dispatch(setAudioMuted(audioMuted));
94
+            dispatch(setVideoMuted(videoMuted));
82
         });
95
         });
83
 
96
 
84
     // Dispatches into features/base/tracks follow:
97
     // Dispatches into features/base/tracks follow:

+ 7
- 2
react/features/base/conference/middleware.js Parādīt failu

35
     _removeLocalTracksFromConference
35
     _removeLocalTracksFromConference
36
 } from './functions';
36
 } from './functions';
37
 
37
 
38
+const logger = require('jitsi-meet-logger').getLogger(__filename);
39
+
38
 declare var APP: Object;
40
 declare var APP: Object;
39
 
41
 
40
 /**
42
 /**
121
 function _conferenceFailedOrLeft({ dispatch, getState }, next, action) {
123
 function _conferenceFailedOrLeft({ dispatch, getState }, next, action) {
122
     const result = next(action);
124
     const result = next(action);
123
 
125
 
124
-    getState()['features/base/conference'].audioOnly
125
-        && dispatch(setAudioOnly(false));
126
+    if (getState()['features/base/conference'].audioOnly) {
127
+        sendEvent('audioonly.disabled');
128
+        logger.log('Audio only disabled');
129
+        dispatch(setAudioOnly(false));
130
+    }
126
 
131
 
127
     return result;
132
     return result;
128
 }
133
 }

+ 22
- 3
react/features/base/media/middleware.js Parādīt failu

1
 /* @flow */
1
 /* @flow */
2
 
2
 
3
+import { sendEvent } from '../../analytics';
3
 import { SET_ROOM, setAudioOnly } from '../conference';
4
 import { SET_ROOM, setAudioOnly } from '../conference';
4
 import { parseURLParams } from '../config';
5
 import { parseURLParams } from '../config';
5
 import { MiddlewareRegistry } from '../redux';
6
 import { MiddlewareRegistry } from '../redux';
8
 import { setAudioMuted, setCameraFacingMode, setVideoMuted } from './actions';
9
 import { setAudioMuted, setCameraFacingMode, setVideoMuted } from './actions';
9
 import { CAMERA_FACING_MODE } from './constants';
10
 import { CAMERA_FACING_MODE } from './constants';
10
 
11
 
12
+const logger = require('jitsi-meet-logger').getLogger(__filename);
13
+
11
 /**
14
 /**
12
  * Implements the entry point of the middleware of the feature base/media.
15
  * Implements the entry point of the middleware of the feature base/media.
13
  *
16
  *
77
     typeof videoMuted === 'undefined'
80
     typeof videoMuted === 'undefined'
78
         && (videoMuted = config.startWithVideoMuted);
81
         && (videoMuted = config.startWithVideoMuted);
79
 
82
 
83
+    audioMuted = Boolean(audioMuted);
84
+    videoMuted = Boolean(videoMuted);
85
+
80
     // Apply the config.
86
     // Apply the config.
81
 
87
 
88
+    sendEvent(`startmuted.client.audio.${audioMuted ? 'muted' : 'unmuted'}`);
89
+    sendEvent(`startmuted.client.video.${videoMuted ? 'muted' : 'unmuted'}`);
90
+
91
+    logger.log(`Start muted: ${audioMuted ? 'audio, ' : ''}${
92
+        videoMuted ? 'video' : ''}`);
93
+
82
     // Unconditionally express the desires/expectations/intents of the app and
94
     // Unconditionally express the desires/expectations/intents of the app and
83
     // the user i.e. the state of base/media. Eventually, practice/reality i.e.
95
     // the user i.e. the state of base/media. Eventually, practice/reality i.e.
84
     // the state of base/tracks will or will not agree with the desires.
96
     // the state of base/tracks will or will not agree with the desires.
85
-    dispatch(setAudioMuted(Boolean(audioMuted)));
97
+    dispatch(setAudioMuted(audioMuted));
86
     dispatch(setCameraFacingMode(CAMERA_FACING_MODE.USER));
98
     dispatch(setCameraFacingMode(CAMERA_FACING_MODE.USER));
87
-    dispatch(setVideoMuted(Boolean(videoMuted)));
99
+    dispatch(setVideoMuted(videoMuted));
88
 
100
 
89
     // config.startAudioOnly
101
     // config.startAudioOnly
90
     //
102
     //
97
         let audioOnly = urlParams && urlParams['config.startAudioOnly'];
109
         let audioOnly = urlParams && urlParams['config.startAudioOnly'];
98
 
110
 
99
         typeof audioOnly === 'undefined' && (audioOnly = config.startAudioOnly);
111
         typeof audioOnly === 'undefined' && (audioOnly = config.startAudioOnly);
100
-        dispatch(setAudioOnly(Boolean(audioOnly)));
112
+        audioOnly = Boolean(audioOnly);
113
+        sendEvent(`startaudioonly.${audioOnly ? 'enabled' : 'disabled'}`);
114
+        logger.log(`Start audio only set to ${audioOnly.toString()}`);
115
+        dispatch(setAudioOnly(audioOnly));
101
     }
116
     }
102
 
117
 
103
     return next(action);
118
     return next(action);
121
     // not yet in redux state and JitsiTrackEvents.TRACK_MUTE_CHANGED may be
136
     // not yet in redux state and JitsiTrackEvents.TRACK_MUTE_CHANGED may be
122
     // fired before track gets to state.
137
     // fired before track gets to state.
123
     if (track.muted !== muted) {
138
     if (track.muted !== muted) {
139
+        sendEvent(
140
+            `synctrackstate.${track.mediaType}.${muted ? 'muted' : 'unmuted'}`);
141
+        logger.log(`Sync ${track.mediaType} track muted state to ${
142
+            muted ? 'muted' : 'unmuted'}`);
124
         track.muted = muted;
143
         track.muted = muted;
125
         setTrackMuted(track.jitsiTrack, muted);
144
         setTrackMuted(track.jitsiTrack, muted);
126
     }
145
     }

+ 10
- 1
react/features/base/tracks/actions.js Parādīt failu

1
+import { sendEvent } from '../../analytics';
1
 import { JitsiTrackErrors, JitsiTrackEvents } from '../lib-jitsi-meet';
2
 import { JitsiTrackErrors, JitsiTrackEvents } from '../lib-jitsi-meet';
2
 import {
3
 import {
3
     CAMERA_FACING_MODE,
4
     CAMERA_FACING_MODE,
15
 } from './actionTypes';
16
 } from './actionTypes';
16
 import { createLocalTracksF } from './functions';
17
 import { createLocalTracksF } from './functions';
17
 
18
 
19
+const logger = require('jitsi-meet-logger').getLogger(__filename);
20
+
18
 /**
21
 /**
19
  * Requests the creating of the desired media type tracks. Desire is expressed
22
  * Requests the creating of the desired media type tracks. Desire is expressed
20
  * by base/media unless the function caller specifies desired media types
23
  * by base/media unless the function caller specifies desired media types
154
                                 = newTrack.isVideoTrack()
157
                                 = newTrack.isVideoTrack()
155
                                     ? setVideoMuted
158
                                     ? setVideoMuted
156
                                     : setAudioMuted;
159
                                     : setAudioMuted;
160
+                            const isMuted = newTrack.isMuted();
161
+
162
+                            sendEvent(`replacetrack.${newTrack.getType()}.${
163
+                                isMuted ? 'muted' : 'unmuted'}`);
164
+                            logger.log(`Replace ${newTrack.getType()} track - ${
165
+                                isMuted ? 'muted' : 'unmuted'}`);
157
 
166
 
158
-                            return dispatch(setMuted(newTrack.isMuted()));
167
+                            return dispatch(setMuted());
159
                         }
168
                         }
160
                     })
169
                     })
161
                     .then(() => {
170
                     .then(() => {

+ 4
- 0
react/features/mobile/background/actions.js Parādīt failu

1
 /* @flow */
1
 /* @flow */
2
 
2
 
3
+import { sendEvent } from '../../analytics';
3
 import { setLastN } from '../../base/conference';
4
 import { setLastN } from '../../base/conference';
4
 import { setVideoMuted, VIDEO_MUTISM_AUTHORITY } from '../../base/media';
5
 import { setVideoMuted, VIDEO_MUTISM_AUTHORITY } from '../../base/media';
5
 
6
 
41
         const { audioOnly } = getState()['features/base/conference'];
42
         const { audioOnly } = getState()['features/base/conference'];
42
 
43
 
43
         audioOnly || dispatch(setLastN(muted ? 0 : undefined));
44
         audioOnly || dispatch(setLastN(muted ? 0 : undefined));
45
+
46
+        sendEvent('callkit.background.video.muted');
47
+
44
         dispatch(setVideoMuted(muted, VIDEO_MUTISM_AUTHORITY.BACKGROUND));
48
         dispatch(setVideoMuted(muted, VIDEO_MUTISM_AUTHORITY.BACKGROUND));
45
     };
49
     };
46
 }
50
 }

+ 5
- 1
react/features/mobile/callkit/middleware.js Parādīt failu

3
 import { NativeModules } from 'react-native';
3
 import { NativeModules } from 'react-native';
4
 import uuid from 'uuid';
4
 import uuid from 'uuid';
5
 
5
 
6
+import { sendEvent } from '../../analytics';
6
 import { APP_WILL_MOUNT, APP_WILL_UNMOUNT, appNavigate } from '../../app';
7
 import { APP_WILL_MOUNT, APP_WILL_UNMOUNT, appNavigate } from '../../app';
7
 import {
8
 import {
8
     CONFERENCE_FAILED,
9
     CONFERENCE_FAILED,
268
         const { muted: oldValue } = getState()['features/base/media'].audio;
269
         const { muted: oldValue } = getState()['features/base/media'].audio;
269
 
270
 
270
         if (oldValue !== newValue) {
271
         if (oldValue !== newValue) {
271
-            dispatch(setAudioMuted(Boolean(newValue)));
272
+            const value = Boolean(newValue);
273
+
274
+            sendEvent(`callkit.audio.${value ? 'muted' : 'unmuted'}`);
275
+            dispatch(setAudioMuted(value));
272
         }
276
         }
273
     }
277
     }
274
 }
278
 }

+ 1
- 1
react/features/remote-video-menu/components/MuteButton.js Parādīt failu

98
         const { dispatch, onClick, participantID } = this.props;
98
         const { dispatch, onClick, participantID } = this.props;
99
 
99
 
100
         sendEvent(
100
         sendEvent(
101
-            'remotevideomenu.mute',
101
+            'remotevideomenu.mute.clicked',
102
             {
102
             {
103
                 value: 1,
103
                 value: 1,
104
                 label: participantID
104
                 label: participantID

+ 10
- 1
react/features/toolbox/components/Toolbox.native.js Parādīt failu

3
 import { View } from 'react-native';
3
 import { View } from 'react-native';
4
 import { connect } from 'react-redux';
4
 import { connect } from 'react-redux';
5
 
5
 
6
+import { sendEvent } from '../../analytics';
6
 import { toggleAudioOnly } from '../../base/conference';
7
 import { toggleAudioOnly } from '../../base/conference';
7
 import {
8
 import {
8
     MEDIA_TYPE,
9
     MEDIA_TYPE,
174
      * @returns {void}
175
      * @returns {void}
175
      */
176
      */
176
     _onToggleAudio() {
177
     _onToggleAudio() {
178
+        const mute = !this.props._audioMuted;
179
+
180
+        sendEvent(`toolbar.audio.${mute ? 'muted' : 'unmuted'}`);
181
+
177
         // The user sees the reality i.e. the state of base/tracks and intends
182
         // The user sees the reality i.e. the state of base/tracks and intends
178
         // to change reality by tapping on the respective button i.e. the user
183
         // to change reality by tapping on the respective button i.e. the user
179
         // sets the state of base/media. Whether the user's intention will turn
184
         // sets the state of base/media. Whether the user's intention will turn
181
         // tapping.
186
         // tapping.
182
         this.props.dispatch(
187
         this.props.dispatch(
183
             setAudioMuted(
188
             setAudioMuted(
184
-                !this.props._audioMuted,
189
+                mute,
185
                 VIDEO_MUTISM_AUTHORITY.USER,
190
                 VIDEO_MUTISM_AUTHORITY.USER,
186
                 /* ensureTrack */ true));
191
                 /* ensureTrack */ true));
187
     }
192
     }
193
      * @returns {void}
198
      * @returns {void}
194
      */
199
      */
195
     _onToggleVideo() {
200
     _onToggleVideo() {
201
+        const mute = !this.props._videoMuted;
202
+
203
+        sendEvent(`toolbar.video.${mute ? 'muted' : 'unmuted'}`);
204
+
196
         // The user sees the reality i.e. the state of base/tracks and intends
205
         // The user sees the reality i.e. the state of base/tracks and intends
197
         // to change reality by tapping on the respective button i.e. the user
206
         // to change reality by tapping on the respective button i.e. the user
198
         // sets the state of base/media. Whether the user's intention will turn
207
         // sets the state of base/media. Whether the user's intention will turn

+ 11
- 1
react/features/video-quality/components/VideoQualityDialog.web.js Parādīt failu

3
 import React, { Component } from 'react';
3
 import React, { Component } from 'react';
4
 import { connect } from 'react-redux';
4
 import { connect } from 'react-redux';
5
 
5
 
6
+import { sendEvent } from '../../analytics';
6
 import {
7
 import {
7
     setAudioOnly,
8
     setAudioOnly,
8
     setReceiveVideoQuality,
9
     setReceiveVideoQuality,
10
 } from '../../base/conference';
11
 } from '../../base/conference';
11
 import { translate } from '../../base/i18n';
12
 import { translate } from '../../base/i18n';
12
 
13
 
14
+const logger = require('jitsi-meet-logger').getLogger(__filename);
15
+
13
 const {
16
 const {
14
     HIGH,
17
     HIGH,
15
     STANDARD,
18
     STANDARD,
211
      * @returns {void}
214
      * @returns {void}
212
      */
215
      */
213
     _enableAudioOnly() {
216
     _enableAudioOnly() {
217
+        sendEvent('toolbar.audioonly.enabled');
218
+        logger.log('Video quality: audio only enabled');
214
         this.props.dispatch(setAudioOnly(true));
219
         this.props.dispatch(setAudioOnly(true));
215
     }
220
     }
216
 
221
 
222
      * @returns {void}
227
      * @returns {void}
223
      */
228
      */
224
     _enableHighDefinition() {
229
     _enableHighDefinition() {
230
+        sendEvent('toolbar.videoquality.high');
231
+        logger.log('Video quality: high enabled');
225
         this.props.dispatch(setReceiveVideoQuality(HIGH));
232
         this.props.dispatch(setReceiveVideoQuality(HIGH));
226
     }
233
     }
227
 
234
 
233
      * @returns {void}
240
      * @returns {void}
234
      */
241
      */
235
     _enableLowDefinition() {
242
     _enableLowDefinition() {
243
+        sendEvent('toolbar.videoquality.low');
244
+        logger.log('Video quality: low enabled');
236
         this.props.dispatch(setReceiveVideoQuality(LOW));
245
         this.props.dispatch(setReceiveVideoQuality(LOW));
237
     }
246
     }
238
 
247
 
244
      * @returns {void}
253
      * @returns {void}
245
      */
254
      */
246
     _enableStandardDefinition() {
255
     _enableStandardDefinition() {
256
+        sendEvent('toolbar.videoquality.standard');
257
+        logger.log('Video quality: standard enabled');
247
         this.props.dispatch(setReceiveVideoQuality(STANDARD));
258
         this.props.dispatch(setReceiveVideoQuality(STANDARD));
248
     }
259
     }
249
 
260
 
324
 }
335
 }
325
 
336
 
326
 export default translate(connect(_mapStateToProps)(VideoQualityDialog));
337
 export default translate(connect(_mapStateToProps)(VideoQualityDialog));
327
-

Notiek ielāde…
Atcelt
Saglabāt