Ring overlay improvements and enable buttons fix

This commit is contained in:
yanas 2016-09-12 23:10:18 -05:00
parent c3b4ecbbd8
commit d250623fde
14 changed files with 108 additions and 66 deletions

View File

@ -14,7 +14,7 @@ OUTPUT_DIR = .
LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet/
IFRAME_API_DIR = ./modules/API/external
all: update-deps compile compile-iframe-api uglify uglify-iframe-api deploy clean
all: compile compile-iframe-api uglify uglify-iframe-api deploy clean
update-deps:
$(NPM) update

View File

@ -1,7 +1,7 @@
.toolbar {
background-color: rgba(0,0,0,0.5);
position: relative;
z-index: 900;
z-index: $toolbarZ;
height: 100%;
pointer-events: auto;
}
@ -13,7 +13,7 @@
top:0;
left:0;
right:0;
z-index:10;
z-index: $toolbarZ;
pointer-events: none;
min-height: 100px;
transform: translateY(-100%);
@ -76,6 +76,7 @@
#toolbar_button_hangup {
color: #BF2117;
font-size: $hangupFontSize !important;
}
#toolbar_button_etherpad {

View File

@ -3,6 +3,7 @@
*/
$baseFontFamily: 'open_sanslight', 'Helvetica Neue', Helvetica, Arial, sans-serif;
$toolbarFontSize: 1.9em;
$hangupFontSize: 2em;
/**
* Size variables.
@ -16,7 +17,7 @@ $defaultColor: #F1F1F1;
$defaultSemiDarkColor: #ACACAC;
$defaultDarkColor: #4F4F4F;
$defaultBackground: #474747;
$toolbarSelectBackground: rgba(0, 0, 0, 0.6);
$toolbarSelectBackground: rgba(0, 0, 0, .6);
$inputBackground: rgba(132, 132, 132, .5);
$inputSemiBackground: rgba(132, 132, 132, .8);
$inputLightBackground: #EBEBEB;
@ -28,4 +29,8 @@ $buttonBackground: #44A5FF;
*/
$borderRadius: 4px;
/**
* Z-indexes. TODO: Replace this by a function.
*/
$toolbarZ: 900;
$overlayZ: 800;

View File

@ -21,7 +21,7 @@
@import 'toastr';
@import 'base';
@import 'overlay';
@import 'overlay/overlay';
@import 'videolayout_default';
@import 'jquery-impromptu';
@import 'modaldialog';
@ -33,6 +33,7 @@
@import 'jitsi_popover';
@import 'contact_list';
@import 'chat';
@import 'ringing/ringing';
@import 'welcome_page';
@import 'toolbars';
@import 'side_toolbar_container';

View File

@ -1,11 +1,10 @@
.overlay {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 1013;
z-index: $overlayZ;
background: #21B9FC; /* Old browsers */
opacity: 0.75;
display: block;
@ -19,7 +18,7 @@
width: 100%;
height: 100%;
position: fixed;
z-index: 1013;
z-index: $overlayZ;
}
.overlay_content {
@ -36,23 +35,6 @@
margin-left: -200px;
}
.overlay_avatar {
width: 200px;
height: 200px;
position: relative;
border-radius: 100px;
z-index: 1013;
float: left;
margin-left: 100px;
}
.overlay_text {
position: relative;
width: 400px;
z-index: 1013;
margin-top: 50px;
float: left;
}
.overlay_text_small {
font-size: 18px;

View File

@ -120,7 +120,6 @@
</li>
</ul>
</span>
<a class="button icon-link" id="toolbar_button_link" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[content]toolbar.invite" content="Invite others"></a>
<a class="button icon-contactList" id="toolbar_contact_list" data-container="body" data-toggle="popover" data-placement="right" shortcut="contactlistpopover" data-i18n="[content]bottomtoolbar.contactlist" content="Open / close contact list">
<span id="numberOfParticipants"></span>
</a>
@ -138,6 +137,7 @@
<a class="button icon-telephone" id="toolbar_button_sip" data-container="body" data-toggle="popover" data-placement="right" content="Call SIP number" data-i18n="[content]toolbar.sip" style="display: none"></a>
<a class="button icon-dialpad" id="toolbar_button_dialpad" data-container="body" data-toggle="popover" data-placement="right" content="Open dialpad" data-i18n="[content]toolbar.dialpad" style="display: none"></a>
<a class="button icon-settings" id="toolbar_button_settings" data-container="body" data-toggle="popover" data-placement="right" content="Settings" data-i18n="[content]toolbar.Settings"></a>
<a class="button icon-full-screen" id="toolbar_button_fullScreen" data-container="body" data-toggle="popover" data-placement="right" shortcut="toggleFullscreenPopover" data-i18n="[content]toolbar.fullscreen" content="Enter / Exit Full Screen"></a>
<a class="button icon-toggle-filmstrip" id="toolbar_film_strip" data-container="body" data-toggle="popover" shortcut="filmstripPopover" data-placement="right" data-i18n="[content]toolbar.filmstrip" content="Show / hide videos"></a>
<a class="button icon-feedback" id="feedbackButton" data-container="body" data-toggle="popover" data-placement="right" data-i18n="[content]feedback"></a>
<div id="sideToolbarContainer">

View File

@ -2,6 +2,9 @@ var interfaceConfig = {
CANVAS_EXTRA: 104,
CANVAS_RADIUS: 0,
SHADOW_COLOR: '#ffffff',
// TO FIX: this needs to be handled from SASS variables. There are some
// methods allowing to use variables both in css and js.
DEFAULT_BACKGROUND: '#474747',
INITIAL_TOOLBAR_TIMEOUT: 20000,
TOOLBAR_TIMEOUT: 4000,
DEFAULT_REMOTE_DISPLAY_NAME: "Fellow Jitster",
@ -16,8 +19,8 @@ var interfaceConfig = {
INVITATION_POWERED_BY: true,
// the toolbar buttons line is intentionally left in one line, to be able
// to easily override values or remove them using regex
MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'fullscreen', 'hangup'], // jshint ignore:line
TOOLBAR_BUTTONS: ['authentication', 'microphone', 'camera', 'desktop', 'recording', 'security', 'invite', 'chat', 'etherpad', 'sharedvideo', 'fullscreen', 'sip', 'dialpad', 'settings', 'hangup', 'filmstrip', 'contacts'], // jshint ignore:line
MAIN_TOOLBAR_BUTTONS: ['microphone', 'camera', 'desktop', 'invite', 'hangup'], // jshint ignore:line
TOOLBAR_BUTTONS: ['profile', 'authentication', 'microphone', 'camera', 'desktop', 'recording', 'security', 'invite', 'chat', 'etherpad', 'sharedvideo', 'fullscreen', 'sip', 'dialpad', 'settings', 'hangup', 'filmstrip', 'contacts'], // jshint ignore:line
// Determines how the video would fit the screen. 'both' would fit the whole
// screen, 'height' would fit the original video height to the height of the
// screen, 'width' would fit the original video width to the width of the
@ -30,4 +33,4 @@ var interfaceConfig = {
RANDOM_AVATAR_URL_PREFIX: false,
RANDOM_AVATAR_URL_SUFFIX: false,
FILM_STRIP_MAX_HEIGHT: 120
};
};

View File

@ -11,7 +11,7 @@
"raisedHand": "Would like to speak",
"defaultNickname": "ex. Jane Pink",
"defaultLink": "e.g. __url__",
"calling": "Calling __name__ ...",
"callingName": "__name__",
"userMedia": {
"react-nativeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",
"chromeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing <b><i>Allow</i></b> button",

View File

@ -1499,6 +1499,15 @@ UI.hideRingOverLay = function () {
FilmStrip.toggleFilmStrip(true);
};
/**
* Indicates if the ring overlay is currently visible.
*
* @returns {*|boolean} {true} if the ring overlay is visible, {false} otherwise
*/
UI.isRingOverlayVisible = function () {
return RingOverlay.isVisible();
};
/**
* Shows browser-specific overlay with guidance how to proceed with gUM prompt.
* @param {string} browser - name of browser for which to show the guidance

View File

@ -1,4 +1,5 @@
/* global $ */
/* jshint -W101 */
/**
* Shows ring overlay
@ -8,35 +9,39 @@ class RingOverlay {
* @param callee instance of User class from TokenData.js
*/
constructor(callee) {
this._containerId = 'ringOverlay';
this._audioContainerId = 'ringOverlayRinging';
this.callee = callee;
this._buildHtml();
this.audio = $("#ring_overlay_ringing");
this.audio[0].play();
this.render();
this.audio = document.getElementById(this._audioContainerId);
this.audio.play();
this._setAudioTimeout();
}
/**
* Builds and appends the ring overlay to the html document
*/
_buildHtml() {
$("body").append("<div class='overlay_container' >" +
"<div class='overlay' /><div class='overlay_content'>" +
"<img class='overlay_avatar' src='" +
this.callee.getAvatarUrl() + "' />" +
"<span data-i18n='calling' data-i18n-options='" +
JSON.stringify({name: this.callee.getName()}) +
"' class='overlay_text'>Calling " +
this.callee.getName() + "...</span></div>" +
"<audio id='ring_overlay_ringing' src='/sounds/ring.ogg' /></div>");
_getHtmlStr(callee) {
return `
<div id="${this._containerId}" class='ringing' >
<div class='ringing__content'>
<p>Calling...</p>
<img class='ringing__avatar' src="${callee.getAvatarUrl()}" />
<div class="ringing__caller-info">
<p>${callee.getName()}</p>
</div>
</div>
<audio id="${this._audioContainerId}" src="/sounds/ring.ogg" />
</div>`;
}
/**
* Sets the interval that is going to play the ringing sound.
*
*/
_setAudioTimeout() {
this.interval = setInterval( () => {
this.audio[0].play();
}, 5000);
render() {
this.htmlStr = this._getHtmlStr(this.callee);
this._attach();
}
/**
@ -44,9 +49,28 @@ class RingOverlay {
* related to the ring overlay.
*/
destroy() {
if(this.interval)
if (this.interval) {
clearInterval(this.interval);
$(".overlay_container").remove();
}
this._detach();
}
_attach() {
$("body").append(this.htmlStr);
}
_detach() {
$(`#${this._containerId}`).remove();
}
/**
* Sets the interval that is going to play the ringing sound.
*/
_setAudioTimeout() {
this.interval = setInterval( () => {
this.audio.play();
}, 5000);
}
}
@ -66,26 +90,30 @@ export default {
if(overlay) {
this.hide();
}
overlay = new RingOverlay(callee);
},
/**
* Hides the ring overlay. Destroys all the elements related to the ring
* overlay.
*/
hide() {
if(!overlay)
if(!overlay) {
return false;
}
overlay.destroy();
overlay = null;
return true;
},
/**
* Checks whether or not the ring overlay is currently displayed.
*
* @returns {boolean} true if the ring overlay is currently displayed or
* false otherwise.
*/
isDisplayed () {
isVisible () {
return overlay !== null;
}
};

View File

@ -214,22 +214,25 @@ const defaultToolbarButtons = {
},
'desktop': {
id: 'toolbar_button_desktopsharing',
className: "button icon-share-desktop",
className: 'button icon-share-desktop',
shortcut: 'D',
shortcutAttr: 'toggleDesktopSharingPopover',
shortcutFunc: function() {
JitsiMeetJS.analytics.sendEvent('shortcut.screen.toggled');
APP.conference.toggleScreenSharing();
},
shortcutDescription: "keyboardShortcuts.toggleScreensharing",
content: "Share screen",
i18n: "[content]toolbar.sharescreen"
shortcutDescription: 'keyboardShortcuts.toggleScreensharing',
content: 'Share screen',
i18n: '[content]toolbar.sharescreen'
},
'security': {
id: 'toolbar_button_security'
},
'invite': {
id: 'toolbar_button_link'
id: 'toolbar_button_link',
className: 'button icon-link',
content: 'Invite others',
i18n: '[content]toolbar.invite'
},
'chat': {
id: 'toolbar_button_chat',
@ -239,16 +242,16 @@ const defaultToolbarButtons = {
JitsiMeetJS.analytics.sendEvent('shortcut.chat.toggled');
APP.UI.toggleChat();
},
shortcutDescription: "keyboardShortcuts.toggleChat",
sideContainerId: "chat_container"
shortcutDescription: 'keyboardShortcuts.toggleChat',
sideContainerId: 'chat_container'
},
'contacts': {
id: 'toolbar_contact_list',
sideContainerId: "contacts_container"
sideContainerId: 'contacts_container'
},
'profile': {
id: 'toolbar_button_profile',
sideContainerId: "profile_container"
sideContainerId: 'profile_container'
},
'etherpad': {
id: 'toolbar_button_etherpad'
@ -695,6 +698,15 @@ const Toolbar = {
});
},
/**
* Adds the given button to the main (top) toolbar.
*
* @param {Object} the button to add.
* @param {boolean} isFirst indicates if this is the first button in the
* toolbar
* @param {boolean} isLast indicates if this is the last button in the
* toolbar
*/
_addMainToolbarButton(button, isFirst, isLast) {
let buttonElement = document.createElement("a");
if (button.className)

View File

@ -35,7 +35,7 @@ function hideToolbar(force) {
clearTimeout(toolbarTimeoutObject);
toolbarTimeoutObject = null;
if (Toolbar.isHovered()) {
if (Toolbar.isHovered() || APP.UI.isRingOverlayVisible()) {
toolbarTimeoutObject = setTimeout(hideToolbar, toolbarTimeout);
} else if (!SideContainerToggler.isVisible() || force) {
Toolbar.hide();

View File

@ -258,7 +258,8 @@ var messageHandler = {
notify: function(displayName, displayNameKey, cls, messageKey,
messageArguments, options) {
if(!notificationsEnabled)
// If we're in ringing state we skip all toaster notifications.
if(!notificationsEnabled || APP.UI.isRingOverlayVisible())
return;
var displayNameSpan = '<span class="nickname" ';

View File

@ -112,7 +112,7 @@
var selector = Object.keys(mappings)
.map(function (buttonName) {
return UIUtil.isButtonEnabled(buttonName)
? null : mappings[buttonName].id; })
? null : "#" + mappings[buttonName].id; })
.filter(function (item) { return item; })
.join(',');
$(selector).hide();
@ -120,7 +120,7 @@
redirect (url) {
window.location.href = url;
},
},
isFullScreen () {
return document.fullScreen