From cfdaceed223039a4d9a1d727610ae9b7f1ef1a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Thu, 7 May 2020 13:35:29 +0200 Subject: [PATCH] Add posibility to have separate media buttons, fixes #309 --- app/public/config/config.example.js | 19 +- app/src/actions/settingsActions.js | 5 + app/src/components/Containers/Me.js | 212 ++++---- app/src/components/Containers/Peer.js | 470 +++++++++--------- .../components/Controls/ButtonControlBar.js | 256 ++++++++++ app/src/components/MeetingViews/Democratic.js | 52 +- app/src/components/Room.js | 9 + .../components/Settings/AppearenceSettings.js | 11 + app/src/components/Settings/MediaSettings.js | 6 +- app/src/reducers/settings.js | 8 + app/src/translations/cn.json | 4 + app/src/translations/cs.json | 4 + app/src/translations/de.json | 4 + app/src/translations/dk.json | 4 + app/src/translations/el.json | 4 + app/src/translations/en.json | 4 + app/src/translations/es.json | 4 + app/src/translations/fr.json | 4 + app/src/translations/hr.json | 4 + app/src/translations/hu.json | 4 + app/src/translations/it.json | 4 + app/src/translations/lv.json | 4 + app/src/translations/nb.json | 4 + app/src/translations/pl.json | 4 + app/src/translations/pt.json | 4 + app/src/translations/ro.json | 4 + app/src/translations/tr.json | 4 + app/src/translations/uk.json | 4 + 28 files changed, 739 insertions(+), 381 deletions(-) create mode 100644 app/src/components/Controls/ButtonControlBar.js diff --git a/app/public/config/config.example.js b/app/public/config/config.example.js index b591c16..38334f3 100644 --- a/app/public/config/config.example.js +++ b/app/public/config/config.example.js @@ -52,18 +52,21 @@ var config = noiseSuppression : true, sampleSize : 16 }, - background : 'images/background.jpg', - defaultLayout : 'democratic', // democratic, filmstrip - lastN : 4, - mobileLastN : 1, + background : 'images/background.jpg', + defaultLayout : 'democratic', // democratic, filmstrip + // If true, will show media control buttons in separate + // control bar, not in the ME container. + buttonControlBar : false, + lastN : 4, + mobileLastN : 1, // Highest number of speakers user can select - maxLastN : 5, + maxLastN : 5, // If truthy, users can NOT change number of speakers visible - lockLastN : false, + lockLastN : false, // Add file and uncomment for adding logo to appbar // logo : 'images/logo.svg', - title : 'Multiparty meeting', - theme : + title : 'Multiparty meeting', + theme : { palette : { diff --git a/app/src/actions/settingsActions.js b/app/src/actions/settingsActions.js index 63c12bf..4b7dc6d 100644 --- a/app/src/actions/settingsActions.js +++ b/app/src/actions/settingsActions.js @@ -38,6 +38,11 @@ export const togglePermanentTopBar = () => type : 'TOGGLE_PERMANENT_TOPBAR' }); +export const toggleButtonControlBar = () => + ({ + type : 'TOGGLE_BUTTON_CONTROL_BAR' + }); + export const toggleShowNotifications = () => ({ type : 'TOGGLE_SHOW_NOTIFICATIONS' diff --git a/app/src/components/Containers/Me.js b/app/src/components/Containers/Me.js index f368089..8279a61 100644 --- a/app/src/components/Containers/Me.js +++ b/app/src/components/Containers/Me.js @@ -77,7 +77,29 @@ const styles = (theme) => { position : 'relative', width : '100%', - height : '100%' + height : '100%', + '& p' : + { + position : 'absolute', + float : 'left', + top : '50%', + left : '50%', + transform : 'translate(-50%, -50%)', + color : 'rgba(255, 255, 255, 0.5)', + fontSize : '7em', + zIndex : 30, + margin : 0, + opacity : 0, + transition : 'opacity 0.1s ease-in-out', + '&.hover' : + { + opacity : 1 + }, + '&.smallContainer' : + { + fontSize : '3em' + } + } }, controls : { @@ -100,27 +122,6 @@ const styles = (theme) => '&.hover' : { opacity : 1 - }, - '& p' : - { - position : 'absolute', - float : 'left', - top : '50%', - left : '50%', - transform : 'translate(-50%, -50%)', - color : 'rgba(255, 255, 255, 0.5)', - fontSize : '7em', - margin : 0, - opacity : 0, - transition : 'opacity 0.1s ease-in-out', - '&.hover' : - { - opacity : 1 - }, - '&.smallContainer' : - { - fontSize : '3em' - } } }, ptt : @@ -330,47 +331,46 @@ const Me = (props) => /> } -
setHover(true)} - onMouseOut={() => setHover(false)} - onTouchStart={() => - { - if (touchTimeout) - clearTimeout(touchTimeout); - - setHover(true); - }} - onTouchEnd={() => - { - if (touchTimeout) - clearTimeout(touchTimeout); - - touchTimeout = setTimeout(() => - { - setHover(false); - }, 2000); - }} > -

+

+ { !settings.buttonControlBar && +
- -

+ onMouseOver={() => setHover(true)} + onMouseOut={() => setHover(false)} + onTouchStart={() => + { + if (touchTimeout) + clearTimeout(touchTimeout); - - -
+ setHover(true); + }} + onTouchEnd={() => + { + if (touchTimeout) + clearTimeout(touchTimeout); + + touchTimeout = setTimeout(() => + { + setHover(false); + }, 2000); + }} + > + + { smallContainer ? } } -
-
- -
+ + { smallContainer ? } } -
-
- { me.browser.platform !== 'mobile' && - -
+ + { me.browser.platform !== 'mobile' && + { smallContainer ? } } -
-
- } -
-
+ + } + +
+ }

-
- { smallContainer ? - - { - roomClient.disableExtraVideo(producer.id); - }} - > - + { smallContainer ? + + { + roomClient.disableExtraVideo(producer.id); + }} + > + - - : - - { - roomClient.disableExtraVideo(producer.id); - }} - > - - - } -
+ + : + + { + roomClient.disableExtraVideo(producer.id); + }} + > + + + }
diff --git a/app/src/components/Containers/Peer.js b/app/src/components/Containers/Peer.js index 4fc495e..ab90a13 100644 --- a/app/src/components/Containers/Peer.js +++ b/app/src/components/Containers/Peer.js @@ -249,55 +249,53 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- { smallContainer ? - - { - micEnabled ? - roomClient.modifyPeerConsumer(peer.id, 'mic', true) : - roomClient.modifyPeerConsumer(peer.id, 'mic', false); - }} - > - { micEnabled ? - - : - - } - - : - - { - micEnabled ? - roomClient.modifyPeerConsumer(peer.id, 'mic', true) : - roomClient.modifyPeerConsumer(peer.id, 'mic', false); - }} - > - { micEnabled ? - - : - - } - - } -
+ { smallContainer ? + + { + micEnabled ? + roomClient.modifyPeerConsumer(peer.id, 'mic', true) : + roomClient.modifyPeerConsumer(peer.id, 'mic', false); + }} + > + { micEnabled ? + + : + + } + + : + + { + micEnabled ? + roomClient.modifyPeerConsumer(peer.id, 'mic', true) : + roomClient.modifyPeerConsumer(peer.id, 'mic', false); + }} + > + { micEnabled ? + + : + + } + + } { browser.platform !== 'mobile' && @@ -308,48 +306,46 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- { smallContainer ? - - { - toggleConsumerWindow(webcamConsumer); - }} - > - - - : - - { - toggleConsumerWindow(webcamConsumer); - }} - > - - - } -
+ { smallContainer ? + + { + toggleConsumerWindow(webcamConsumer); + }} + > + + + : + + { + toggleConsumerWindow(webcamConsumer); + }} + > + + + } } @@ -360,42 +356,40 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- { smallContainer ? - - { - toggleConsumerFullscreen(webcamConsumer); - }} - > - - - : - - { - toggleConsumerFullscreen(webcamConsumer); - }} - > - - - } -
+ { smallContainer ? + + { + toggleConsumerFullscreen(webcamConsumer); + }} + > + + + : + + { + toggleConsumerFullscreen(webcamConsumer); + }} + > + + + } @@ -507,48 +501,46 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- { smallContainer ? - - { - toggleConsumerWindow(consumer); - }} - > - - - : - - { - toggleConsumerWindow(consumer); - }} - > - - - } -
+ { smallContainer ? + + { + toggleConsumerWindow(consumer); + }} + > + + + : + + { + toggleConsumerWindow(consumer); + }} + > + + + } } @@ -559,42 +551,40 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- { smallContainer ? - - { - toggleConsumerFullscreen(consumer); - }} - > - - - : - - { - toggleConsumerFullscreen(consumer); - }} - > - - - } -
+ { smallContainer ? + + { + toggleConsumerFullscreen(consumer); + }} + > + + + : + + { + toggleConsumerFullscreen(consumer); + }} + > + + + } @@ -694,26 +684,24 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- - { - toggleConsumerWindow(screenConsumer); - }} - > - - -
+ + { + toggleConsumerWindow(screenConsumer); + }} + > + + } @@ -724,23 +712,21 @@ const Peer = (props) => })} placement={smallScreen ? 'top' : 'left'} > -
- - { - toggleConsumerFullscreen(screenConsumer); - }} - > - - -
+ + { + toggleConsumerFullscreen(screenConsumer); + }} + > + + + ({ + root : + { + position : 'fixed', + display : 'flex', + [theme.breakpoints.up('md')] : + { + top : '50%', + transform : 'translate(0%, -50%)', + flexDirection : 'column', + justifyContent : 'center', + alignItems : 'center', + left : theme.spacing(1) + }, + [theme.breakpoints.down('sm')] : + { + flexDirection : 'row', + bottom : theme.spacing(1), + left : '50%', + transform : 'translate(-50%, -0%)' + } + }, + fab : + { + margin : theme.spacing(1) + }, + show : + { + opacity : 1, + transition : 'opacity .5s' + }, + hide : + { + opacity : 0, + transition : 'opacity .5s' + } + }); + +const ButtonControlBar = (props) => +{ + const { + roomClient, + toolbarsVisible, + me, + micProducer, + webcamProducer, + screenProducer, + classes, + theme + } = props; + + let micState; + + let micTip; + + if (!me.canSendMic || !micProducer) + { + micState = 'unsupported'; + micTip = 'Audio unsupported'; + } + else if (!micProducer.locallyPaused && !micProducer.remotelyPaused) + { + micState = 'on'; + micTip = 'Mute audio'; + } + else + { + micState = 'off'; + micTip = 'Unmute audio'; + } + + let webcamState; + + let webcamTip; + + if (!me.canSendWebcam) + { + webcamState = 'unsupported'; + webcamTip = 'Video unsupported'; + } + else if (webcamProducer) + { + webcamState = 'on'; + webcamTip = 'Stop video'; + } + else + { + webcamState = 'off'; + webcamTip = 'Start video'; + } + + let screenState; + + let screenTip; + + if (!me.canShareScreen) + { + screenState = 'unsupported'; + screenTip = 'Screen sharing not supported'; + } + else if (screenProducer) + { + screenState = 'on'; + screenTip = 'Stop screen sharing'; + } + else + { + screenState = 'off'; + screenTip = 'Start screen sharing'; + } + + const smallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + return ( +
+ + + { + micState === 'on' ? + roomClient.muteMic() : + roomClient.unmuteMic(); + }} + > + { micState === 'on' ? + + : + + } + + + + + { + webcamState === 'on' ? + roomClient.disableWebcam() : + roomClient.enableWebcam(); + }} + > + { webcamState === 'on' ? + + : + + } + + + + + { + switch (screenState) + { + case 'on': + { + roomClient.disableScreenSharing(); + break; + } + case 'off': + { + roomClient.enableScreenSharing(); + break; + } + default: + { + break; + } + } + }} + > + { screenState === 'on' || screenState === 'unsupported' ? + + :null + } + { screenState === 'off' ? + + :null + } + + +
+ ); +}; + +ButtonControlBar.propTypes = +{ + roomClient : PropTypes.any.isRequired, + toolbarsVisible : PropTypes.bool.isRequired, + me : appPropTypes.Me.isRequired, + micProducer : appPropTypes.Producer, + webcamProducer : appPropTypes.Producer, + screenProducer : appPropTypes.Producer, + classes : PropTypes.object.isRequired, + theme : PropTypes.object.isRequired +}; + +const mapStateToProps = (state) => + ({ + toolbarsVisible : state.room.toolbarsVisible, + ...meProducersSelector(state), + me : state.me + }); + +export default withRoomContext(connect( + mapStateToProps, + null, + null, + { + areStatesEqual : (next, prev) => + { + return ( + prev.room.toolbarsVisible === next.room.toolbarsVisible && + prev.producers === next.producers && + prev.me === next.me + ); + } + } +)(withStyles(styles, { withTheme: true })(ButtonControlBar))); \ No newline at end of file diff --git a/app/src/components/MeetingViews/Democratic.js b/app/src/components/MeetingViews/Democratic.js index e2a703e..f2fff1a 100644 --- a/app/src/components/MeetingViews/Democratic.js +++ b/app/src/components/MeetingViews/Democratic.js @@ -11,10 +11,9 @@ import Peer from '../Containers/Peer'; import Me from '../Containers/Me'; const RATIO = 1.334; -const PADDING_V = 50; -const PADDING_H = 0; +const PADDING = 60; -const styles = () => +const styles = (theme) => ({ root : { @@ -36,6 +35,14 @@ const styles = () => { paddingTop : 60, transition : 'padding .5s' + }, + buttonControlBar : + { + paddingLeft : 60, + [theme.breakpoints.down('sm')] : + { + paddingLeft : 0 + } } }); @@ -66,9 +73,11 @@ class Democratic extends React.PureComponent return; } - const width = this.peersRef.current.clientWidth - PADDING_H; - const height = this.peersRef.current.clientHeight - - (this.props.toolbarsVisible || this.props.permanentTopBar ? PADDING_V : PADDING_H); + const width = + this.peersRef.current.clientWidth - (this.props.buttonControlBar ? PADDING : 0); + const height = + this.peersRef.current.clientHeight - + (this.props.toolbarsVisible || this.props.permanentTopBar ? PADDING : 0); let x, y, space; @@ -130,6 +139,7 @@ class Democratic extends React.PureComponent spotlightsPeers, toolbarsVisible, permanentTopBar, + buttonControlBar, classes } = this.props; @@ -144,7 +154,8 @@ class Democratic extends React.PureComponent className={classnames( classes.root, toolbarsVisible || permanentTopBar ? - classes.showingToolBar : classes.hiddenToolBar + classes.showingToolBar : classes.hiddenToolBar, + buttonControlBar ? classes.buttonControlBar : null )} ref={this.peersRef} > @@ -172,21 +183,23 @@ class Democratic extends React.PureComponent Democratic.propTypes = { - advancedMode : PropTypes.bool, - boxes : PropTypes.number, - spotlightsPeers : PropTypes.array.isRequired, - toolbarsVisible : PropTypes.bool.isRequired, - permanentTopBar : PropTypes.bool, - classes : PropTypes.object.isRequired + advancedMode : PropTypes.bool, + boxes : PropTypes.number, + spotlightsPeers : PropTypes.array.isRequired, + toolbarsVisible : PropTypes.bool.isRequired, + permanentTopBar : PropTypes.bool.isRequired, + buttonControlBar : PropTypes.bool.isRequired, + classes : PropTypes.object.isRequired }; const mapStateToProps = (state) => { return { - boxes : videoBoxesSelector(state), - spotlightsPeers : spotlightPeersSelector(state), - toolbarsVisible : state.room.toolbarsVisible, - permanentTopBar : state.settings.permanentTopBar + boxes : videoBoxesSelector(state), + spotlightsPeers : spotlightPeersSelector(state), + toolbarsVisible : state.room.toolbarsVisible, + permanentTopBar : state.settings.permanentTopBar, + buttonControlBar : state.settings.buttonControlBar }; }; @@ -203,8 +216,9 @@ export default connect( prev.consumers === next.consumers && prev.room.spotlights === next.room.spotlights && prev.room.toolbarsVisible === next.room.toolbarsVisible && - prev.settings.permanentTopBar === next.settings.permanentTopBar + prev.settings.permanentTopBar === next.settings.permanentTopBar && + prev.settings.buttonControlBar === next.settings.buttonControlBar ); } } -)(withStyles(styles)(Democratic)); +)(withStyles(styles, { withTheme: true })(Democratic)); diff --git a/app/src/components/Room.js b/app/src/components/Room.js index 7562ee4..c216f46 100644 --- a/app/src/components/Room.js +++ b/app/src/components/Room.js @@ -25,6 +25,7 @@ import Settings from './Settings/Settings'; import TopBar from './Controls/TopBar'; import WakeLock from 'react-wakelock-react16'; import ExtraVideo from './Controls/ExtraVideo'; +import ButtonControlBar from './Controls/ButtonControlBar'; const TIMEOUT = 5 * 1000; @@ -143,6 +144,7 @@ class Room extends React.PureComponent browser, advancedMode, showNotifications, + buttonControlBar, toolAreaOpen, toggleToolArea, classes, @@ -214,6 +216,10 @@ class Room extends React.PureComponent + { buttonControlBar && + + } + { room.lockDialogOpen && } @@ -236,6 +242,7 @@ Room.propTypes = browser : PropTypes.object.isRequired, advancedMode : PropTypes.bool.isRequired, showNotifications : PropTypes.bool.isRequired, + buttonControlBar : PropTypes.bool.isRequired, toolAreaOpen : PropTypes.bool.isRequired, setToolbarsVisible : PropTypes.func.isRequired, toggleToolArea : PropTypes.func.isRequired, @@ -249,6 +256,7 @@ const mapStateToProps = (state) => browser : state.me.browser, advancedMode : state.settings.advancedMode, showNotifications : state.settings.showNotifications, + buttonControlBar : state.settings.buttonControlBar, toolAreaOpen : state.toolarea.toolAreaOpen }); @@ -276,6 +284,7 @@ export default connect( prev.me.browser === next.me.browser && prev.settings.advancedMode === next.settings.advancedMode && prev.settings.showNotifications === next.settings.showNotifications && + prev.settings.buttonControlBar === next.settings.buttonControlBar && prev.toolarea.toolAreaOpen === next.toolarea.toolAreaOpen ); } diff --git a/app/src/components/Settings/AppearenceSettings.js b/app/src/components/Settings/AppearenceSettings.js index a34a5e1..a859ab4 100644 --- a/app/src/components/Settings/AppearenceSettings.js +++ b/app/src/components/Settings/AppearenceSettings.js @@ -30,6 +30,7 @@ const AppearenceSettings = ({ settings, onTogglePermanentTopBar, onToggleHiddenControls, + onToggleButtonControlBar, onToggleShowNotifications, handleChangeMode, classes @@ -102,6 +103,14 @@ const AppearenceSettings = ({ defaultMessage : 'Hidden media controls' })} /> + } + label={intl.formatMessage({ + id : 'settings.buttonControlBar', + defaultMessage : 'Separate media controls' + })} + /> } @@ -120,6 +129,7 @@ AppearenceSettings.propTypes = settings : PropTypes.object.isRequired, onTogglePermanentTopBar : PropTypes.func.isRequired, onToggleHiddenControls : PropTypes.func.isRequired, + onToggleButtonControlBar : PropTypes.func.isRequired, onToggleShowNotifications : PropTypes.func.isRequired, handleChangeMode : PropTypes.func.isRequired, classes : PropTypes.object.isRequired @@ -135,6 +145,7 @@ const mapDispatchToProps = { onTogglePermanentTopBar : settingsActions.togglePermanentTopBar, onToggleHiddenControls : settingsActions.toggleHiddenControls, onToggleShowNotifications : settingsActions.toggleShowNotifications, + onToggleButtonControlBar : settingsActions.toggleButtonControlBar, handleChangeMode : roomActions.setDisplayMode }; diff --git a/app/src/components/Settings/MediaSettings.js b/app/src/components/Settings/MediaSettings.js index d215181..28a69a2 100644 --- a/app/src/components/Settings/MediaSettings.js +++ b/app/src/components/Settings/MediaSettings.js @@ -265,7 +265,7 @@ const MediaSettings = ({ />} label={intl.formatMessage({ id : 'settings.echoCancellation', - defaultMessage : 'Echo Cancellation' + defaultMessage : 'Echo cancellation' })} /> } label={intl.formatMessage({ id : 'settings.autoGainControl', - defaultMessage : 'Auto Gain Control' + defaultMessage : 'Auto gain control' })} /> } label={intl.formatMessage({ id : 'settings.noiseSuppression', - defaultMessage : 'Noise Suppression' + defaultMessage : 'Noise suppression' })} /> diff --git a/app/src/reducers/settings.js b/app/src/reducers/settings.js index 7186fdc..f306726 100644 --- a/app/src/reducers/settings.js +++ b/app/src/reducers/settings.js @@ -18,6 +18,7 @@ const initialState = hiddenControls : false, showNotifications : true, notificationSounds : true, + buttonControlBar : window.config.buttonControlBar || false, ...window.config.defaultAudio }; @@ -145,6 +146,13 @@ const settings = (state = initialState, action) => return { ...state, permanentTopBar }; } + case 'TOGGLE_BUTTON_CONTROL_BAR': + { + const buttonControlBar = !state.buttonControlBar; + + return { ...state, buttonControlBar }; + } + case 'TOGGLE_HIDDEN_CONTROLS': { const hiddenControls = !state.hiddenControls; diff --git a/app/src/translations/cn.json b/app/src/translations/cn.json index 26724a4..7da15eb 100644 --- a/app/src/translations/cn.json +++ b/app/src/translations/cn.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "无法保存文件", "filesharing.startingFileShare": "正在尝试共享文件", diff --git a/app/src/translations/cs.json b/app/src/translations/cs.json index b80ab14..ee859d2 100644 --- a/app/src/translations/cs.json +++ b/app/src/translations/cs.json @@ -130,6 +130,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Není možné uložit soubor", "filesharing.startingFileShare": "Pokouším se sdílet soubor", diff --git a/app/src/translations/de.json b/app/src/translations/de.json index 3eabb28..428d104 100644 --- a/app/src/translations/de.json +++ b/app/src/translations/de.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Fehler beim Speichern der Datei", "filesharing.startingFileShare": "Starte Teilen der Datei", diff --git a/app/src/translations/dk.json b/app/src/translations/dk.json index cab3586..c74026f 100644 --- a/app/src/translations/dk.json +++ b/app/src/translations/dk.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Kan ikke gemme fil", "filesharing.startingFileShare": "Forsøger at dele filen", diff --git a/app/src/translations/el.json b/app/src/translations/el.json index 5a83427..10047cf 100644 --- a/app/src/translations/el.json +++ b/app/src/translations/el.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Αδυναμία αποθήκευσης του αρχείου", "filesharing.startingFileShare": "Προσπάθεια διαμοιρασμού αρχείου", diff --git a/app/src/translations/en.json b/app/src/translations/en.json index 2b40a30..475acd2 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -131,6 +131,10 @@ "settings.hiddenControls": "Hidden media controls", "settings.notificationSounds": "Notification sounds", "settings.showNotifications": "Show notifications", + "settings.buttonControlBar": "Separate media controls", + "settings.echoCancellation": "Echo cancellation", + "settings.autoGainControl": "Auto gain control", + "settings.noiseSuppression": "Noise suppression", "filesharing.saveFileError": "Unable to save file", "filesharing.startingFileShare": "Attempting to share file", diff --git a/app/src/translations/es.json b/app/src/translations/es.json index 63c2f7d..6c757cd 100644 --- a/app/src/translations/es.json +++ b/app/src/translations/es.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "No ha sido posible guardar el fichero", "filesharing.startingFileShare": "Intentando compartir el fichero", diff --git a/app/src/translations/fr.json b/app/src/translations/fr.json index 4471861..73493f5 100644 --- a/app/src/translations/fr.json +++ b/app/src/translations/fr.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Impossible d'enregistrer le fichier", "filesharing.startingFileShare": "Début du transfert de fichier", diff --git a/app/src/translations/hr.json b/app/src/translations/hr.json index 682dfbe..22db8fa 100644 --- a/app/src/translations/hr.json +++ b/app/src/translations/hr.json @@ -131,6 +131,10 @@ "settings.hiddenControls": "Skrivene kontrole medija", "settings.notificationSounds": "Zvuk obavijesti", "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Nije moguće spremiti datoteku", "filesharing.startingFileShare": "Pokušaj dijeljenja datoteke", diff --git a/app/src/translations/hu.json b/app/src/translations/hu.json index 262f117..8c68590 100644 --- a/app/src/translations/hu.json +++ b/app/src/translations/hu.json @@ -131,6 +131,10 @@ "settings.hiddenControls": "Média Gombok automatikus elrejtése", "settings.notificationSounds": "Értesítések hangjelzéssel", "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "A file-t nem sikerült elmenteni", "filesharing.startingFileShare": "Fájl megosztása", diff --git a/app/src/translations/it.json b/app/src/translations/it.json index 27b3194..ba849d9 100644 --- a/app/src/translations/it.json +++ b/app/src/translations/it.json @@ -130,6 +130,10 @@ "settings.hiddenControls": "Controlli media nascosti", "settings.notificationSounds": "Suoni di notifica", "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Impossibile salvare file", "filesharing.startingFileShare": "Tentativo di condivisione file", diff --git a/app/src/translations/lv.json b/app/src/translations/lv.json index d355c84..6d4e97b 100644 --- a/app/src/translations/lv.json +++ b/app/src/translations/lv.json @@ -125,6 +125,10 @@ "settings.hiddenControls": "Slēpto mediju vadība", "settings.notificationSounds": "Paziņojumu skaņas", "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Nav iespējams saglabāt failu", "filesharing.startingFileShare": "Tiek mēģināts kopīgot failu", diff --git a/app/src/translations/nb.json b/app/src/translations/nb.json index 59edd6c..ea9b0b8 100644 --- a/app/src/translations/nb.json +++ b/app/src/translations/nb.json @@ -131,6 +131,10 @@ "settings.hiddenControls": "Skjul media knapper", "settings.notificationSounds": "Varslingslyder", "settings.showNotifications": "Vis varslinger", + "settings.buttonControlBar": "Separate media knapper", + "settings.echoCancellation": "Echokansellering", + "settings.autoGainControl": "Auto gain kontroll", + "settings.noiseSuppression": "Støy reduksjon", "filesharing.saveFileError": "Klarte ikke å lagre fil", "filesharing.startingFileShare": "Starter fildeling", diff --git a/app/src/translations/pl.json b/app/src/translations/pl.json index 1413c73..859a29f 100644 --- a/app/src/translations/pl.json +++ b/app/src/translations/pl.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Nie można zapisać pliku", "filesharing.startingFileShare": "Próba udostępnienia pliku", diff --git a/app/src/translations/pt.json b/app/src/translations/pt.json index 3b0a078..7faed7c 100644 --- a/app/src/translations/pt.json +++ b/app/src/translations/pt.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Impossível de gravar o ficheiro", "filesharing.startingFileShare": "Tentando partilha de ficheiro", diff --git a/app/src/translations/ro.json b/app/src/translations/ro.json index e666ddf..3188e91 100644 --- a/app/src/translations/ro.json +++ b/app/src/translations/ro.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Încercarea de a salva fișierul a eșuat", "filesharing.startingFileShare": "Partajarea fișierului", diff --git a/app/src/translations/tr.json b/app/src/translations/tr.json index 16aaae0..aa6a8cb 100644 --- a/app/src/translations/tr.json +++ b/app/src/translations/tr.json @@ -128,6 +128,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Dosya kaydedilemiyor", "filesharing.startingFileShare": "Paylaşılan dosyaya erişiliyor", diff --git a/app/src/translations/uk.json b/app/src/translations/uk.json index fe9dd52..4932fc4 100644 --- a/app/src/translations/uk.json +++ b/app/src/translations/uk.json @@ -131,6 +131,10 @@ "settings.hiddenControls": null, "settings.notificationSounds": null, "settings.showNotifications": null, + "settings.buttonControlBar": null, + "settings.echoCancellation": null, + "settings.autoGainControl": null, + "settings.noiseSuppression": null, "filesharing.saveFileError": "Неможливо зберегти файл", "filesharing.startingFileShare": "Спроба поділитися файлом",