Merge branch 'v2.0.x-release' of github.com:bigbluebutton/bigbluebutton into update-with-20
This commit is contained in:
commit
cfec9de678
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -144,8 +144,7 @@ phonecomponents|MuteMeButton {
|
||||
.toolbarMainBox {
|
||||
backgroundColor : #FFFFFF;
|
||||
paddingTop : 0;
|
||||
paddingBottom : 0;
|
||||
verticalGap : 0;
|
||||
paddingBottom : 6;
|
||||
}
|
||||
|
||||
.breakoutRoomRibbon {
|
||||
@ -164,7 +163,7 @@ phonecomponents|MuteMeButton {
|
||||
}
|
||||
|
||||
.topBoxStyle {
|
||||
paddingTop : 0;
|
||||
paddingTop : 6;
|
||||
paddingBottom : 0;
|
||||
paddingLeft : 8;
|
||||
paddingRight : 8;
|
||||
@ -437,7 +436,7 @@ mx|Button {
|
||||
borderAlphaUp : 1;
|
||||
borderAlphaOver : 1;
|
||||
borderAlphaDown : 1;
|
||||
borderAlphaDisabled : 1;
|
||||
borderAlphaDisabled : 0.25;
|
||||
|
||||
borderThickness : 1;
|
||||
|
||||
@ -554,6 +553,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");
|
||||
@ -644,7 +647,7 @@ chat|AddChatTabBox {
|
||||
}
|
||||
|
||||
.chatOptionsLabel {
|
||||
fontSize : 14;
|
||||
fontSize : 14;
|
||||
}
|
||||
|
||||
.chatMessageListStyle {
|
||||
@ -771,10 +774,6 @@ mx|DataGrid {
|
||||
//------------------------------
|
||||
*/
|
||||
|
||||
.deskshareControlButtonStyle {
|
||||
cornerRadius : 18;
|
||||
}
|
||||
|
||||
.deskshareWarningLabelStyle {
|
||||
fontWeight : bold;
|
||||
fontSize : 18;
|
||||
@ -937,6 +936,7 @@ views|LockSettings {
|
||||
*/
|
||||
|
||||
views|MainApplicationShell {
|
||||
borderStyle : none;
|
||||
paddingBottom : 0;
|
||||
verticalGap : 0;
|
||||
}
|
||||
@ -1089,6 +1089,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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -40,7 +40,7 @@ package org.bigbluebutton.skins {
|
||||
import flash.display.DisplayObjectContainer;
|
||||
import flash.utils.describeType;
|
||||
import flash.utils.getQualifiedClassName;
|
||||
|
||||
|
||||
import mx.core.EdgeMetrics;
|
||||
import mx.core.UIComponent;
|
||||
import mx.skins.Border;
|
||||
@ -48,17 +48,6 @@ package org.bigbluebutton.skins {
|
||||
|
||||
public class TabSkin extends Border {
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
//
|
||||
// Class variables
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
private static var cache:Object = {};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
//
|
||||
// Overridden properties
|
||||
|
@ -383,6 +383,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
|
||||
@ -462,6 +463,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?
|
||||
@ -475,6 +477,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
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,23 +74,22 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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") {
|
||||
dispatcher.dispatchEvent(new UseFlashModeCommand());
|
||||
}
|
||||
else {
|
||||
if (BrowserCheck.isPuffin46AndAbove() || (!BrowserCheck.isHttps() && ((BrowserCheck.isChrome() && BrowserCheck.browserMajorVersion >= "60") || (BrowserCheck.isOpera() && BrowserCheck.browserMajorVersion >= "47")))) {
|
||||
dispatcher.dispatchEvent(new UseFlashModeCommand());
|
||||
} else {
|
||||
var command:JoinVoiceConferenceCommand = new JoinVoiceConferenceCommand();
|
||||
command.mic = true;
|
||||
dispatcher.dispatchEvent(command);
|
||||
}
|
||||
|
||||
|
||||
PopUpUtil.removePopUp(this);
|
||||
}
|
||||
|
||||
@ -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));
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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>
|
||||
|
@ -25,8 +25,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
width="600" height="390"
|
||||
verticalScrollPolicy="off"
|
||||
creationComplete="onCreationComplete()"
|
||||
showCloseButton="false"
|
||||
close="onCancelClicked()"
|
||||
showCloseButton="false"
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -131,7 +131,6 @@ $Id: $
|
||||
public function closeWindow():void {
|
||||
this.visible = false;
|
||||
PopUpManager.removePopUp(this);
|
||||
//dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
|
||||
}
|
||||
|
||||
]]>
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
@ -311,14 +312,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 {
|
||||
@ -528,8 +526,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 {
|
||||
|
@ -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" />
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 mx.managers.PopUpManager;
|
||||
|
||||
import org.bigbluebutton.modules.layout.events.LayoutEvent;
|
||||
import org.bigbluebutton.modules.layout.events.LayoutNameInUseEvent;
|
||||
import org.bigbluebutton.util.i18n.ResourceUtil;
|
||||
import com.asfusion.mate.events.Dispatcher;
|
||||
|
||||
import mx.managers.PopUpManager;
|
||||
|
||||
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>
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
@ -44,6 +47,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>
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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;
|
||||
@ -343,23 +341,19 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
captureWidth = capWidth;
|
||||
captureHeight = capHeight;
|
||||
|
||||
var vidW:Number = captureWidth;
|
||||
var vidH:Number = captureHeight;
|
||||
video = new Video(captureWidth, captureHeight);
|
||||
|
||||
// for some reason videoHolder's height is always '0' even when set to 100% so we have to do it manually
|
||||
video.width=this.width - publishView.getStyle('paddingLeft') - publishView.getStyle('paddingRight') - 10;
|
||||
video.scaleY=video.scaleX;
|
||||
if(video.height>this.height - controlBar.height - this.titleBar.height - publishView.getStyle('paddingTop') - publishView.getStyle('paddingBottom') - 10){
|
||||
video.height=this.height - controlBar.height - this.titleBar.height - publishView.getStyle('paddingTop') - publishView.getStyle('paddingBottom') - 10;
|
||||
video.scaleX=video.scaleY;
|
||||
}
|
||||
videoWrapper.width = video.width;
|
||||
videoWrapper.height = video.height;
|
||||
|
||||
// for some reason videoHolder's height is always '0' even when set to 100% so we have to do it manually
|
||||
videoWrapper.height = this.height - controlBar.height - this.titleBar.height - pauseBtn.height - publishView.getStyle('paddingTop') - publishView.getStyle('paddingBottom') - 10;
|
||||
videoWrapper.width = this.width - publishView.getStyle('paddingLeft') - publishView.getStyle('paddingRight') - 10;
|
||||
|
||||
vidW = videoWrapper.width;
|
||||
vidH = videoWrapper.width * captureHeight / captureWidth;
|
||||
|
||||
if (vidH > videoWrapper.height) {
|
||||
vidH = videoWrapper.height;
|
||||
vidW = videoWrapper.height * captureWidth / captureHeight;
|
||||
}
|
||||
|
||||
LOGGER.debug("deskshare preview[" + captureWidth + "," + captureHeight + "][" + vidW + "," + vidH + "]");
|
||||
video = new Video(vidW, vidH);
|
||||
LOGGER.debug("deskshare preview[" + captureWidth + "," + captureHeight + "][" + video.width + "," + video.height + "]");
|
||||
|
||||
videoWrapper.addChild(video);
|
||||
video.x = videoWrapper.width/2 - video.width/2;
|
||||
@ -377,8 +371,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pauseBox.visible = pauseBox.includeInLayout = false;
|
||||
videoWrapper.visible = videoWrapper.includeInLayout = true;
|
||||
pauseBox.width = vidW;
|
||||
pauseBox.height = vidH;
|
||||
|
||||
pauseBox.width = videoWrapper.width;
|
||||
pauseBox.height = videoWrapper.height;
|
||||
}
|
||||
|
||||
public function onMetaData(info:Object):void{
|
||||
@ -586,20 +581,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
</mx:VBox>
|
||||
<mx:VBox id="previewBox" width="100%" height="100%" visible="false" horizontalAlign="center" >
|
||||
<mx:Box id="videoHolder" width="100%" height="90%" horizontalAlign="center">
|
||||
<mx:UIComponent id="videoWrapper" width="100%" height="100%" />
|
||||
<mx:UIComponent id="videoWrapper" width="100%" height="100%" verticalCenter="0" horizontalCenter="0"/>
|
||||
<mx:VBox id="pauseBox" visible="false" includeInLayout="false" styleName="desksharePublishPauseBox" >
|
||||
<mx:Text width="100%" textAlign="center" styleName="desktopShareTextStyle" text="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pauseMessage.label')}" />
|
||||
</mx:VBox>
|
||||
</mx:Box>
|
||||
<mx:Button id="pauseBtn"
|
||||
click="pauseSharing()"
|
||||
toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.tooltip')}"
|
||||
label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.label')}" />
|
||||
<mx:Button id="restartBtn"
|
||||
visible="false" includeInLayout="false"
|
||||
click="pauseSharing()"
|
||||
toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.tooltip')}"
|
||||
label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.label')}" />
|
||||
</mx:VBox>
|
||||
<mx:VBox id="errorBox" width="100%" height="100%" visible="false" includeInLayout="false" horizontalAlign="center" verticalAlign="middle">
|
||||
<mx:Text id="startFailedLbl" width="70%" visible="false" includeInLayout="false" textAlign="center" styleName="desktopShareTextStyle" text="{ResourceUtil.getInstance().getString('bbb.screensharePublish.startFailed.label')}"/>
|
||||
@ -619,6 +605,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<mx:ComboBox id="shareTypeCombo" dataProvider="{shareTypeProvider}" />
|
||||
</mx:HBox>
|
||||
<mx:Spacer width="80%" />
|
||||
<mx:Button id="pauseBtn" visible="false" includeInLayout="false" click="pauseSharing()" toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.tooltip')}" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.pause.label')}" />
|
||||
<mx:Button id="restartBtn" visible="false" includeInLayout="false" click="pauseSharing()" toolTip="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.tooltip')}" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.label')}" />
|
||||
<mx:Button id="startBtn" styleName="mainActionButton" click="onStartButtonClick()" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.startButton.label')}" />
|
||||
<mx:Button id="cancelBtn" click="closeWindow()" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.cancelButton.label')}" />
|
||||
<mx:Button id="stopBtn" styleName="mainActionButton" visible="false" includeInLayout="false" click="close()" label="{ResourceUtil.getInstance().getString('bbb.screensharePublish.stopButton.label')}" />
|
||||
|
@ -27,13 +27,14 @@
|
||||
width="100%"
|
||||
height="400"
|
||||
initialize="init()"
|
||||
layout="absolute"
|
||||
creationComplete="onCreationComplete()"
|
||||
implements="org.bigbluebutton.common.IBbbModuleWindow"
|
||||
xmlns:mate="http://mate.asfusion.com/"
|
||||
title="{ ResourceUtil.getInstance().getString('bbb.screenshareView.title') }"
|
||||
showCloseButton="false"
|
||||
resize="fitToWindow()">
|
||||
|
||||
|
||||
<fx:Declarations>
|
||||
<mate:Listener type="{ ViewStreamEvent.STOP }" method="onStopViewStreamEvent" />
|
||||
<mate:Listener type="{ LocaleChangeEvent.LOCALE_CHANGED }" method="localeChanged" />
|
||||
@ -42,6 +43,7 @@
|
||||
|
||||
<fx:Script>
|
||||
<![CDATA[
|
||||
import mx.core.ScrollPolicy;
|
||||
import mx.core.UIComponent;
|
||||
|
||||
import flexlib.mdi.events.MDIWindowEvent;
|
||||
@ -66,9 +68,6 @@
|
||||
private static const LOG:String = "SC::ScreenshareViewWIndow - ";
|
||||
private static const LOGGER:ILogger = getClassLogger(ScreenshareViewWindow);
|
||||
|
||||
private var screenHeight:Number = Capabilities.screenResolutionY;
|
||||
private var screenWidth:Number = Capabilities.screenResolutionX;
|
||||
|
||||
private var streamAvailable:Boolean = false;
|
||||
|
||||
private var video:Video;
|
||||
@ -79,7 +78,7 @@
|
||||
private var videoWidth:Number = 1;
|
||||
|
||||
private static const VIDEO_WIDTH_PADDING:int = 7;
|
||||
private static const VIDEO_HEIGHT_PADDING:int = 65;
|
||||
private static const VIDEO_HEIGHT_PADDING:int = 40;
|
||||
|
||||
// The following code block is to deal with a bug in FLexLib
|
||||
// with MDI windows not responding well to being maximized
|
||||
@ -90,19 +89,17 @@
|
||||
private var isMaximized:Boolean = false;
|
||||
private var connection:Connection;
|
||||
|
||||
[Bindable] private var baseIndex:int;
|
||||
[Bindable] private var dsOptions:ScreenshareOptions;
|
||||
|
||||
private function init():void{
|
||||
dsOptions = Options.getOptions(ScreenshareOptions) as ScreenshareOptions;
|
||||
baseIndex = dsOptions.baseTabIndex;
|
||||
}
|
||||
|
||||
private function onCreationComplete():void{
|
||||
viewScreenshareStream();
|
||||
|
||||
videoHolder.addChild(video);
|
||||
this.addChild(videoHolder);
|
||||
videoCanvas.addChildAt(videoHolder, 0);
|
||||
videoHolder.percentWidth = 100;
|
||||
videoHolder.percentHeight = 100;
|
||||
addEventListener(MDIWindowEvent.RESIZE_END, onResizeEndEvent);
|
||||
@ -111,11 +108,6 @@
|
||||
|
||||
resourcesChanged();
|
||||
|
||||
titleBarOverlay.tabIndex = baseIndex;
|
||||
minimizeBtn.tabIndex = baseIndex+1;
|
||||
maximizeRestoreBtn.tabIndex = baseIndex+2;
|
||||
closeBtn.tabIndex = baseIndex+3;
|
||||
|
||||
var logData:Object = UsersUtil.initLogData();
|
||||
logData.tags = ["screenshare"];
|
||||
logData.width = videoWidth;
|
||||
@ -186,19 +178,6 @@
|
||||
LOGGER.info(JSON.stringify(logData));
|
||||
}
|
||||
|
||||
protected function updateButtonsPosition():void {
|
||||
if (this.width < bottomBar.width) {
|
||||
bottomBar.visible = false;
|
||||
}
|
||||
|
||||
if (bottomBar.visible == false) {
|
||||
bottomBar.y = bottomBar.x = 0;
|
||||
} else {
|
||||
bottomBar.y = (this.height - bottomBar.height) / 2;
|
||||
bottomBar.x = (this.width - bottomBar.width) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
public function stopViewing():void {
|
||||
ns.close();
|
||||
closeWindow();
|
||||
@ -239,7 +218,7 @@
|
||||
}
|
||||
|
||||
/**
|
||||
* resizes the desktop sharing video to fit to this window
|
||||
* Resizes the desktop sharing video to fit to this window
|
||||
*/
|
||||
private function fitToWindow():void {
|
||||
if (!streamAvailable)
|
||||
@ -253,15 +232,23 @@
|
||||
if (!btnActualSize.selected) {
|
||||
fitVideoToWindow();
|
||||
}
|
||||
|
||||
videoHolder.verticalCenter = 0;
|
||||
videoHolder.horizontalCenter = 0;
|
||||
}
|
||||
|
||||
|
||||
private function fitVideoToWindow():void {
|
||||
if (this.width < this.height) {
|
||||
fitToWidthAndAdjustHeightToMaintainAspectRatio();
|
||||
} else {
|
||||
fitToHeightAndAdjustWidthToMaintainAspectRatio();
|
||||
video.width=this.width - VIDEO_WIDTH_PADDING;
|
||||
video.scaleY=video.scaleX;
|
||||
if(video.height>this.height - VIDEO_HEIGHT_PADDING){
|
||||
video.height=this.height - VIDEO_HEIGHT_PADDING;
|
||||
video.scaleX=video.scaleY;
|
||||
}
|
||||
videoHolder.width = video.width;
|
||||
videoHolder.height = video.height;
|
||||
|
||||
videoCanvas.verticalScrollPolicy = ScrollPolicy.OFF;
|
||||
videoCanvas.horizontalScrollPolicy = ScrollPolicy.OFF;
|
||||
}
|
||||
|
||||
private function fitWindowToVideo():void {
|
||||
@ -269,33 +256,12 @@
|
||||
videoHolder.width = videoWidth;
|
||||
video.height = videoHeight;
|
||||
videoHolder.height = videoHeight;
|
||||
this.height = videoHeight + VIDEO_HEIGHT_PADDING;
|
||||
this.width = videoWidth + VIDEO_WIDTH_PADDING;
|
||||
}
|
||||
|
||||
private function videoIsSmallerThanWindow():Boolean {
|
||||
return (videoHeight < this.height) && (videoWidth < this.width);
|
||||
}
|
||||
|
||||
|
||||
private function fitToWidthAndAdjustHeightToMaintainAspectRatio():void {
|
||||
video.width = this.width - VIDEO_WIDTH_PADDING;
|
||||
videoHolder.width = video.width;
|
||||
// Maintain aspect-ratio
|
||||
video.height = (videoHeight * video.width) / videoWidth;
|
||||
videoHolder.height = video.height;
|
||||
this.height = video.height + VIDEO_HEIGHT_PADDING;
|
||||
}
|
||||
|
||||
private function fitToHeightAndAdjustWidthToMaintainAspectRatio():void {
|
||||
video.height = this.height - VIDEO_HEIGHT_PADDING;
|
||||
videoHolder.height = video.height;
|
||||
// Maintain aspect-ratio
|
||||
video.width = (videoWidth * video.height) / videoHeight;
|
||||
videoHolder.width = video.width;
|
||||
this.width = video.width + VIDEO_WIDTH_PADDING;
|
||||
}
|
||||
|
||||
/**
|
||||
* resizes the desktop sharing video to actual video resolution
|
||||
*/
|
||||
@ -308,6 +274,9 @@
|
||||
video.height = videoHeight;
|
||||
videoHolder.height = videoHeight;
|
||||
}
|
||||
|
||||
videoCanvas.verticalScrollPolicy = ScrollPolicy.AUTO;
|
||||
videoCanvas.horizontalScrollPolicy = ScrollPolicy.AUTO;
|
||||
}
|
||||
|
||||
private function determineHowToDisplayVideo():void {
|
||||
@ -354,17 +323,20 @@
|
||||
]]>
|
||||
</fx:Script>
|
||||
|
||||
<mx:HBox id="bottomBar" visible="true" height="30" horizontalAlign="center" paddingTop="0" paddingBottom="0" width="100%">
|
||||
<mx:Button id="btnActualSize"
|
||||
paddingTop="0"
|
||||
paddingBottom="0"
|
||||
styleName="deskshareControlButtonStyle"
|
||||
toggle="true"
|
||||
click="determineHowToDisplayVideo()"
|
||||
selected="false"
|
||||
height="90%"
|
||||
label="{ btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.screenshareView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.screenshareView.actualSize') }"
|
||||
toolTip="{ btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.screenshareView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.screenshareView.actualSize') }"
|
||||
tabIndex="{ baseIndex + 4 }" />
|
||||
</mx:HBox>
|
||||
<fx:Declarations>
|
||||
<common:TabIndexer id="tabIndexer" startIndex="{dsOptions.baseTabIndex + 1}"
|
||||
tabIndices="{[minimizeBtn, maximizeRestoreBtn, closeBtn, btnActualSize]}"/>
|
||||
</fx:Declarations>
|
||||
|
||||
<mx:Canvas id="videoCanvas" width="100%" height="100%" />
|
||||
<mx:Button id="btnActualSize"
|
||||
toggle="true"
|
||||
horizontalCenter="0"
|
||||
top="{VIDEO_HEIGHT_PADDING}"
|
||||
click="determineHowToDisplayVideo()"
|
||||
mouseOut="btnActualSize.alpha = 0"
|
||||
mouseOver="btnActualSize.alpha = 100"
|
||||
selected="false"
|
||||
label="{ btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.screenshareView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.screenshareView.actualSize') }"
|
||||
toolTip="{ btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.screenshareView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.screenshareView.actualSize') }"/>
|
||||
</common:CustomMdiWindow>
|
||||
|
@ -23,21 +23,22 @@ 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[
|
||||
import com.asfusion.mate.events.Dispatcher;
|
||||
|
||||
|
||||
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;
|
||||
|
@ -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 {
|
||||
|
@ -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">
|
||||
|
||||
|
@ -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.*">
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
7
bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as
Normal file → Executable file
7
bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserAvatar.as
Normal file → Executable file
@ -3,6 +3,8 @@ package org.bigbluebutton.modules.videoconf.views
|
||||
import flash.display.Loader;
|
||||
import flash.events.Event;
|
||||
import flash.net.URLRequest;
|
||||
|
||||
import mx.core.UIComponent;
|
||||
|
||||
public class UserAvatar extends UserGraphic {
|
||||
|
||||
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
95
bigbluebutton-client/src/org/bigbluebutton/util/browser/BrowserCheck.as
Executable file
95
bigbluebutton-client/src/org/bigbluebutton/util/browser/BrowserCheck.as
Executable 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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 });
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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)'));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -37,4 +37,4 @@ function publish(...args) {
|
||||
return mapToAcl('subscriptions.chat', boundChat)(args);
|
||||
}
|
||||
|
||||
Meteor.publish('chat2x', publish);
|
||||
Meteor.publish('chat', publish);
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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}`);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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}!)`);
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)'));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)'));
|
||||
}
|
||||
|
@ -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}`);
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -21,4 +21,4 @@ function publish(...args) {
|
||||
return mapToAcl('subscriptions.slides', boundSlides)(args);
|
||||
}
|
||||
|
||||
Meteor.publish('slides2x', publish);
|
||||
Meteor.publish('slides', publish);
|
||||
|
@ -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:
|
||||
|
@ -16,4 +16,4 @@ Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', 'method
|
||||
kickUser,
|
||||
}));
|
||||
|
||||
Meteor.methods({ validateAuthToken2x: validateAuthToken });
|
||||
Meteor.methods({ validateAuthToken, });
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -87,8 +87,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 }) => {
|
||||
|
@ -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;
|
||||
|
@ -28,7 +28,6 @@ const propTypes = {
|
||||
actionsbar: PropTypes.node,
|
||||
media: PropTypes.node,
|
||||
location: PropTypes.object.isRequired,
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
|
||||
const defaultProps = {
|
||||
@ -69,9 +68,7 @@ const AppContainer = (props) => {
|
||||
actionsbar={actionsbar}
|
||||
media={media}
|
||||
{...otherProps}
|
||||
>
|
||||
{props.children}
|
||||
</App>
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -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" />
|
||||
|
@ -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, {
|
||||
|
@ -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;
|
||||
|
@ -191,7 +191,6 @@ class UserParticipants extends Component {
|
||||
className={styles.scrollableList}
|
||||
role="tabpanel"
|
||||
tabIndex={0}
|
||||
refScrollContainer
|
||||
ref={(ref) => { this.refScrollContainer = ref; }}
|
||||
>
|
||||
<CSSTransitionGroup
|
||||
|
@ -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');
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user