Merge branch 'v2.0.x-release' of github.com:bigbluebutton/bigbluebutton into update-with-20

This commit is contained in:
Richard Alam 2017-10-19 18:20:25 -07:00
commit cfec9de678
91 changed files with 881 additions and 461 deletions

View File

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

View File

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

View File

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

View File

@ -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

View File

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

View File

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

View File

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

View File

@ -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

View File

@ -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

View File

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

View File

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

View File

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

View File

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

View File

@ -23,9 +23,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
show="this.setFocus()"
initialize="init()"
layout="absolute"
close="onCancelClicked()"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
showCloseButton="false">
@ -44,18 +45,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.phone.events.JoinVoiceConferenceCommand;
import org.bigbluebutton.modules.phone.events.UseFlashModeCommand;
import org.bigbluebutton.modules.phone.models.PhoneOptions;
import org.bigbluebutton.util.browser.BrowserCheck;
import org.bigbluebutton.util.i18n.ResourceUtil;
private static const LOGGER:ILogger = getClassLogger(AudioSelectionWindow);
private var phoneOptions:PhoneOptions;
private var browserInfo:Array;
private function init():void {
phoneOptions = Options.getOptions(PhoneOptions) as PhoneOptions;
browserInfo = JSAPI.getInstance().getBrowserInfo();
if (!phoneOptions.listenOnlyMode)
btnListenOnly.enabled = false;
@ -75,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));

View File

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

View File

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

View File

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

View File

@ -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();
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -75,6 +75,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.common.events.ToolbarButtonEvent;
import org.bigbluebutton.core.BBB;
import org.bigbluebutton.core.Options;
import org.bigbluebutton.core.PopUpUtil;
import org.bigbluebutton.core.TimerUtil;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.events.MeetingTimeRemainingEvent;
@ -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 {

View File

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

View File

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

View File

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

View File

@ -22,14 +22,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
horizontalAlign="center"
showCloseButton="true"
close="onCancelClicked()"
layout="absolute"
showCloseButton="false"
creationComplete="onCreationComplete()"
width="250"
title="{ResourceUtil.getInstance().getString('bbb.layout.window.name')}">
width="280">
<fx:Declarations>
<mate:Listener type="{LayoutNameInUseEvent.LAYOUT_NAME_IN_USE_EVENT}" method="handleLayoutNameInUse"/>
@ -37,13 +38,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<fx:Script>
<![CDATA[
import com.asfusion.mate.events.Dispatcher;
import 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>

View File

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

View File

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

View File

@ -24,9 +24,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mate="http://mate.asfusion.com/"
xmlns:common="org.bigbluebutton.common.*"
implements="org.bigbluebutton.common.IKeyboardClose"
layout="absolute"
width="580"
height="410"
creationComplete="creationCompleteHandler(event)"
close="onCancelClicked()"
initialize="initData();" >
@ -37,6 +39,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import org.bigbluebutton.modules.present.events.DownloadEvent;
import org.bigbluebutton.modules.present.model.PresentationModel;
@ -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>

View File

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

View File

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

View File

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

View File

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

View File

@ -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>

View File

@ -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;

View File

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

View File

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

View File

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

View File

@ -375,7 +375,7 @@ $Id: $
}
private function openEmojiStatusMenu():void {
var moodMenu:MoodMenu = PopUpUtil.createNonModelPopUp(DisplayObject(FlexGlobals.topLevelApplication), MoodMenu, false) as MoodMenu;
var moodMenu:MoodMenu = PopUpUtil.createNonModalPopUp(DisplayObject(FlexGlobals.topLevelApplication), MoodMenu, false) as MoodMenu;
moodMenu.btn = emojiStatusBtn;
moodMenu.show();
}

View File

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

View File

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

View File

@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 }) => {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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