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": "Спроба поділитися файлом",