Merge remote-tracking branch 'upstream/v2.0.x-release' into audio-refactor

This commit is contained in:
gcampes 2017-10-18 17:42:49 -02:00
commit b15322e7f2
95 changed files with 890 additions and 482 deletions

View File

@ -29,6 +29,7 @@ trait UserConnectedToGlobalAudioMsgHdlr {
for {
user <- Users2x.findWithIntId(liveMeeting.users2x, msg.body.userId)
} yield {
val vu = VoiceUserState(intId = user.intId, voiceUserId = user.intId, callingWith = "flash", callerName = user.name,
callerNum = user.name, muted = true, talking = false, listenOnly = true)
VoiceUsers.add(liveMeeting.voiceUsers, vu)

View File

@ -41,8 +41,9 @@ trait UserJoinedVoiceConfEvtMsgHdlr extends BreakoutHdlrHelpers {
outGW.send(msgEvent)
}
val voiceUserState = VoiceUserState(intId, voiceUserId, callingWith, callerIdName, callerIdNum, muted, talking, listenOnly = false)
val isListenOnly = if (callerIdName.startsWith("LISTENONLY")) true else false
val voiceUserState = VoiceUserState(intId, voiceUserId, callingWith, callerIdName, callerIdNum, muted, talking, listenOnly = isListenOnly)
VoiceUsers.add(liveMeeting.voiceUsers, voiceUserState)
broadcastEvent(voiceUserState)

View File

@ -37,7 +37,6 @@ object VoiceUsers {
} yield {
val vu = u.modify(_.muted).setTo(muted)
.modify(_.talking).setTo(false)
.modify(_.listenOnly).setTo(false)
users.save(vu)
vu
}
@ -49,7 +48,6 @@ object VoiceUsers {
} yield {
val vu = u.modify(_.muted).setTo(false)
.modify(_.talking).setTo(talkng)
.modify(_.listenOnly).setTo(false)
users.save(vu)
vu
}
@ -61,7 +59,6 @@ object VoiceUsers {
} yield {
val vu = u.modify(_.muted).setTo(true)
.modify(_.talking).setTo(false)
.modify(_.listenOnly).setTo(true)
users.save(vu)
vu
}
@ -73,7 +70,6 @@ object VoiceUsers {
} yield {
val vu = u.modify(_.muted).setTo(false)
.modify(_.talking).setTo(false)
.modify(_.listenOnly).setTo(false)
users.save(vu)
vu
}

View File

@ -143,7 +143,7 @@ phonecomponents|MuteMeButton {
.toolbarMainBox {
backgroundColor : #FFFFFF;
paddingTop : 6;
paddingTop : 0;
paddingBottom : 6;
}
@ -156,7 +156,7 @@ phonecomponents|MuteMeButton {
}
.topBoxStyle {
paddingTop : 0;
paddingTop : 6;
paddingBottom : 0;
paddingLeft : 8;
paddingRight : 8;
@ -429,7 +429,7 @@ mx|Button {
borderAlphaUp : 1;
borderAlphaOver : 1;
borderAlphaDown : 1;
borderAlphaDisabled : 1;
borderAlphaDisabled : 0.25;
borderThickness : 1;
@ -546,6 +546,10 @@ views|BrowserPermissionHelper {
//------------------------------
*/
views|ClientStatusWindow {
horizontalAlign : right;
}
views|ClientStatusItemRenderer {
iconSuccess : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Success");
iconWarning : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Warning");
@ -636,7 +640,7 @@ chat|AddChatTabBox {
}
.chatOptionsLabel {
fontSize : 14;
fontSize : 14;
}
.chatMessageListStyle {
@ -911,6 +915,7 @@ views|LockSettings {
*/
views|MainApplicationShell {
borderStyle : none;
paddingBottom : 0;
verticalGap : 0;
}
@ -1063,6 +1068,35 @@ views|NetworkStatsWindow {
iconRefresh : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Refresh");
}
/*
//------------------------------
// NumericStepper
//------------------------------
*/
mx|NumericStepper {
/* Normal state */
fillColorUp : #FFFFFF;
fillColorOver : #CDD4DB;
fillColorDown : #ACB2B7;
fillColorDisabled : #F0F2F6;
borderColorUp : #CDD4DB;
borderColorOver : #1070D7;
borderColorDown : #0A5EAC;
borderColorDisabled : #CDD4DB;
/* Icon states */
iconColor : #4E5A66;
iconColorOver : #1070D7;
iconColorDown : #4E5A66;
borderThickness : 1;
/* Skins */
downArrowSkin : ClassReference("org.bigbluebutton.skins.NumericStepperDownSkin");
upArrowSkin : ClassReference("org.bigbluebutton.skins.NumericStepperUpSkin");
}
/*
//------------------------------
// PopUpButton
@ -1581,6 +1615,9 @@ users|StatusItemRenderer {
iconMoodThumbsUp : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsUp");
iconMoodThumbsDown : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_ThumbsDown");
iconMoodApplause : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Applause");
verticalAlign : middle;
horizontalAlign : center;
horizontalGap : 2;
}
users|MediaItemRenderer {
@ -1596,7 +1633,7 @@ users|MediaItemRenderer {
iconEject : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Eject");
glowFilterColor : #1070D7;
verticalAlign : middle;
horizontalGap : 8;
horizontalGap : 2;
horizontalAlign : center;
}

View File

@ -22,24 +22,6 @@ package org.bigbluebutton.skins {
public class ButtonSkin extends Border {
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function ButtonSkin() {
super();
}
//--------------------------------------------------------------------------
//
// Overridden properties

View File

@ -0,0 +1,166 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package org.bigbluebutton.skins {
import flash.display.Graphics;
import mx.skins.Border;
public class NumericStepperDownSkin extends Border {
//--------------------------------------------------------------------------
//
// Overridden properties
//
//--------------------------------------------------------------------------
//----------------------------------
// measuredWidth
//----------------------------------
/**
* @private
*/
override public function get measuredWidth():Number {
return 19;
}
//----------------------------------
// measuredHeight
//----------------------------------
/**
* @private
*/
override public function get measuredHeight():Number {
return 11;
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
override protected function updateDisplayList(w:Number, h:Number):void {
super.updateDisplayList(w, h);
var borderColorUp:uint = getStyle("borderColorUp");
var borderColorOver:uint = getStyle("borderColorOver");
var borderColorDown:uint = getStyle("borderColorDown");
var borderColorDisabled:uint = getStyle("borderColorDisabled");
var borderThickness:uint = getStyle("borderThickness");
var fillColorUp:uint = getStyle("fillColorUp");
var fillColorOver:uint = getStyle("fillColorOver");
var fillColorDown:uint = getStyle("fillColorDown");
var fillColorDisabled:uint = getStyle("fillColorDisabled");
// User-defined styles.
var arrowColor:uint = getStyle("iconColor");
var arrowColorOver:uint = getStyle("iconColorOver");
var arrowColorDown:uint = getStyle("iconColorDown");
var cornerRadius:Number = getStyle("cornerRadius");
var cr:Object = {tl: 0, tr: 0, bl: 0, br: cornerRadius};
var cr1:Object = {tl: 0, tr: 0, bl: 0, br: Math.max(cornerRadius - 1, 0)};
// Draw the background and border.
var g:Graphics = graphics;
g.clear();
switch (name) {
case "downArrowUpSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorUp, 1, null, null, null, {x: 1, y: 0, w: w - 2, h: h - 1, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1);
break;
}
case "downArrowOverSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorOver, 1, null, null, null, {x: 1, y: 0, w: w - 2, h: h - 1, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1, null);
break;
}
case "downArrowDownSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorDown, 1);
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1);
break;
}
case "downArrowDisabledSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorDisabled, 0.5, null, null, null, {x: 1, y: 0, w: w - 2, h: h - 1, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 0.5, null);
arrowColor = getStyle("disabledIconColor");
break;
}
}
// Draw the arrow.
g.beginFill(arrowColor);
g.moveTo(w / 2, h / 2 + 1.5);
g.lineTo(w / 2 - 3.5, h / 2 - 2.5);
g.lineTo(w / 2 + 3.5, h / 2 - 2.5);
g.lineTo(w / 2, h / 2 + 1.5);
g.endFill();
}
}
}

View File

@ -0,0 +1,165 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package org.bigbluebutton.skins {
import flash.display.Graphics;
import mx.skins.Border;
public class NumericStepperUpSkin extends Border {
//--------------------------------------------------------------------------
//
// Overridden properties
//
//--------------------------------------------------------------------------
//----------------------------------
// measuredWidth
//----------------------------------
/**
* @private
*/
override public function get measuredWidth():Number {
return 19;
}
//----------------------------------
// measuredHeight
//----------------------------------
/**
* @private
*/
override public function get measuredHeight():Number {
return 11;
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
override protected function updateDisplayList(w:Number, h:Number):void {
super.updateDisplayList(w, h);
var borderColorUp:uint = getStyle("borderColorUp");
var borderColorOver:uint = getStyle("borderColorOver");
var borderColorDown:uint = getStyle("borderColorDown");
var borderColorDisabled:uint = getStyle("borderColorDisabled");
var borderThickness:uint = getStyle("borderThickness");
var fillColorUp:uint = getStyle("fillColorUp");
var fillColorOver:uint = getStyle("fillColorOver");
var fillColorDown:uint = getStyle("fillColorDown");
var fillColorDisabled:uint = getStyle("fillColorDisabled");
// User-defined styles.
var arrowColor:uint = getStyle("iconColor");
var arrowColorOver:uint = getStyle("iconColorOver");
var arrowColorDown:uint = getStyle("iconColorDown");
var cornerRadius:Number = getStyle("cornerRadius");
var cr:Object = {tl: 0, tr: cornerRadius, bl: 0, br: 0};
var cr1:Object = {tl: 0, tr: Math.max(cornerRadius - 1, 0), bl: 0, br: 0};
// Draw the background and border.
var g:Graphics = graphics;
g.clear();
switch (name) {
case "upArrowUpSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorUp, 1, null, null, null, {x: 1, y: 1, w: w - 2, h: h - 2, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1);
break;
}
case "upArrowOverSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorOver, 1, null, null, null, {x: 1, y: 1, w: w - 2, h: h - 2, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1, null);
break;
}
case "upArrowDownSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorDown, 1);
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1);
break;
}
case "upArrowDisabledSkin": {
// border
drawRoundRect(0, 0, w, h, cr, borderColorDisabled, 0.5, null, null, null, {x: 1, y: 1, w: w - 2, h: h - 2, r: cr1});
// button fill
drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 0.5, null);
arrowColor = getStyle("disabledIconColor");
break;
}
}
// Draw the arrow.
g.beginFill(arrowColor);
g.moveTo(w / 2, h / 2 - 2.5);
g.lineTo(w / 2 - 3.5, h / 2 + 1.5);
g.lineTo(w / 2 + 3.5, h / 2 + 1.5);
g.lineTo(w / 2, h / 2 - 2.5);
g.endFill();
}
}
}

View File

@ -48,17 +48,6 @@ package org.bigbluebutton.skins {
public class TabSkin extends Border {
//--------------------------------------------------------------------------
//
// Class variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static var cache:Object = {};
//--------------------------------------------------------------------------
//
// Overridden properties

View File

@ -246,7 +246,7 @@ bbb.presentation.fitToWidth.toolTip = Fit Presentation To Width
bbb.presentation.fitToPage.toolTip = Fit Presentation To Page
bbb.presentation.uploadPresBtn.toolTip = Upload Presentation
bbb.presentation.downloadPresBtn.toolTip = Download Presentations
bbb.presentation.poll.response = Response to poll
bbb.presentation.poll.response = Respond to poll
bbb.presentation.backBtn.toolTip = Previous slide
bbb.presentation.btnSlideNum.accessibilityName = Slide {0} of {1}
bbb.presentation.btnSlideNum.toolTip = Select a slide
@ -369,6 +369,7 @@ bbb.video.publish.closeBtn.accessName = Close the webcam settings dialog box
bbb.video.publish.closeBtn.label = Cancel
bbb.video.publish.titleBar = Publish Webcam Window
bbb.video.streamClose.toolTip = Close stream for: {0}
bbb.video.message.browserhttp = This server is not configured with SSL. As a result, {0} disables sharing of your webcam.
bbb.screensharePublish.title = Screen Sharing: Presenter's Preview
bbb.screensharePublish.pause.tooltip = Pause screen share
bbb.screensharePublish.pause.label = Pause
@ -448,6 +449,7 @@ bbb.toolbar.deskshare.toolTip.stop = Stop Sharing Your Screen
bbb.toolbar.sharednotes.toolTip = Open Shared Notes
bbb.toolbar.video.toolTip.start = Share Your Webcam
bbb.toolbar.video.toolTip.stop = Stop Sharing Your Webcam
bbb.layout.addButton.label = Add
bbb.layout.addButton.toolTip = Add the custom layout to the list
bbb.layout.overwriteLayoutName.title = Overwrite layout
bbb.layout.overwriteLayoutName.text = Name already in use. Do you want to overwrite?
@ -461,6 +463,8 @@ bbb.layout.combo.custom = * Custom layout
bbb.layout.combo.customName = Custom layout
bbb.layout.combo.remote = Remote
bbb.layout.window.name = Layout name
bbb.layout.window.close.tooltip = Close
bbb.layout.window.close.accessibilityName = Close add new layout window
bbb.layout.save.complete = Layouts were successfully saved
bbb.layout.save.ioerror = Layouts were not saved. Try saving again.
bbb.layout.load.complete = Layouts were successfully loaded
@ -856,54 +860,3 @@ bbb.users.roomsGrid.join = Join
bbb.users.roomsGrid.noUsers = No users is this room
bbb.langSelector.default=Default language
bbb.langSelector.ar=Arabic
bbb.langSelector.az_AZ=Azerbaijani
bbb.langSelector.eu_EU=Basque
bbb.langSelector.bn_BN=Bengali
bbb.langSelector.bg_BG=Bulgarian
bbb.langSelector.ca_ES=Catalan
bbb.langSelector.zh_CN=Chinese (Simplified)
bbb.langSelector.zh_TW=Chinese (Traditional)
bbb.langSelector.hr_HR=Croatian
bbb.langSelector.cs_CZ=Czech
bbb.langSelector.da_DK=Danish
bbb.langSelector.nl_NL=Dutch
bbb.langSelector.en_US=English
bbb.langSelector.et_EE=Estonian
bbb.langSelector.fa_IR=Farsi
bbb.langSelector.fi_FI=Finnish
bbb.langSelector.fr_FR=French
bbb.langSelector.fr_CA=French (Canadian)
bbb.langSelector.ff_SN=Fulah
bbb.langSelector.de_DE=German
bbb.langSelector.el_GR=Greek
bbb.langSelector.he_IL=Hebrew
bbb.langSelector.hu_HU=Hungarian
bbb.langSelector.id_ID=Indonesian
bbb.langSelector.it_IT=Italian
bbb.langSelector.ja_JP=Japanese
bbb.langSelector.ko_KR=Korean
bbb.langSelector.lv_LV=Latvian
bbb.langSelector.lt_LT=Lithuania
bbb.langSelector.mn_MN=Mongolian
bbb.langSelector.ne_NE=Nepali
bbb.langSelector.no_NO=Norwegian
bbb.langSelector.pl_PL=Polish
bbb.langSelector.pt_BR=Portuguese (Brazilian)
bbb.langSelector.pt_PT=Portuguese
bbb.langSelector.ro_RO=Romanian
bbb.langSelector.ru_RU=Russian
bbb.langSelector.sr_SR=Serbian (Cyrillic)
bbb.langSelector.sr_RS=Serbian (Latin)
bbb.langSelector.si_LK=Sinhala
bbb.langSelector.sk_SK=Slovak
bbb.langSelector.sl_SL=Slovenian
bbb.langSelector.es_ES=Spanish
bbb.langSelector.es_LA=Spanish (Latin American)
bbb.langSelector.sv_SE=Swedish
bbb.langSelector.th_TH=Thai
bbb.langSelector.tr_TR=Turkish
bbb.langSelector.uk_UA=Ukrainian
bbb.langSelector.vi_VN=Vietnamese
bbb.langSelector.cy_GB=Welsh
bbb.langSelector.oc=Occitan

View File

@ -97,11 +97,9 @@ function determineBrowser()
var nameOffset,verOffset,ix;
// In Opera, the true version is after "Opera" or after "Version"
if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
if ((verOffset=nAgt.indexOf("OPR/"))!=-1) {
browserName = "Opera";
fullVersion = nAgt.substring(verOffset+6);
if ((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion = nAgt.substring(verOffset+8);
fullVersion = nAgt.substring(verOffset+4);
}
// In MSIE, the true version is after "MSIE" in userAgent
else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {

View File

@ -1,54 +1,54 @@
<?xml version="1.0" ?>
<locales>
<locale code="ar" name="Arabic" direction="rtl"/>
<locale code="az_AZ" name="Azerbaijani"/>
<locale code="eu_EU" name="Basque" />
<locale code="bn_BN" name="Bengali" />
<locale code="bg_BG" name="Bulgarian" />
<locale code="ca_ES" name="Catalan" />
<locale code="zh_CN" name="Chinese (Simplified)"/>
<locale code="zh_TW" name="Chinese (Traditional)"/>
<locale code="hr_HR" name="Croatian" />
<locale code="cs_CZ" name="Czech" />
<locale code="da_DK" name="Danish" />
<locale code="nl_NL" name="Dutch" />
<locale code="en_US" name="English"/>
<locale code="et_EE" name="Estonian"/>
<locale code="fa_IR" name="Farsi" />
<locale code="fi_FI" name="Finnish"/>
<locale code="fr_FR" name="French"/>
<locale code="fr_CA" name="French (Canadian)"/>
<locale code="ff_SN" name="Fulah"/>
<locale code="de_DE" name="German"/>
<locale code="el_GR" name="Greek"/>
<locale code="he_IL" name="Hebrew" direction="rtl"/>
<locale code="hu_HU" name="Hungarian"/>
<locale code="id_ID" name="Indonesian"/>
<locale code="it_IT" name="Italian"/>
<locale code="ja_JP" name="Japanese"/>
<locale code="ko_KR" name="Korean"/>
<locale code="lv_LV" name="Latvian"/>
<locale code="lt_LT" name="Lithuania"/>
<locale code="mn_MN" name="Mongolian"/>
<locale code="ne_NE" name="Nepali"/>
<locale code="no_NO" name="Norwegian"/>
<locale code="oc" name="Occitan"/>
<locale code="pl_PL" name="Polish"/>
<locale code="pt_BR" name="Portuguese (Brazilian)"/>
<locale code="pt_PT" name="Portuguese"/>
<locale code="ro_RO" name="Romanian"/>
<locale code="ru_RU" name="Russian"/>
<locale code="sr_SR" name="Serbian (Cyrillic)"/>
<locale code="sr_RS" name="Serbian (Latin)"/>
<locale code="si_LK" name="Sinhala"/>
<locale code="sk_SK" name="Slovak"/>
<locale code="sl_SL" name="Slovenian"/>
<locale code="es_ES" name="Spanish"/>
<locale code="es_LA" name="Spanish (Latin American)"/>
<locale code="sv_SE" name="Swedish"/>
<locale code="th_TH" name="Thai"/>
<locale code="tr_TR" name="Turkish"/>
<locale code="uk_UA" name="Ukrainian"/>
<locale code="vi_VN" name="Vietnamese"/>
<locale code="cy_GB" name="Welsh"/>
<locale code="ar" name="Arabic" native="العربيّة" direction="rtl"/>
<locale code="az_AZ" name="Azerbaijani" native="Azərbaycan"/>
<locale code="eu_EU" name="Basque" native="Euskara"/>
<locale code="bn_BN" name="Bengali" native="বাংলা (baɛṅlā)"/>
<locale code="bg_BG" name="Bulgarian" native="Български"/>
<locale code="ca_ES" name="Catalan" native="Català"/>
<locale code="zh_CN" name="Chinese (Simplified)" native="中文(简体)"/>
<locale code="zh_TW" name="Chinese (Traditional)" native="中文(繁體)"/>
<locale code="hr_HR" name="Croatian" native="Hrvatski"/>
<locale code="cs_CZ" name="Czech" native="Čeština"/>
<locale code="da_DK" name="Danish" native="Dansk"/>
<locale code="nl_NL" name="Dutch" native="Nederlands"/>
<locale code="en_US" name="English" native="English"/>
<locale code="et_EE" name="Estonian" native="Eesti"/>
<locale code="fa_IR" name="Farsi" native="فارسى"/>
<locale code="fi_FI" name="Finnish" native="Suomi"/>
<locale code="fr_FR" name="French" native="Français"/>
<locale code="fr_CA" name="French (Canadian)" native="Français (Canadien)"/>
<locale code="ff_SN" name="Fula" native="Fulfulde"/>
<locale code="de_DE" name="German" native="Deutsch"/>
<locale code="el_GR" name="Greek" native="Ελληνικά"/>
<locale code="he_IL" name="Hebrew" native="עִבְרִית" direction="rtl"/>
<locale code="hu_HU" name="Hungarian" native="Magyar"/>
<locale code="id_ID" name="Indonesian" native="Indonesia"/>
<locale code="it_IT" name="Italian" native="Italiano"/>
<locale code="ja_JP" name="Japanese" native="日本語"/>
<locale code="ko_KR" name="Korean" native="한국어"/>
<locale code="lv_LV" name="Latvian" native="Latviešu"/>
<locale code="lt_LT" name="Lithuania" native="Lietuvių"/>
<locale code="mn_MN" name="Mongolian" native="Монгол"/>
<locale code="ne_NE" name="Nepali" native="नेपाली"/>
<locale code="no_NO" name="Norwegian" native="Norsk"/>
<locale code="oc" name="Occitan" native="Occitan"/>
<locale code="pl_PL" name="Polish" native="Polski"/>
<locale code="pt_BR" name="Portuguese (Brazilian)" native="Português (Brasileiro)"/>
<locale code="pt_PT" name="Portuguese" native="Português"/>
<locale code="ro_RO" name="Romanian" native="Român"/>
<locale code="ru_RU" name="Russian" native="Русский"/>
<locale code="sr_SR" name="Serbian (Cyrillic)" native="Српски (ћирилица)"/>
<locale code="sr_RS" name="Serbian (Latin)" native="Srpski (latinica)"/>
<locale code="si_LK" name="Sinhala" native="සිංහල"/>
<locale code="sk_SK" name="Slovak" native="Slovenčina"/>
<locale code="sl_SL" name="Slovenian" native="Slovenščina"/>
<locale code="es_ES" name="Spanish" native="Español"/>
<locale code="es_LA" name="Spanish (Latin American)" native="Español (Latinoamericano)"/>
<locale code="sv_SE" name="Swedish" native="Svenska"/>
<locale code="th_TH" name="Thai" native="ภาษาไทย"/>
<locale code="tr_TR" name="Turkish" native="Türkçe"/>
<locale code="uk_UA" name="Ukrainian" native="Українська"/>
<locale code="vi_VN" name="Vietnamese" native="Tiếng việt"/>
<locale code="cy_GB" name="Welsh" native="Cymraeg"/>
</locales>

View File

@ -0,0 +1,26 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.common {
/**
* Add it to popup classes to add the Keyboard.ESCAPE close behaviour
*/
public interface IKeyboardClose {
}
}

View File

@ -17,76 +17,90 @@
*
*/
package org.bigbluebutton.core {
import flash.display.DisplayObject;
import flash.utils.Dictionary;
import flash.utils.getQualifiedClassName;
import flash.display.DisplayObject;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.utils.Dictionary;
import flash.utils.getQualifiedClassName;
import mx.core.FlexGlobals;
import mx.core.IChildList;
import mx.core.IFlexDisplayObject;
import mx.core.IUIComponent;
import mx.managers.PopUpManager;
import mx.managers.SystemManager;
import mx.core.FlexGlobals;
import mx.core.IChildList;
import mx.core.IFlexDisplayObject;
import mx.core.IUIComponent;
import mx.managers.PopUpManager;
import mx.managers.SystemManager;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.common.IKeyboardClose;
public final class PopUpUtil {
public final class PopUpUtil {
private static const LOGGER:ILogger = getClassLogger(PopUpUtil);
private static const LOGGER:ILogger = getClassLogger(PopUpUtil);
private static var popUpDict:Dictionary = new Dictionary(true);
private static var popUpDict:Dictionary = new Dictionary(true);
public static function createNonModelPopUp(parent:DisplayObject, className:Class, center:Boolean = true):IFlexDisplayObject {
if (!checkPopUpExists(className)) {
return addPopUpToStage(parent, className, false, center);
}
return null;
}
public static function createNonModalPopUp(parent:DisplayObject, className:Class, center:Boolean = true):IFlexDisplayObject {
if (!checkPopUpExists(className)) {
return addPopUpToStage(parent, className, false, center);
}
return null;
}
public static function createModalPopUp(parent:DisplayObject, className:Class, center:Boolean = true):IFlexDisplayObject {
if (!checkPopUpExists(className)) {
return addPopUpToStage(parent, className, true, center);
}
return null;
}
public static function createModalPopUp(parent:DisplayObject, className:Class, center:Boolean = true):IFlexDisplayObject {
if (!checkPopUpExists(className)) {
return addPopUpToStage(parent, className, true, center);
}
return null;
}
public static function removePopUp(classOrInstance:*):void {
var fqcn:String = getQualifiedClassName(classOrInstance);
if (popUpDict[fqcn] != undefined) {
PopUpManager.removePopUp(popUpDict[fqcn])
delete popUpDict[fqcn];
LOGGER.debug("Removed PopUp with type [{0}]", [fqcn]);
}
}
public static function removePopUp(classOrInstance:*):void {
var fqcn:String = getQualifiedClassName(classOrInstance);
if (popUpDict[fqcn] != undefined) {
PopUpManager.removePopUp(popUpDict[fqcn])
delete popUpDict[fqcn];
LOGGER.debug("Removed PopUp with type [{0}]", [fqcn]);
}
}
private static function checkPopUpExists(className:Class):Boolean {
LOGGER.debug("Checking if [{0}] exists as a PopUp", [className]);
var systemManager:SystemManager = FlexGlobals.topLevelApplication.systemManager;
private static function checkPopUpExists(className:Class):Boolean {
LOGGER.debug("Checking if [{0}] exists as a PopUp", [className]);
var systemManager:SystemManager = FlexGlobals.topLevelApplication.systemManager;
var childList:IChildList = systemManager.rawChildren;
for (var i:int = childList.numChildren - 1; i >= 0; i--) {
var childObject:IUIComponent = childList.getChildAt(i) as IUIComponent;
// PopUp already exists
if (childObject is className && childObject.isPopUp) {
LOGGER.debug("PopUp with type [{0}] found", [className]);
return true;
}
}
LOGGER.debug("No PopUp with type [{0}] not found", [className]);
return false;
}
var childList:IChildList = systemManager.rawChildren;
for (var i:int = childList.numChildren - 1; i >= 0; i--) {
var childObject:IUIComponent = childList.getChildAt(i) as IUIComponent;
// PopUp already exists
if (childObject is className && childObject.isPopUp) {
LOGGER.debug("PopUp with type [{0}] found", [className]);
return true;
}
}
LOGGER.debug("No PopUp with type [{0}] not found", [className]);
return false;
}
private static function addPopUpToStage(parent:DisplayObject, className:Class, modal:Boolean = false, center:Boolean = true):IFlexDisplayObject {
var popUp:IFlexDisplayObject = PopUpManager.createPopUp(parent, className, modal);
if (center) {
PopUpManager.centerPopUp(popUp)
}
popUpDict[getQualifiedClassName(className)] = popUp;
private static function addPopUpToStage(parent:DisplayObject, className:Class, modal:Boolean = false, center:Boolean = true):IFlexDisplayObject {
var popUp:IFlexDisplayObject = PopUpManager.createPopUp(parent, className, modal);
if (center) {
PopUpManager.centerPopUp(popUp)
}
popUpDict[getQualifiedClassName(className)] = popUp;
LOGGER.debug("Created PopUp with type [{0}]", [className]);
if (popUp is IKeyboardClose) {
popUp.addEventListener(KeyboardEvent.KEY_DOWN, escapeKeyDownHandler);
}
return popUp;
}
}
LOGGER.debug("Created PopUp with type [{0}]", [className]);
return popUp;
}
private static function escapeKeyDownHandler(event:KeyboardEvent):void {
if (event.charCode == Keyboard.ESCAPE) {
event.currentTarget.removeEventListener(KeyboardEvent.KEY_DOWN, escapeKeyDownHandler);
removePopUp(event.currentTarget);
}
}
}
}

View File

@ -44,12 +44,6 @@ package org.bigbluebutton.main.api
return false;
}
public function getBrowserInfo():Array {
if (ExternalInterface.available) {
return ExternalInterface.call("determineBrowser");
}
return ["unknown", 0, 0];
}
}
}

View File

@ -23,9 +23,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
initialize="init()"
layout="absolute"
close="onCancelClicked()"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
showCloseButton="false">
@ -44,18 +45,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand;
import org.bigbluebutton.modules.phone.events.UseFlashModeCommand;
import org.bigbluebutton.modules.phone.models.PhoneOptions;
import org.bigbluebutton.util.browser.BrowserCheck;
import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOGGER:ILogger = getClassLogger(AudioSelectionWindow);
private var phoneOptions:PhoneOptions;
private var browserInfo:Array;
private function init():void {
phoneOptions = Options.getOptions(PhoneOptions) as PhoneOptions;
browserInfo = JSAPI.getInstance().getBrowserInfo();
if (!phoneOptions.listenOnlyMode)
btnListenOnly.enabled = false;
@ -75,7 +74,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
// If Puffin browser is deteted and version is less than 4.6
if (browserInfo[0] == "Puffin" && String(browserInfo[2]).substr(0, 3) < "4.6") {
if (BrowserCheck.isPuffinBelow46()) {
vboxListen.percentWidth = 100;
}
}
@ -83,10 +82,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function onMicClick():void {
LOGGER.debug("AudioSelectionWindow - Share Microphone Clicked");
var dispatcher:Dispatcher = new Dispatcher();
if (browserInfo[0] == "Puffin" && String(browserInfo[2]).substr(0, 3) >= "4.6") {
if (BrowserCheck.isPuffin46AndAbove() || (!BrowserCheck.isHttps() && ((BrowserCheck.isChrome() && BrowserCheck.browserMajorVersion >= "60") || (BrowserCheck.isOpera() && BrowserCheck.browserMajorVersion >= "47")))) {
dispatcher.dispatchEvent(new UseFlashModeCommand());
}
else {
} else {
var command:JoinVoiceConferenceCommand = new JoinVoiceConferenceCommand();
command.mic = true;
dispatcher.dispatchEvent(command);
@ -106,7 +104,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function onCancelClicked():void {
LOGGER.debug("AudioSelectionWindow - Cancel clicked");
LOGGER.debug("AudioSelectionWindow - Close clicked");
var dispatcher:Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(new AudioSelectionWindowEvent(AudioSelectionWindowEvent.CLOSED_AUDIO_SELECTION));

View File

@ -3,6 +3,8 @@
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:common="org.bigbluebutton.common.*"
xmlns:mate="http://mate.asfusion.com/"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
layout="vertical"
horizontalAlign="center"
showCloseButton="false"
@ -14,6 +16,7 @@
import mx.core.UIComponent;
import mx.managers.PopUpManager;
import org.bigbluebutton.common.IKeyboardClose;
import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;

View File

@ -25,7 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
layout="absolute"
verticalScrollPolicy="off" horizontalScrollPolicy="off"
width="630" height="450" creationComplete="onCreationComplete()" styleName="cameraDisplaySettingsWindowStyle"
showCloseButton="false" close="onCancelClicked()" keyDown="handleKeyDown(event)">
showCloseButton="false" keyDown="handleKeyDown(event)">
<fx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
@ -34,7 +34,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import mx.collections.ArrayCollection;
import mx.collections.ArrayList;
import mx.events.CloseEvent;
import org.bigbluebutton.common.Media;
import org.bigbluebutton.core.BBB;
@ -188,8 +187,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function handleKeyDown(event:KeyboardEvent):void {
if (event.charCode == Keyboard.ESCAPE) {
disableCamera();
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
onCancelClicked();
}
}

View File

@ -23,12 +23,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:chat="org.bigbluebutton.modules.chat.views.*"
width="500" height="400"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
horizontalScrollPolicy="off"
title="{ResourceUtil.getInstance().getString('bbb.clientstatus.title')}"
horizontalAlign="center"
creationComplete="onCreationComplete();">
<fx:Script>
<![CDATA[
import org.bigbluebutton.common.IKeyboardClose;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.util.i18n.ResourceUtil;
@ -45,6 +47,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
]]>
</fx:Script>
<chat:AdvancedList id="messageList" width="100%" dragEnabled="false" variableRowHeight="true" wordWrap="true" alternatingItemColors="[#EFEFEF, #FEFEFE]" itemRenderer="org.bigbluebutton.main.views.ClientStatusItemRenderer"/>
<chat:AdvancedList id="messageList" width="100%" height="100%" dragEnabled="false" variableRowHeight="true" wordWrap="true" itemRenderer="org.bigbluebutton.main.views.ClientStatusItemRenderer"/>
<mx:Button id="closeBtn" label="{ResourceUtil.getInstance().getString('bbb.clientstatus.close')}" click="handleCloseButtonClick();" />
</mx:TitleWindow>

View File

@ -26,7 +26,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
verticalScrollPolicy="off"
creationComplete="onCreationComplete()"
showCloseButton="false"
close="onCancelClicked()"
keyDown="handleKeyDown(event)">
<fx:Declarations>
@ -44,7 +43,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import flash.ui.Keyboard;
import mx.controls.sliderClasses.Slider;
import mx.events.CloseEvent;
import mx.events.SliderEvent;
import org.as3commons.logging.api.ILogger;
@ -184,7 +182,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
// Added by Chad to enable closing the window without clicking the X
private function handleKeyDown(event:KeyboardEvent):void {
if (event.charCode == Keyboard.ESCAPE) {
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
onCancelClicked();
}
}

View File

@ -128,7 +128,6 @@ $Id: $
public function closeWindow():void {
this.visible = false;
PopUpManager.removePopUp(this);
//dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
}
]]>

View File

@ -25,7 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:mate="http://mate.asfusion.com/"
dataProvider="{ResourceUtil.getInstance().locales}"
change="changeLanguage()"
labelField="name"
labelField="native"
rowCount="15" width="120" height="22">
<fx:Declarations>

View File

@ -21,15 +21,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
xmlns:common="org.bigbluebutton.common.*"
minWidth="340" showCloseButton="false"
close="onCancelClicked()"
keyDown="handleKeyDown(event)">
<fx:Script>
<![CDATA[
import mx.events.CloseEvent;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.events.LockControlEvent;
import org.bigbluebutton.core.vo.LockSettingsVO;
@ -49,7 +48,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function handleKeyDown(event:KeyboardEvent):void {
if (event.charCode == Keyboard.ESCAPE) {
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
onCancelClicked();
}
}

View File

@ -22,6 +22,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
implements="org.bigbluebutton.common.IKeyboardClose"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
horizontalAlign="center"

View File

@ -150,6 +150,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.phone.events.WebRTCEchoTestEvent;
import org.bigbluebutton.modules.phone.events.WebRTCMediaEvent;
import org.bigbluebutton.modules.phone.models.PhoneOptions;
import org.bigbluebutton.util.browser.BrowserCheck;
import org.bigbluebutton.modules.users.model.UsersOptions;
import org.bigbluebutton.modules.users.views.BreakoutRoomSettings;
import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent;
@ -492,21 +493,19 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function versionCheck():void {
var browserOptions : BrowserVersionsOptions = Options.getOptions(BrowserVersionsOptions) as BrowserVersionsOptions;
if (!StringUtils.isEmpty(browserOptions.chrome) && !StringUtils.isEmpty(browserOptions.firefox) && !StringUtils.isEmpty(browserOptions.flash)) {
//find browser version
var browserVersion:Array = ExternalInterface.call("determineBrowser");
//check browser version
if ((browserVersion[0].toString().toLowerCase() == "chrome" && browserVersion[1] < browserOptions.chrome) || browserVersion[0].toString().toLowerCase() == "firefox" && browserVersion[1] < browserOptions.firefox) {
if ((BrowserCheck.isChrome() && BrowserCheck.browserMajorVersion < browserOptions.chrome) || BrowserCheck.isFirefox() && BrowserCheck.browserMajorVersion < browserOptions.firefox) {
globalDispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT,
ResourceUtil.getInstance().getString("bbb.clientstatus.browser.title"),
ResourceUtil.getInstance().getString("bbb.clientstatus.browser.message", [browserVersion[0]+" "+browserVersion[1]]),
ResourceUtil.getInstance().getString("bbb.clientstatus.browser.message", [BrowserCheck.browserName+" "+BrowserCheck.browserMajorVersion]),
'bbb.clientstatus.browser.message'));
}
//find flash version
var flashVersion:Object = getFlashVersion();
//check flash version
if ((flashVersion.os == 'LNX' && browserVersion[0].toString().toLowerCase() != "chrome" && flashVersion.major < 11) ||
((flashVersion.os != 'LNX' || browserVersion[0].toString().toLowerCase() == "chrome") && flashVersion.major < browserOptions.flash)) {
if ((flashVersion.os == 'LNX' && !BrowserCheck.isChrome() && flashVersion.major < 11) ||
((flashVersion.os != 'LNX' || BrowserCheck.isChrome()) && flashVersion.major < browserOptions.flash)) {
globalDispatcher.dispatchEvent(new ClientStatusEvent(ClientStatusEvent.WARNING_MESSAGE_EVENT,
ResourceUtil.getInstance().getString("bbb.clientstatus.flash.title"),
ResourceUtil.getInstance().getString("bbb.clientstatus.flash.message", [flashVersion.major+"."+flashVersion.minor+"."+flashVersion.build]),
@ -607,7 +606,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function wrongLocaleVersion():void {
var localeWindow:OldLocaleWarnWindow = PopUpUtil.createNonModelPopUp(mdiCanvas, OldLocaleWarnWindow, false) as OldLocaleWarnWindow;
var localeWindow:OldLocaleWarnWindow = PopUpUtil.createNonModalPopUp(mdiCanvas, OldLocaleWarnWindow, false) as OldLocaleWarnWindow;
if (localeWindow) {
var point1:Point = new Point();
// Calculate position of TitleWindow in Application's coordinates.
@ -629,9 +628,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function handleWebRTCMediaRequestEvent(event:WebRTCMediaEvent):void {
var options:PhoneOptions = new PhoneOptions();
if (!options.showMicrophoneHint) return;
var browser:String = ExternalInterface.call("determineBrowser")[0];
var browserPermissionHelper:BrowserPermissionHelper = PopUpUtil.createModalPopUp(mdiCanvas, BrowserPermissionHelper, false) as BrowserPermissionHelper;
if (browser == "Firefox") {
if (BrowserCheck.isFirefox()) {
if (browserPermissionHelper) {
if (Capabilities.os.indexOf("Mac") >= 0){
browserPermissionHelper.currentState = "firefoxMicMacOSX";
@ -642,7 +640,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
browserPermissionHelper.x = 50;
browserPermissionHelper.y = 200;
}
} else if (browser == "Chrome") {
} else if (BrowserCheck.isChrome()) {
if (browserPermissionHelper) {
browserPermissionHelper.currentState = "chromeMic";
browserPermissionHelper.x = 50;
@ -666,14 +664,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function handleShareCameraRequestEvent(event:ShareCameraRequestEvent):void {
if (ExternalInterface.call("determineBrowser")[0] == "Chrome") {
if (BrowserCheck.isChrome()) {
// Show browserPermissionHelper component after showing the webcam window due event listeners registration order
setTimeout(showbrowserPermissionHelper, 100);
}
}
private function showbrowserPermissionHelper() : void {
var browserPermissionHelper : BrowserPermissionHelper = PopUpUtil.createNonModelPopUp(mdiCanvas, BrowserPermissionHelper, false) as BrowserPermissionHelper;
var browserPermissionHelper : BrowserPermissionHelper = PopUpUtil.createNonModalPopUp(mdiCanvas, BrowserPermissionHelper, false) as BrowserPermissionHelper;
if (browserPermissionHelper) {
browserPermissionHelper.currentState = "chromeCam";
browserPermissionHelper.x = 20;

View File

@ -75,6 +75,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.common.events.ToolbarButtonEvent;
import org.bigbluebutton.core.BBB;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.TimerUtil;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.events.MeetingTimeRemainingEvent;
@ -300,14 +301,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function confirmLogout():void {
if (toolbarOptions.confirmLogout) {
var logoutWindow:LogoutWindow;
logoutWindow = LogoutWindow(PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, LogoutWindow, true));
var logoutWindow:LogoutWindow = PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, LogoutWindow, true) as LogoutWindow;
var newX:Number = this.width - logoutWindow.width - 5;
var newY:Number = btnLogout.y + btnLogout.height + 5;
PopUpManager.centerPopUp(logoutWindow);
logoutWindow.x = newX;
logoutWindow.y = newY;
} else {
@ -517,8 +515,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function onSettingsButtonClick():void {
settingsPopup = BBBSettings(PopUpManager.createPopUp(this.parent, BBBSettings, true));
settingsPopup = PopUpUtil.createModalPopUp(this.parent, BBBSettings, true) as BBBSettings;
settingsPopup.pushComponents(settingsComponents);
PopUpManager.centerPopUp(settingsPopup);
}
private function refreshRole(e:ChangeMyRole):void {

View File

@ -24,8 +24,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:common="org.bigbluebutton.common.*"
width="600" height="380"
creationComplete="onCreationComplete()"
showCloseButton="false"
close="onCancelClicked()">
showCloseButton="false">
<fx:Declarations>
<mate:Listener type="{WebRTCEchoTestStartedEvent.WEBRTC_ECHO_TEST_STARTED}" method="handleWebRTCEchoTestStartedEvent" />

View File

@ -199,7 +199,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<common:TabIndexer id="tabIndexer" startIndex="1" tabIndices="{[usersList, cmbFontSize, chatNoiseCheckBox, saveBtn, copyBtn, clearBtn]}"/>
</fx:Declarations>
<mx:Label id="lblSelect" styleName="chatOptionsLabel"
<common:AdvancedLabel id="lblSelect" styleName="chatOptionsLabel" width="100%"
text="{ResourceUtil.getInstance().getString('bbb.chat.privateChatSelect')}"
visible="{chatOptions.privateEnabled}" includeInLayout="{chatOptions.privateEnabled}"/>
<mx:List id="usersList" height="50%" width="100%" dataProvider="{users}" dragEnabled="false"
@ -210,7 +210,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
keyDown="onUserListKeyDown(event)"
toolTip="{ResourceUtil.getInstance().getString('bbb.chat.usersList.toolTip')}"
accessibilityName="{ResourceUtil.getInstance().getString('bbb.chat.usersList.accessibilityName')}"/>
<mx:Label styleName="chatOptionsLabel" text="{ResourceUtil.getInstance().getString('bbb.chat.chatOptions')}" />
<mx:Label styleName="chatOptionsLabel" width="100%" fontWeight="bold" text="{ResourceUtil.getInstance().getString('bbb.chat.chatOptions')}" />
<mx:HBox width="100%">
<mx:Label styleName="chatOptionsLabel" text="{ResourceUtil.getInstance().getString('bbb.chat.fontSize')}" width="100%"/>
<mx:ComboBox width="60" id="cmbFontSize" dataProvider="{fontSizes}" change="changeFontSize()"

View File

@ -33,7 +33,6 @@ package org.bigbluebutton.modules.layout.managers
import mx.events.CloseEvent;
import mx.events.EffectEvent;
import mx.events.ResizeEvent;
import mx.managers.PopUpManager;
import flexlib.mdi.containers.MDICanvas;
import flexlib.mdi.containers.MDIWindow;
@ -43,6 +42,7 @@ package org.bigbluebutton.modules.layout.managers
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.common.CustomMdiWindow;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.events.SwitchedLayoutEvent;
import org.bigbluebutton.core.model.LiveMeeting;
@ -130,9 +130,8 @@ package org.bigbluebutton.modules.layout.managers
public function alertSaveCurrentLayoutFile(e:CloseEvent):void {
// Check to see if the YES button was pressed.
if (e.detail==Alert.YES) {
var layoutNameWindow:CustomLayoutNameWindow = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, CustomLayoutNameWindow, true) as CustomLayoutNameWindow;
var layoutNameWindow:CustomLayoutNameWindow = PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, CustomLayoutNameWindow, true) as CustomLayoutNameWindow;
layoutNameWindow.savingForFileDownload = true;
PopUpManager.centerPopUp(layoutNameWindow);
} else if (e.detail==Alert.NO){
saveLayoutsWindow();
}

View File

@ -34,9 +34,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import flash.events.Event;
import mx.core.FlexGlobals;
import mx.core.IFlexDisplayObject;
import mx.managers.PopUpManager;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.util.i18n.ResourceUtil;
@ -46,8 +45,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function onClick(e:Event):void {
var layoutNameWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, CustomLayoutNameWindow, true);
PopUpManager.centerPopUp(layoutNameWindow);
PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, CustomLayoutNameWindow, true);
}
public function refreshRole(amIModerator:Boolean):void {

View File

@ -22,14 +22,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
horizontalAlign="center"
showCloseButton="true"
close="onCancelClicked()"
layout="absolute"
showCloseButton="false"
creationComplete="onCreationComplete()"
width="250"
title="{ResourceUtil.getInstance().getString('bbb.layout.window.name')}">
width="280">
<fx:Declarations>
<mate:Listener type="{LayoutNameInUseEvent.LAYOUT_NAME_IN_USE_EVENT}" method="handleLayoutNameInUse"/>
@ -37,13 +38,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<fx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
import com.asfusion.mate.events.Dispatcher;
import mx.managers.PopUpManager;
import mx.managers.PopUpManager;
import org.bigbluebutton.modules.layout.events.LayoutEvent;
import org.bigbluebutton.modules.layout.events.LayoutNameInUseEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.modules.layout.events.LayoutEvent;
import org.bigbluebutton.modules.layout.events.LayoutNameInUseEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOGGER:ILogger = getClassLogger(CustomLayoutNameWindow);
public var savingForFileDownload:Boolean = false;
@ -65,7 +70,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
savingForFileDownload = false;
}
} else {
trace("The name is already in use, waiting for overwrite command or rename");
LOGGER.debug("The name is already in use, waiting for overwrite command or rename");
}
}
@ -79,8 +84,23 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
]]>
</fx:Script>
<mx:HBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
<mx:TextInput id="textInput" maxChars="140" width="100%" text="{ResourceUtil.getInstance().getString('bbb.layout.combo.customName')}" enter="addButton_clickHandler()"/>
<mx:Button id="addButton" click="addButton_clickHandler()" enabled="{textInput.text.length > 0}" styleName="addLayoutButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.layout.addButton.toolTip')}"/>
</mx:HBox>
<mx:VBox width="100%"
height="100%"
paddingTop="5"
horizontalAlign="center">
<common:AdvancedLabel text="{ResourceUtil.getInstance().getString('bbb.layout.window.name')}"
styleName="titleWindowStyle"
width="180" />
<mx:TextInput id="textInput" height="26" maxChars="140" width="100%"
text="{ResourceUtil.getInstance().getString('bbb.layout.combo.customName')}"
enter="addButton_clickHandler()" />
<mx:Button id="addButton" height="30" width="100%" click="addButton_clickHandler()" enabled="{textInput.text.length > 0}" styleName="mainActionButton"
label="{ResourceUtil.getInstance().getString('bbb.layout.addButton.label')}" toolTip="{ResourceUtil.getInstance().getString('bbb.layout.addButton.toolTip')}" />
</mx:VBox>
<mx:Button id="closeButton" click="onCancelClicked()" styleName="titleWindowCloseButton"
toolTip="{ResourceUtil.getInstance().getString('bbb.layout.window.close.tooltip')}"
top="15" right="10"
accessibilityName="{ResourceUtil.getInstance().getString('bbb.layout.window.accessibilityName')}" />
</mx:TitleWindow>

View File

@ -14,7 +14,6 @@ package org.bigbluebutton.modules.phone.managers
import org.as3commons.logging.util.jsonXify;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.main.api.JSAPI;
import org.bigbluebutton.main.events.ClientStatusEvent;
import org.bigbluebutton.main.model.users.AutoReconnect;
import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent;
@ -36,8 +35,6 @@ package org.bigbluebutton.modules.phone.managers
private static const LOGGER:ILogger = getClassLogger(WebRTCCallManager);
private const MAX_RETRIES:Number = 3;
private var browserType:String = "unknown";
private var browserVersion:int = 0;
private var dispatcher:Dispatcher = new Dispatcher();
private var echoTestDone:Boolean = false;
@ -50,11 +47,6 @@ package org.bigbluebutton.modules.phone.managers
private var reconnecting:Boolean = false;
public function WebRTCCallManager() {
var browserInfo:Array = JSAPI.getInstance().getBrowserInfo();
if (browserInfo != null) {
browserType = browserInfo[0];
browserVersion = browserInfo[1];
}
options = Options.getOptions(PhoneOptions) as PhoneOptions;
// only show the warning if the admin has enabled WebRTC

View File

@ -21,15 +21,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:common="org.bigbluebutton.common.*"
width="350" layout="vertical"
close="onCloseClicked()"
show="{focusManager.setFocus(choiceFirst)}" xmlns:common="org.bigbluebutton.common.*">
implements="org.bigbluebutton.common.IKeyboardClose"
show="focusManager.setFocus(choiceFirst)">
<fx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
import org.as3commons.lang.ArrayUtils;
import org.as3commons.lang.StringUtils;
import org.bigbluebutton.common.IKeyboardClose;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.modules.polling.events.StartCustomPollEvent;
import org.bigbluebutton.modules.present.ui.views.PresentationWindow;

View File

@ -24,9 +24,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
layout="absolute"
width="580"
height="410"
creationComplete="creationCompleteHandler(event)"
close="onCancelClicked()"
initialize="initData();" >
@ -37,6 +39,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import org.bigbluebutton.modules.present.events.DownloadEvent;
import org.bigbluebutton.modules.present.model.PresentationModel;
@ -45,6 +48,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
[Bindable]
private var downloadablePresentations:ArrayCollection;
protected function creationCompleteHandler(event:FlexEvent):void {
closeButton.setFocus()
}
override public function move(x:Number, y:Number):void {
return;
}
@ -56,6 +63,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function onCancelClicked():void {
globalDispatch.dispatchEvent(new DownloadEvent(DownloadEvent.CLOSE_DOWNLOAD_WINDOW));
}
]]>
</fx:Script>

View File

@ -36,7 +36,7 @@ package org.bigbluebutton.modules.screenshare.managers {
import org.bigbluebutton.modules.screenshare.model.ScreenshareModel;
import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
import org.bigbluebutton.modules.screenshare.services.ScreenshareService;
import org.bigbluebutton.modules.screenshare.utils.BrowserCheck;
import org.bigbluebutton.util.browser.BrowserCheck;
public class ScreenshareManager {
private static const LOGGER:ILogger = getClassLogger(ScreenshareManager);

View File

@ -1,51 +0,0 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.modules.screenshare.utils
{
import flash.external.ExternalInterface;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
public class BrowserCheck {
private static const LOGGER:ILogger = getClassLogger(BrowserCheck);
public static function isWebRTCSupported():Boolean {
/*LOGGER.debug("isWebRTCSupported - ExternalInterface.available=[{0}], isWebRTCAvailable=[{1}]", [ExternalInterface.available, ExternalInterface.call("isWebRTCAvailable")]);*/
return (ExternalInterface.available && ExternalInterface.call("isWebRTCAvailable"));
}
public static function isChrome():Boolean {
var browser:Array = ExternalInterface.call("determineBrowser");
return browser[0] == "Chrome";
}
public static function isFirefox():Boolean {
var browser:Array = ExternalInterface.call("determineBrowser");
return browser[0] == "Firefox";
}
public static function isHttps():Boolean {
var url:String = ExternalInterface.call("window.location.href.toString");
var httpsPattern:RegExp = /^https/;
return httpsPattern.test(url);
}
}
}

View File

@ -26,6 +26,7 @@ package org.bigbluebutton.modules.screenshare.utils
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
import org.bigbluebutton.util.browser.BrowserCheck;
public class WebRTCScreenshareUtility {
private static const LOGGER:ILogger = getClassLogger(WebRTCScreenshareUtility);

View File

@ -128,8 +128,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
os = "";
}
browser = ExternalInterface.call("determineBrowser")[0];
windowControls.maximizeRestoreBtn.enabled = false;
titleBarOverlay.tabIndex = dsOptions.baseTabIndex;

View File

@ -23,14 +23,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
implements="org.bigbluebutton.common.IKeyboardClose"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
horizontalAlign="center"
close="onCancelClicked()"
layout="absolute"
creationComplete="onCreationComplete()"
keyUp="keyUpHandler(event)"
width="240" xmlns:common="org.bigbluebutton.common.*">
width="280" xmlns:common="org.bigbluebutton.common.*">
<fx:Script>
<![CDATA[
@ -38,6 +38,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import mx.managers.PopUpManager;
import org.bigbluebutton.common.IKeyboardClose;
import org.bigbluebutton.core.model.LiveMeeting;
import org.bigbluebutton.modules.sharednotes.events.SharedNotesEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;

View File

@ -50,11 +50,9 @@
import mx.controls.Alert;
import mx.controls.Menu;
import mx.core.FlexGlobals;
import mx.core.IFlexDisplayObject;
import mx.events.CloseEvent;
import mx.events.FlexEvent;
import mx.events.MenuEvent;
import mx.managers.PopUpManager;
import flashx.textLayout.formats.Direction;
@ -66,6 +64,7 @@
import org.bigbluebutton.common.Role;
import org.bigbluebutton.common.events.LocaleChangeEvent;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.model.LiveMeeting;
import org.bigbluebutton.main.events.ShortcutEvent;
@ -479,8 +478,7 @@
}
protected function newNoteHandler():void {
var noteNameWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, SharedNotesNameWindow, true);
PopUpManager.centerPopUp(noteNameWindow);
PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, SharedNotesNameWindow, true);
}
protected function btnUndo_clickHandler(event:MouseEvent = null):void {

View File

@ -25,8 +25,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
width="630"
close="onCloseClicked()"
visible="false"
showCloseButton="false">

View File

@ -23,6 +23,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
close="onCloseClick()"
layout="absolute"
width="600" xmlns:common="org.bigbluebutton.common.*">

View File

@ -24,10 +24,7 @@
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
creationComplete="onCreationComplete()"
verticalScrollPolicy="off" horizontalScrollPolicy="off"
verticalAlign="middle"
horizontalGap="8"
horizontalAlign="center">
verticalScrollPolicy="off" horizontalScrollPolicy="off">
<fx:Declarations>
<mate:Listener type="{UsersRollEvent.USER_ROLL_OVER}" method="onRollOver" />

View File

@ -166,9 +166,9 @@ $Id: $
private const LISTEN_TO_BREAKOUT_ROOM:String = "Listen To Breakout Room";
private const JOIN_BREAKOUT_ROOM:String = "Join Breakout Room";
private const STATUS_GRID_WIDTH:int = 56;
private const STATUS_GRID_WIDTH:int = 50;
private const NAME_GRID_MIN_WIDTH:int = 80;
private const MEDIA_GRID_WIDTH:int = 118;
private const MEDIA_GRID_WIDTH:int = 100;
private var muteMeRolled:Boolean = false;
@ -375,7 +375,7 @@ $Id: $
}
private function openEmojiStatusMenu():void {
var moodMenu:MoodMenu = PopUpUtil.createNonModelPopUp(DisplayObject(FlexGlobals.topLevelApplication), MoodMenu, false) as MoodMenu;
var moodMenu:MoodMenu = PopUpUtil.createNonModalPopUp(DisplayObject(FlexGlobals.topLevelApplication), MoodMenu, false) as MoodMenu;
moodMenu.btn = emojiStatusBtn;
moodMenu.show();
}

View File

@ -18,7 +18,7 @@
*/
package org.bigbluebutton.modules.videoconf.model {
import org.bigbluebutton.core.Options;
import org.bigbluebutton.main.api.JSAPI;
import org.bigbluebutton.util.browser.BrowserCheck;
public class VideoConfOptions extends Options {
public var uri:String = "rtmp://localhost/video";
@ -58,10 +58,8 @@ package org.bigbluebutton.modules.videoconf.model {
}
override protected function handleExtraData():void {
var browserInfo:Array = JSAPI.getInstance().getBrowserInfo();
// If we are using Puffin browser
if (browserInfo[0] == "Puffin" && String(browserInfo[2]).substr(0, 3) < "4.6") {
if (BrowserCheck.isPuffinBelow46()) {
showButton = false;
}
}

View File

@ -42,25 +42,31 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<fx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
import com.asfusion.mate.events.Dispatcher;
import mx.controls.Alert;
import mx.controls.Menu;
import mx.events.MenuEvent;
import mx.styles.IStyleManager2;
import mx.styles.StyleManager;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.common.Media;
import org.bigbluebutton.core.events.LockControlEvent;
import org.bigbluebutton.core.model.LiveMeeting;
import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.main.model.users.events.ChangeMyRole;
import org.bigbluebutton.main.views.MainToolbar;
import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent;
import org.bigbluebutton.modules.videoconf.events.StopShareCameraRequestEvent;
import org.bigbluebutton.util.browser.BrowserCheck;
import org.bigbluebutton.util.i18n.ResourceUtil;
import mx.controls.Menu;
import mx.events.MenuEvent;
import mx.styles.IStyleManager2;
import mx.styles.StyleManager;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.common.Media;
import org.bigbluebutton.core.events.LockControlEvent;
import org.bigbluebutton.core.model.LiveMeeting;
import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.main.model.users.events.ChangeMyRole;
import org.bigbluebutton.main.views.MainToolbar;
import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent;
import org.bigbluebutton.modules.videoconf.events.StopShareCameraRequestEvent;
import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOGGER:ILogger = getClassLogger(ToolbarPopupButton);
@ -177,6 +183,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function openPublishWindow():void{
if (!BrowserCheck.isHttps() && ((BrowserCheck.isChrome() && BrowserCheck.browserMajorVersion >= "60") || (BrowserCheck.isOpera() && BrowserCheck.browserMajorVersion >= "47"))) {
Alert.show(ResourceUtil.getInstance().getString("bbb.video.message.browserhttp", [BrowserCheck.browserName]));
return;
}
this.enabled = false;
if(_currentState == ON_STATE) {
LOGGER.debug("[ToolbarPopupButton:openPublishWindow] Close window");

View File

@ -4,6 +4,8 @@ package org.bigbluebutton.modules.videoconf.views
import flash.events.Event;
import flash.net.URLRequest;
import mx.core.UIComponent;
public class UserAvatar extends UserGraphic {
private var _imageLoader:Loader = null;
@ -18,14 +20,17 @@ package org.bigbluebutton.modules.videoconf.views
_completed = false;
_imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadingComplete);
addChild(_imageLoader);
var request:URLRequest = new URLRequest(avatarUrl);
_imageLoader.load(request);
}
private function onLoadingComplete(event:Event):void {
_completed = true;
addChild(_imageLoader);
setOriginalDimensions(_imageLoader.width, _imageLoader.height);
if (parent && parent is UIComponent)
UIComponent(parent).invalidateDisplayList();
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

View File

@ -62,12 +62,12 @@ package org.bigbluebutton.modules.videoconf.views
object_height = unscaledHeight;
object_width = Math.ceil(unscaledHeight * aspectRatio);
object_y = BORDER_THICKNESS;
object_x = Math.floor((unscaledWidth - object.width) / 2);
object_x = Math.floor((unscaledWidth - object_width) / 2);
} else {
object_width = unscaledWidth;
object_height = Math.ceil(unscaledWidth / aspectRatio);
object_x = BORDER_THICKNESS;
object_y = Math.floor((unscaledHeight - object.height) / 2);
object_y = Math.floor((unscaledHeight - object_height) / 2);
}
object.x = object_x;

View File

@ -76,6 +76,7 @@ package org.bigbluebutton.modules.whiteboard.views {
whiteboardToolbar.whiteboardAccessModified(wbModel.multiUser);
this.clipContent = true;
this.mouseEnabled = false;
//create the annotation display container
this.addChild(graphicObjectHolder);
@ -119,12 +120,14 @@ package org.bigbluebutton.modules.whiteboard.views {
addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
mouseEnabled = true;
}
private function unregisterForMouseEvents():void {
removeEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
mouseEnabled = false;
}
private function doMouseUp(event:MouseEvent):void {

View File

@ -0,0 +1,95 @@
/**
* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
*
* Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*
*/
package org.bigbluebutton.util.browser {
import flash.external.ExternalInterface;
import org.as3commons.lang.StringUtils;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
public class BrowserCheck {
private static const LOGGER:ILogger = getClassLogger(BrowserCheck);
private static var _browserName:String;
private static var _majorVersion:String;
private static var _fullVersion:String;
// The function below is called in $cinit, while the class is used for the first time.
getBrowserInfo();
public static function isWebRTCSupported():Boolean {
/*LOGGER.debug("isWebRTCSupported - ExternalInterface.available=[{0}], isWebRTCAvailable=[{1}]", [ExternalInterface.available, ExternalInterface.call("isWebRTCAvailable")]);*/
return (ExternalInterface.available && ExternalInterface.call("isWebRTCAvailable"));
}
public static function get browserName():String {
return _browserName;
}
public static function get browserMajorVersion():String {
return _majorVersion;
}
public static function get browserFullVersion():String {
return _fullVersion;
}
public static function isChrome():Boolean {
return _browserName.toLowerCase() == "chrome";
}
public static function isOpera():Boolean {
return _browserName.toLowerCase() == "opera";
}
public static function isFirefox():Boolean {
return _browserName.toLowerCase() == "firefox";
}
public static function isPuffinBelow46():Boolean {
return _browserName.toLowerCase() == "puffin" && String(_fullVersion).substr(0, 3) < "4.6";
}
public static function isPuffin46AndAbove():Boolean {
return browserName.toLowerCase() == "puffin" && String(_fullVersion).substr(0, 3) >= "4.6";
}
private static function getBrowserInfo():void {
if (ExternalInterface.available && StringUtils.isEmpty(browserName)) {
var browserInfo:Array = ExternalInterface.call("determineBrowser");
_browserName = browserInfo[0];
_majorVersion = String(browserInfo[1]);
_fullVersion = String(browserInfo[2]);
} else {
_browserName = "unknown";
_majorVersion = "0";
_fullVersion = "0";
}
}
public static function isHttps():Boolean {
var url:String = ExternalInterface.call("window.location.href.toString");
var httpsPattern:RegExp = /^https/;
return httpsPattern.test(url);
}
}
}

View File

@ -116,6 +116,7 @@ package org.bigbluebutton.util.i18n
locales.push({
code: DEFAULT_LOCALE_IDENTIFIER,
name: "",
native: "",
direction: "ltr"
});
@ -123,6 +124,7 @@ package org.bigbluebutton.util.i18n
locales.push({
code: locale.@code.toString(),
name: locale.@name.toString(),
native: locale.@native.toString(),
direction: locale.@direction.valueOf().toString().toLowerCase() == "rtl" ? "rtl" : "ltr"
});
}
@ -177,13 +179,7 @@ package org.bigbluebutton.util.i18n
}
private function reloadLocaleNames():void {
for each (var item:* in locales) {
if (item.code == DEFAULT_LOCALE_IDENTIFIER) {
item.name = ResourceUtil.getInstance().getString("bbb.langSelector." + item.code, null, getDefaultLocale());
} else {
item.name = ResourceUtil.getInstance().getString("bbb.langSelector." + item.code, null, preferredLocale);
}
}
locales[0].name = locales[0].native = ResourceUtil.getInstance().getString("bbb.langSelector." + locales[0].code, null, getDefaultLocale());
locales.sort(localesCompareFunction);
}

View File

@ -357,15 +357,15 @@ export default function addAnnotation(meetingId, whiteboardId, userId, annotatio
const cb = (err, numChanged) => {
if (err) {
return Logger.error(`Adding annotation2x to collection: ${err}`);
return Logger.error(`Adding annotation to collection: ${err}`);
}
const { insertedId } = numChanged;
if (insertedId) {
return Logger.info(`Added annotation2x id=${annotation.id} whiteboard=${whiteboardId}`);
return Logger.info(`Added annotation id=${annotation.id} whiteboard=${whiteboardId}`);
}
return Logger.info(`Upserted annotation2x id=${annotation.id} whiteboard=${whiteboardId}`);
return Logger.info(`Upserted annotation id=${annotation.id} whiteboard=${whiteboardId}`);
};
return Annotations.upsert(query.selector, query.modifier, cb);

View File

@ -18,7 +18,7 @@ export default function clearAnnotations(meetingId, whiteboardId, userId) {
const cb = (err) => {
if (err) {
return Logger.error(`Removing Shapes2x from collection: ${err}`);
return Logger.error(`Removing Annotations from collection: ${err}`);
}
if (!meetingId) {
@ -26,10 +26,10 @@ export default function clearAnnotations(meetingId, whiteboardId, userId) {
}
if (userId) {
return Logger.info(`Removed Shapes2x for userId=${userId} where whiteboard=${whiteboardId}`);
return Logger.info(`Removed Annotations for userId=${userId} where whiteboard=${whiteboardId}`);
}
return Logger.info(`Removed Shapes2x where whiteboard=${whiteboardId}`);
return Logger.info(`Removed Annotations where whiteboard=${whiteboardId}`);
};
return Annotations.remove(selector, cb);

View File

@ -11,7 +11,7 @@ function annotations(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.info(`Publishing Annotations2x for ${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.info(`Publishing Annotations for ${meetingId} ${requesterUserId} ${requesterToken}`);
return Annotations.find({ meetingId });
}

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Breakouts = new Mongo.Collection('breakouts2x');
const Breakouts = new Mongo.Collection('breakouts');
if (Meteor.isServer) {
// types of queries for the breakouts:

View File

@ -9,7 +9,7 @@ function breakouts(credentials) {
requesterUserId,
} = credentials;
Logger.info(`Publishing Breakouts2x for ${meetingId} ${requesterUserId}`);
Logger.info(`Publishing Breakouts for ${meetingId} ${requesterUserId}`);
return Breakouts.find({
$or: [
@ -29,4 +29,4 @@ function publish(...args) {
return mapToAcl('subscriptions.breakouts', boundBreakouts)(args);
}
Meteor.publish('breakouts2x', publish);
Meteor.publish('breakouts', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Captions = new Mongo.Collection('captions2x');
const Captions = new Mongo.Collection('captions');
if (Meteor.isServer) {
// types of queries for the captions:

View File

@ -37,15 +37,15 @@ export default function addCaption(meetingId, locale, captionHistory, id = false
const cb = (err, numChanged) => {
if (err) {
return Logger.error(`Adding caption2x to collection: ${err}`);
return Logger.error(`Adding caption to collection: ${err}`);
}
const { insertedId } = numChanged;
if (insertedId) {
return Logger.verbose(`Added caption2x locale=${locale} meeting=${meetingId}`);
return Logger.verbose(`Added caption locale=${locale} meeting=${meetingId}`);
}
return Logger.verbose(`Upserted caption2x locale=${locale} meeting=${meetingId}`);
return Logger.verbose(`Upserted caption locale=${locale} meeting=${meetingId}`);
};
return Captions.upsert(selector, modifier, cb);

View File

@ -3,8 +3,8 @@ import Logger from '/imports/startup/server/logger';
export default function clearCaptions(meetingId) {
if (meetingId) {
return Captions.remove({ meetingId }, Logger.info(`Cleared Captions2x (${meetingId})`));
return Captions.remove({ meetingId }, Logger.info(`Cleared Captions (${meetingId})`));
}
return Captions.remove({}, Logger.info('Cleared Captions2x (all)'));
return Captions.remove({}, Logger.info('Cleared Captions (all)'));
}

View File

@ -11,7 +11,7 @@ function captions(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.verbose(`Publishing Captions2x for ${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.verbose(`Publishing Captions for ${meetingId} ${requesterUserId} ${requesterToken}`);
return Captions.find({ meetingId });
}
@ -21,4 +21,4 @@ function publish(...args) {
return mapToAcl('subscriptions.captions', boundCaptions)(args);
}
Meteor.publish('captions2x', publish);
Meteor.publish('captions', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Chat = new Mongo.Collection('chat2x');
const Chat = new Mongo.Collection('chat');
if (Meteor.isServer) {
// types of queries for the chat:

View File

@ -37,4 +37,4 @@ function publish(...args) {
return mapToAcl('subscriptions.chat', boundChat)(args);
}
Meteor.publish('chat2x', publish);
Meteor.publish('chat', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Cursor = new Mongo.Collection('cursor2x');
const Cursor = new Mongo.Collection('cursor');
if (Meteor.isServer) {
// types of queries for the cursor:

View File

@ -12,7 +12,7 @@ function cursor(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.debug(`Publishing Cursor2x for ${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.debug(`Publishing Cursor for ${meetingId} ${requesterUserId} ${requesterToken}`);
return Cursor.find({ meetingId });
}
@ -22,5 +22,5 @@ function publish(...args) {
return mapToAcl('subscriptions.cursor', boundCursor)(args);
}
Meteor.publish('cursor2x', publish);
Meteor.publish('cursor', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Meetings = new Mongo.Collection('meetings2x');
const Meetings = new Mongo.Collection('meetings');
if (Meteor.isServer) {
// types of queries for the meetings:

View File

@ -79,11 +79,11 @@ export default function addMeeting(meeting) {
const { insertedId } = numChanged;
if (insertedId) {
Logger.info(`Added meeting2x id=${meetingId}`);
Logger.info(`Added meeting id=${meetingId}`);
}
if (numChanged) {
Logger.info(`Upserted meeting2x id=${meetingId}`);
Logger.info(`Upserted meeting id=${meetingId}`);
}
};

View File

@ -11,7 +11,7 @@ function meetings(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.info(`Publishing meeting2x =${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.info(`Publishing meeting =${meetingId} ${requesterUserId} ${requesterToken}`);
return Meetings.find({
meetingId,
@ -23,5 +23,5 @@ function publish(...args) {
return mapToAcl('subscriptions.meetings', boundMeetings)(args);
}
Meteor.publish('meetings2x', publish);
Meteor.publish('meetings', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Polls = new Mongo.Collection('polls2x');
const Polls = new Mongo.Collection('polls');
if (Meteor.isServer) {
// We can have just one active poll per meeting

View File

@ -43,10 +43,10 @@ export default function publishVote(credentials, id, pollAnswerId) { // TODO dis
const cb = (err) => {
if (err) {
return Logger.error(`Updating Polls2x collection: ${err}`);
return Logger.error(`Updating Polls collection: ${err}`);
}
return Logger.info(`Updating Polls2x collection (meetingId: ${meetingId},
return Logger.info(`Updating Polls collection (meetingId: ${meetingId},
pollId: ${currentPoll.id}!)`);
};

View File

@ -48,15 +48,15 @@ export default function addPoll(meetingId, requesterId, poll) {
const cb = (err, numChanged) => {
if (err != null) {
return Logger.error(`Adding Poll2x to collection: ${poll.id}`);
return Logger.error(`Adding Poll to collection: ${poll.id}`);
}
const { insertedId } = numChanged;
if (insertedId) {
return Logger.info(`Added Poll2x id=${poll.id}`);
return Logger.info(`Added Poll id=${poll.id}`);
}
return Logger.info(`Upserted Poll2x id=${poll.id}`);
return Logger.info(`Upserted Poll id=${poll.id}`);
};
return Polls.upsert(selector, modifier, cb);

View File

@ -3,8 +3,8 @@ import Logger from '/imports/startup/server/logger';
export default function clearPolls(meetingId) {
if (meetingId) {
return Polls.remove({ meetingId }, Logger.info(`Cleared Polls2x (${meetingId})`));
return Polls.remove({ meetingId }, Logger.info(`Cleared Polls (${meetingId})`));
}
return Polls.remove({}, Logger.info('Cleared Polls2x (all)'));
return Polls.remove({}, Logger.info('Cleared Polls (all)'));
}

View File

@ -13,10 +13,10 @@ export default function removePoll(meetingId, id) {
const cb = (err) => {
if (err) {
return Logger.error(`Removing Poll2x from collection: ${err}`);
return Logger.error(`Removing Poll from collection: ${err}`);
}
return Logger.info(`Removed Poll2x id=${id}`);
return Logger.info(`Removed Poll id=${id}`);
};
return Polls.remove(selector, cb);

View File

@ -37,10 +37,10 @@ export default function updateVotes(poll, meetingId, requesterId) {
const cb = (err) => {
if (err) {
return Logger.error(`Updating Polls2x collection: ${err}`);
return Logger.error(`Updating Polls collection: ${err}`);
}
return Logger.info(`Updating Polls2x collection (meetingId: ${meetingId}, pollId: ${id}!)`);
return Logger.info(`Updating Polls collection (meetingId: ${meetingId}, pollId: ${id}!)`);
};
return Polls.update(selector, modifier, cb);

View File

@ -11,7 +11,7 @@ function polls(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.info(`Publishing polls2x =${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.info(`Publishing polls =${meetingId} ${requesterUserId} ${requesterToken}`);
const selector = {
meetingId,
@ -26,5 +26,5 @@ function publish(...args) {
return mapToAcl('subscriptions.polls', boundPolls)(args);
}
Meteor.publish('polls2x', publish);
Meteor.publish('polls', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Presentations = new Mongo.Collection('presentations2x');
const Presentations = new Mongo.Collection('presentations');
if (Meteor.isServer) {
// types of queries for the presentations:

View File

@ -71,15 +71,15 @@ export default function handlePresentationConversionUpdate({ body }, meetingId)
const cb = (err, numChanged) => {
if (err) {
return Logger.error(`Updating conversion status presentation2x to collection: ${err}`);
return Logger.error(`Updating conversion status presentation to collection: ${err}`);
}
const { insertedId } = numChanged;
if (insertedId) {
return Logger.info(`Updated presentation2x conversion status=${status} id=${presentationId} meeting=${meetingId}`);
return Logger.info(`Updated presentation conversion status=${status} id=${presentationId} meeting=${meetingId}`);
}
return Logger.info(`Upserted presentation2x conversion status=${status} id=${presentationId} meeting=${meetingId}`);
return Logger.info(`Upserted presentation conversion status=${status} id=${presentationId} meeting=${meetingId}`);
};
return Presentations.upsert(selector, modifier, cb);

View File

@ -54,7 +54,7 @@ export default function addPresentation(meetingId, presentation) {
const cb = (err, numChanged) => {
if (err) {
return Logger.error(`Adding presentation2x to collection: ${err}`);
return Logger.error(`Adding presentation to collection: ${err}`);
}
addSlides(meetingId, presentation.id, presentation.pages);
@ -65,10 +65,10 @@ export default function addPresentation(meetingId, presentation) {
setCurrentPresentation(meetingId, presentation.id);
}
return Logger.info(`Added presentation2x id=${presentation.id} meeting=${meetingId}`);
return Logger.info(`Added presentation id=${presentation.id} meeting=${meetingId}`);
}
return Logger.info(`Upserted presentation2x id=${presentation.id} meeting=${meetingId}`);
return Logger.info(`Upserted presentation id=${presentation.id} meeting=${meetingId}`);
};
return Presentations.upsert(selector, modifier, cb);

View File

@ -4,7 +4,7 @@ import Logger from '/imports/startup/server/logger';
export default function clearPresentations(meetingId) {
if (meetingId) {
return Presentations.remove({ meetingId },
Logger.info(`Cleared Presentations2x (${meetingId})`));
Logger.info(`Cleared Presentations (${meetingId})`));
}
return Presentations.remove({}, Logger.info('Cleared Presentations (all)'));
}

View File

@ -33,10 +33,10 @@ export default function setCurrentPresentation(meetingId, presentationId) {
},
callback: (err) => {
if (err) {
return Logger.error(`Setting as current presentation2x id=${presentationId}: ${err}`);
return Logger.error(`Setting as current presentation id=${presentationId}: ${err}`);
}
return Logger.info(`Setted as current presentation2x id=${presentationId}`);
return Logger.info(`Setted as current presentation id=${presentationId}`);
},
};

View File

@ -11,7 +11,7 @@ function presentations(credentials) {
check(requesterUserId, String);
check(requesterToken, String);
Logger.info(`Publishing Presentations2x for ${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.info(`Publishing Presentations for ${meetingId} ${requesterUserId} ${requesterToken}`);
return Presentations.find({ meetingId });
}
@ -21,4 +21,4 @@ function publish(...args) {
return mapToAcl('subscriptions.presentations', boundPresentations)(args);
}
Meteor.publish('presentations2x', publish);
Meteor.publish('presentations', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Slides = new Mongo.Collection('slides2x');
const Slides = new Mongo.Collection('slides');
if (Meteor.isServer) {
// types of queries for the slides:

View File

@ -21,4 +21,4 @@ function publish(...args) {
return mapToAcl('subscriptions.slides', boundSlides)(args);
}
Meteor.publish('slides2x', publish);
Meteor.publish('slides', publish);

View File

@ -1,6 +1,6 @@
import { Meteor } from 'meteor/meteor';
const Users = new Mongo.Collection('users2x');
const Users = new Mongo.Collection('users');
if (Meteor.isServer) {
// types of queries for the users:

View File

@ -16,4 +16,4 @@ Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', 'method
kickUser,
}));
Meteor.methods({ validateAuthToken2x: validateAuthToken });
Meteor.methods({ validateAuthToken, });

View File

@ -3,7 +3,7 @@ import { check } from 'meteor/check';
import RedisPubSub from '/imports/startup/server/redis';
import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users';
import createDummyUser2x from '../modifiers/createDummyUser';
import createDummyUser from '../modifiers/createDummyUser';
import setConnectionStatus from '../modifiers/setConnectionStatus';
const ONLINE_CONNECTION_STATUS = 'online';
@ -25,7 +25,7 @@ export default function validateAuthToken(credentials) {
});
if (!User) {
createDummyUser2x(meetingId, requesterUserId, requesterToken);
createDummyUser(meetingId, requesterUserId, requesterToken);
} else if (User.validated) {
setConnectionStatus(meetingId, requesterUserId, ONLINE_CONNECTION_STATUS);
}

View File

@ -3,7 +3,7 @@ import { check } from 'meteor/check';
import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users';
export default function createDummyUser2x(meetingId, userId, authToken) {
export default function createDummyUser(meetingId, userId, authToken) {
check(meetingId, String);
check(userId, String);
check(authToken, String);
@ -26,7 +26,7 @@ export default function createDummyUser2x(meetingId, userId, authToken) {
return Logger.error(`Creating dummy user to collection: ${err}`);
}
Logger.info(`Created dummy user 2x id=${userId} token=${authToken} meeting=${meetingId}`);
Logger.info(`Created dummy user id=${userId} token=${authToken} meeting=${meetingId}`);
};
return Users.insert(doc, cb);

View File

@ -6,7 +6,7 @@ import mapToAcl from '/imports/startup/mapToAcl';
import userLeaving from './methods/userLeaving';
Meteor.publish('current-user2x', (credentials) => {
Meteor.publish('current-user', (credentials) => {
const { meetingId, requesterUserId, requesterToken } = credentials;
check(meetingId, String);
@ -57,7 +57,7 @@ function users(credentials) {
},
};
Logger.info(`Publishing Users2x for ${meetingId} ${requesterUserId} ${requesterToken}`);
Logger.info(`Publishing Users for ${meetingId} ${requesterUserId} ${requesterToken}`);
return Users.find(selector, options);
}
@ -67,4 +67,4 @@ function publish(...args) {
return mapToAcl('subscriptions.users', boundUsers)(args);
}
Meteor.publish('users2x', publish);
Meteor.publish('users', publish);

View File

@ -84,8 +84,8 @@ Base.propTypes = propTypes;
Base.defaultProps = defaultProps;
const SUBSCRIPTIONS_NAME = [
'users2x', 'chat2x', 'cursor2x', 'meetings2x', 'polls2x', 'presentations2x', 'annotations',
'slides2x', 'captions2x', 'breakouts2x', 'voiceUsers', 'whiteboard-multi-user',
'users', 'chat', 'cursor', 'meetings', 'polls', 'presentations', 'annotations',
'slides', 'captions', 'breakouts', 'voiceUsers', 'whiteboard-multi-user',
];
const BaseContainer = createContainer(({ params }) => {

View File

@ -90,7 +90,7 @@ class MettingMessageQueue {
}
}
class RedisPubSub2x {
class RedisPubSub {
static handlePublishError(err) {
if (err) {
@ -189,7 +189,7 @@ class RedisPubSub2x {
const envelope = makeEnvelope(channel, eventName, header, payload);
return this.pub.publish(channel, envelope, RedisPubSub2x.handlePublishError);
return this.pub.publish(channel, envelope, RedisPubSub.handlePublishError);
}
publishSystemMessage(channel, eventName, payload) {
@ -199,7 +199,7 @@ class RedisPubSub2x {
const envelope = makeEnvelope(channel, eventName, header, payload);
return this.pub.publish(channel, envelope, RedisPubSub2x.handlePublishError);
return this.pub.publish(channel, envelope, RedisPubSub.handlePublishError);
}
publishMeetingMessage(channel, eventName, meetingId, payload) {
@ -210,7 +210,7 @@ class RedisPubSub2x {
const envelope = makeEnvelope(channel, eventName, header, payload);
return this.pub.publish(channel, envelope, RedisPubSub2x.handlePublishError);
return this.pub.publish(channel, envelope, RedisPubSub.handlePublishError);
}
publishUserMessage(channel, eventName, meetingId, userId, payload) {
@ -222,11 +222,11 @@ class RedisPubSub2x {
const envelope = makeEnvelope(channel, eventName, header, payload);
return this.pub.publish(channel, envelope, RedisPubSub2x.handlePublishError);
return this.pub.publish(channel, envelope, RedisPubSub.handlePublishError);
}
}
const RedisPubSubSingleton = new RedisPubSub2x();
const RedisPubSubSingleton = new RedisPubSub();
Meteor.startup(() => {
const REDIS_CONFIG = Meteor.settings.redis;

View File

@ -28,7 +28,6 @@ const propTypes = {
actionsbar: PropTypes.node,
media: PropTypes.node,
location: PropTypes.object.isRequired,
children: PropTypes.node,
};
const defaultProps = {
@ -70,9 +69,7 @@ const AppContainer = (props) => {
actionsbar={actionsbar}
media={media}
{...otherProps}
>
{props.children}
</App>
/>
);
};

View File

@ -120,7 +120,7 @@ class ChatDropdown extends Component {
>
<DropdownTrigger
tabIndex={0}
ariaLabel={intl.formatMessage(intlMessages.options)}
aria-label={intl.formatMessage(intlMessages.options)}
className={styles.btn}
>
<Icon iconName="more" />

View File

@ -41,7 +41,17 @@ export default class DropdownTrigger extends Component {
}
render() {
const { children, className, ...restProps } = this.props;
const remainingProps = { ...this.props };
delete remainingProps.dropdownToggle;
delete remainingProps.dropdownShow;
delete remainingProps.dropdownHide;
const {
children,
className,
...restProps
} = remainingProps;
const TriggerComponent = React.Children.only(children);
const TriggerComponentBounded = React.cloneElement(TriggerComponent, {

View File

@ -45,6 +45,9 @@ const openBreakoutJoinConfirmation = (breakoutURL, breakoutName, mountModal) =>
breakoutName={breakoutName}
/>);
const closeBreakoutJoinConfirmation = (mountModal) =>
mountModal(null);
class NavBar extends Component {
constructor(props) {
super(props);
@ -143,13 +146,20 @@ class NavBar extends Component {
);
}
componentDidUpdate() {
componentDidUpdate(oldProps) {
const {
breakouts,
getBreakoutJoinURL,
isBreakoutRoom,
} = this.props;
const hadBreakouts = oldProps.breakouts.length;
const hasBreakouts = breakouts.length;
if(!hasBreakouts && hadBreakouts) {
closeBreakoutJoinConfirmation(this.props.mountModal);
}
breakouts.forEach((breakout) => {
if (!breakout.users) {
return;

View File

@ -191,7 +191,6 @@ class UserParticipants extends Component {
className={styles.scrollableList}
role="tabpanel"
tabIndex={0}
refScrollContainer
ref={(ref) => { this.refScrollContainer = ref; }}
>
<CSSTransitionGroup

View File

@ -3,7 +3,7 @@ import { Tracker } from 'meteor/tracker';
import Storage from '/imports/ui/services/storage/session';
import Users2x from '/imports/api/users';
import Users from '/imports/api/users';
import { makeCall, logClient } from '/imports/ui/services/api';
const CONNECTION_TIMEOUT = Meteor.settings.public.app.connectionTimeout;
@ -158,7 +158,7 @@ class Auth {
});
}, 5000);
const subscription = Meteor.subscribe('current-user2x', credentials);
const subscription = Meteor.subscribe('current-user', credentials);
if (!subscription.ready()) return;
resolve(c);
@ -187,7 +187,7 @@ class Auth {
Tracker.autorun((c) => {
const selector = { meetingId: this.meetingID, userId: this.userID };
const query = Users2x.find(selector);
const query = Users.find(selector);
query.observeChanges({
changed: (id, fields) => {
@ -208,7 +208,7 @@ class Auth {
});
});
makeCall('validateAuthToken2x');
makeCall('validateAuthToken');
});
}

View File

@ -72,8 +72,11 @@ class Caption:
if i < len(self.timestamps) and timestamp > self.timestamps[i]:
timestamp = self._del_timestamps[i]
if timestamp is None and i > 0:
timestamp = self.timestamps[i-1]
if timestamp is None:
if i > 0:
timestamp = self.timestamps[i-1]
else:
timestamp = self.timestamps[i]
logger.debug("Out of order timestamps, using ts: %d", timestamp)
self._del_timestamps[i:j] = [del_timestamp] * len(text)