diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java new file mode 100755 index 0000000000000000000000000000000000000000..84d54dbe0607e6b583b00438c2d7a5abb6b6acf7 --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java @@ -0,0 +1,57 @@ +package org.bigbluebutton.common.messages; + +import java.util.HashMap; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class UserSharedWebcamMessage implements ISubscribedMessage { + public static final String USER_SHARED_WEBCAM = "user_shared_webcam_message"; + public static final String VERSION = "0.0.1"; + + public final String meetingId; + public final String userId; + public final String stream; + + public UserSharedWebcamMessage(String meetingId, String userId, String stream) { + this.meetingId = meetingId; + this.userId = userId; + this.stream = stream; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(Constants.MEETING_ID, meetingId); + payload.put(Constants.USER_ID, userId); + payload.put(Constants.STREAM, stream); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARED_WEBCAM, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UserSharedWebcamMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (USER_SHARED_WEBCAM.equals(messageName)) { + if (payload.has(Constants.MEETING_ID) + && payload.has(Constants.USER_ID) + && payload.has(Constants.STREAM)) { + String id = payload.get(Constants.MEETING_ID).getAsString(); + String userid = payload.get(Constants.USER_ID).getAsString(); + String stream = payload.get(Constants.STREAM).getAsString(); + return new UserSharedWebcamMessage(id, userid, stream); + } + } + } + } + return null; + + } +} diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java new file mode 100755 index 0000000000000000000000000000000000000000..8b51b3f1e49e79fbb6d9e5da4ad6047500d4836e --- /dev/null +++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java @@ -0,0 +1,59 @@ +package org.bigbluebutton.common.messages; + +import java.util.HashMap; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + + +public class UserUnshareWebcamRequestMessage implements ISubscribedMessage { + public static final String USER_UNSHARE_WEBCAM_REQUEST = "user_unshare_webcam_request_message"; + public static final String VERSION = "0.0.1"; + + public final String meetingId; + public final String userId; + public final String stream; + + public UserUnshareWebcamRequestMessage(String meetingId, String userId, String stream) { + this.meetingId = meetingId; + this.userId = userId; + this.stream = stream; + } + + public String toJson() { + HashMap<String, Object> payload = new HashMap<String, Object>(); + payload.put(Constants.MEETING_ID, meetingId); + payload.put(Constants.USER_ID, userId); + payload.put(Constants.STREAM, stream); + + java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARE_WEBCAM_REQUEST, VERSION, null); + + return MessageBuilder.buildJson(header, payload); + } + + public static UserUnshareWebcamRequestMessage fromJson(String message) { + JsonParser parser = new JsonParser(); + JsonObject obj = (JsonObject) parser.parse(message); + + if (obj.has("header") && obj.has("payload")) { + JsonObject header = (JsonObject) obj.get("header"); + JsonObject payload = (JsonObject) obj.get("payload"); + + if (header.has("name")) { + String messageName = header.get("name").getAsString(); + if (USER_UNSHARE_WEBCAM_REQUEST.equals(messageName)) { + if (payload.has(Constants.MEETING_ID) + && payload.has(Constants.USER_ID) + && payload.has(Constants.STREAM)) { + String id = payload.get(Constants.MEETING_ID).getAsString(); + String userid = payload.get(Constants.USER_ID).getAsString(); + String stream = payload.get(Constants.STREAM).getAsString(); + return new UserUnshareWebcamRequestMessage(id, userid, stream); + } + } + } + } + return null; + + } +} diff --git a/bigbluebutton-client/branding/default/style/css/V2Theme.css b/bigbluebutton-client/branding/default/style/css/V2Theme.css index 75c56dcae44ddf20a569d42859ac0f4370acf31b..bf64488ee2f431f9b85b7e10a655173cafafaf55 100644 --- a/bigbluebutton-client/branding/default/style/css/V2Theme.css +++ b/bigbluebutton-client/branding/default/style/css/V2Theme.css @@ -8,6 +8,7 @@ @namespace layout "org.bigbluebutton.modules.layout.views.*"; @namespace presentation "org.bigbluebutton.modules.present.ui.views.*"; @namespace sharednotes "org.bigbluebutton.modules.sharednotes.views.components.*"; +@namespace chat "org.bigbluebutton.modules.chat.views.*"; /* //------------------------------ @@ -38,8 +39,8 @@ global { fontFamily : "Source Sans Pro", Arial, sans-serif; fontSize : 13; color : #2A2D33; - selectionColor : #3B97D3; - focusColor : #3B97D3; + selectionColor : #1070D7; + focusColor : #1070D7; } .defaultShellStyle { @@ -92,10 +93,10 @@ mx|Application { borderAlphaDisabled : 0; fillColorUp : #EFF5FA; - borderColorOver : #3797D3; - borderColorDown : #3797D3; + borderColorOver : #1070D7; + borderColorDown : #1070D7; - borderThikness : 5; + borderThickness : 5; cornerRadius : 70; } @@ -124,16 +125,10 @@ mx|Application { */ mx|ApplicationControlBar { - cornerRadius : 0; - dropShadowColor : #ABABAB; - dropShadowEnabled : true; - fillAlphas : 1, 1; - fillColors : #FFFFFF, #FFFFFF; - backgroundColor : #FFFFFF; - backgroundAlpha : 1; - highlightAlphas : 0, 0; - shadowDistance : 1; - shadowDirection : center; + cornerRadius : 0; + fillAlphas : 1, 1; + fillColors : #FFFFFF, #FFFFFF; + highlightAlphas : 0, 0; } .toolbarSeparator { @@ -169,25 +164,44 @@ mx|ApplicationControlBar { icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Settings"); } -.webcamDefaultButtonStyle, .webcamOnButtonStyle, .webcamOffButtonStyle, -.deskshareDefaultButtonStyle, .deskshareOnButtonStyle, .deskshareOffButtonStyle, +.webcamDefaultButtonStyle, .webcamOnButtonStyle, .webcamOffButtonStyle, .webcamOverButtonStyle, +.deskshareDefaultButtonStyle, .deskshareOverButtonStyle, .deskshareOnButtonStyle, .deskshareOffButtonStyle, .muteMeDefaultButtonStyle, .muteMeOnButtonStyle, .muteMeOffButtonStyle { - fillColorSelectedUp : #3B97D3; - fillColorSelectedOver : #2E8BB8; - fillColorSelectedDown : #3B97D3; - borderColorSelectedUp : #3B97D3; - borderColorSelectedOver : #2E8BB8; - borderColorSelectedDown : #3B97D3; + fillColorOver : #FFFFFF; + borderColorOver : #1070D7; + fillColorSelectedUp : #1070D7; + fillColorSelectedOver : #0A5EAC; + fillColorSelectedDown : #1070D7; + borderColorSelectedUp : #1070D7; + borderColorSelectedOver : #0A5EAC; + borderColorSelectedDown : #1070D7; } -.voiceConfDefaultButtonStyle, .voiceConfActiveButtonStyle, .voiceConfInactiveButtonStyle { +.voiceConfDefaultButtonStyle, .voiceConfOverButtonStyle, .voiceConfActiveButtonStyle, .voiceConfInactiveButtonStyle { + /* Normal state */ + fillColorOver : #FFFFFF; + borderColorOver : #DE2721; /* Selected state */ - fillColorSelectedUp : #FF6666; - fillColorSelectedOver : #FF6666; - fillColorSelectedDown : #FF6666; - borderColorSelectedUp : #FF6666; - borderColorSelectedOver : #FF6666; - borderColorSelectedDown : #FF6666; + backgroundColorOver : #FFFFFF; + borderColorOver : #DE2721; + fillColorSelectedUp : #DE2721; + fillColorSelectedOver : #B4201B; + fillColorSelectedDown : #DE2721; + borderColorSelectedUp : #DE2721; + borderColorSelectedOver : #B4201B; + borderColorSelectedDown : #DE2721; +} + +.webcamOnButtonStyle, .webcamOffButtonStyle { + fillColorUp : #1070D7; + borderColorUp : #1070D7; + fillColorOver : #0A5EAC; + fillColorDown : #1070D7; + borderColorOver : #0A5EAC; + + iconColor : #FFFFFF; + iconColorOver : #FFFFFF; + iconColorDown : #FFFFFF; } .voiceConfDefaultButtonStyle { @@ -195,8 +209,13 @@ mx|ApplicationControlBar { disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Disabled"); } +.voiceConfOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_Red"); +} + .voiceConfActiveButtonStyle { - icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_On"); + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_On"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Audio_On_Disabled"); } .voiceConfInactiveButtonStyle { @@ -208,6 +227,10 @@ mx|ApplicationControlBar { disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Disabled"); } +.webcamOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_Blue"); +} + .webcamOnButtonStyle { icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Webcam_On"); } @@ -220,6 +243,10 @@ mx|ApplicationControlBar { icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare"); } +.deskshareOverButtonStyle { + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare_Blue"); +} + .deskshareOnButtonStyle { icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Deskshare_White"); } @@ -243,12 +270,13 @@ mx|ApplicationControlBar { } .muteMeDefaultButtonStyle { - icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone"); - disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_Disabled"); + glowFilterColor : #1070D7; + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone"); + disabledIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_Disabled"); } .muteMeOnButtonStyle { - icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_On"); + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Microphone_White"); } .muteMeOffButtonStyle { @@ -256,30 +284,23 @@ mx|ApplicationControlBar { } .quickWindowLinkStyle { - /* FIXME */ paddingLeft : 0; paddingRight : 0; textDecoration : underline; - rollOverColor : #CCCCCC; - selectionColor : #999999; - color : #FFFFFF; - textRollOverColor : #504F3D; - textSelectedColor : #504F3D; + rollOverColor : #1070D7; + selectionColor : #0A5EAC; + color : #4E5A66; + textRollOverColor : #FFFFFF; + textSelectedColor : #FFFFFF; } .helpLinkButtonStyle { - /* FIXME */ - paddingLeft : 4; - paddingRight : 4; - paddingTop : 2; - paddingBottom : 2; - fontSize : 16; - rollOverColor : #CCCCCC; - selectionColor : #999999; - color : #FFFFFF; - textRollOverColor : #504F3D; - textSelectedColor : #504F3D; - fontWeight : bold; + cornerRadius : 2; + rollOverColor : #1070D7; + selectionColor : #0A5EAC; + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Help"); + overIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Help_White"); + downIcon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Help_White"); } /* @@ -330,14 +351,14 @@ mx|Button { paddingTop : 8; paddingBottom : 8; cornerRadius : 2; - color : #5E6D73; - textRollOverColor : #5E6D73; - textSelectedColor : #5E6D73; + color : #4E5A66; + textRollOverColor : #4E5A66; + textSelectedColor : #4E5A66; fontSize : 14; skin : ClassReference("org.bigbluebutton.skins.ButtonSkin"); /* Normal state */ - fillColorUp : #F0F2F6; + fillColorUp : #FFFFFF; fillColorOver : #CDD4DB; fillColorDown : #ACB2B7; fillColorDisabled : #F0F2F6; @@ -351,7 +372,7 @@ mx|Button { borderAlphaDown : 1; borderAlphaDisabled : 1; - borderThikness : 1; + borderThickness : 1; /* Selected state */ fillColorSelectedUp : #F0F2F6; @@ -450,9 +471,9 @@ views|ClientStatusItemRenderer { cornerRadius : 20; borderStyle : none; borderThickness : 0; - fillColorUp : #3B97D3; - fillColorOver : #2E8BB8; - fillColorDown : #3B97D3; + fillColorUp : #1070D7; + fillColorOver : #0A5EAC; + fillColorDown : #1070D7; fillColorDisabled : #F0F2F6; } @@ -523,7 +544,7 @@ mx|ComboBox { iconColor : #5E6C73; - borderThikness : 1; + borderThickness : 1; skin : ClassReference("org.bigbluebutton.skins.ComboBoxSkin"); } @@ -558,7 +579,7 @@ mx|DataGrid { .deskshareWarningLabelStyle { fontWeight : bold; fontSize : 18; - color : #3B97D3; + color : #1070D7; } .deskshareWarningBackgroundStyle { @@ -707,6 +728,9 @@ flexlib|MDIWindow { restoreBtnStyleName : "mdiMaximizeButtonStyle"; minimizeBtnStyleName : "mdiMinimizeButtonStyle"; + paddingLeft : 0; + paddingRight : 0; + showHeaderSeparator : true; } @@ -725,8 +749,10 @@ flexlib|MDIWindow { } .mdiWindowTitle { - color : #2A2D33; - fontSize : 12; + color : #2A2D33; + fontSize : 12; + paddingLeft : 12; + paddingRight : 12; } .mdiWindowNoFocus { @@ -813,18 +839,21 @@ views|NetworkStatsWindow { mx|PopUpButton { /* Normal state */ - fillColorUp : #F0F2F6; + fillColorUp : #FFFFFF; fillColorOver : #CDD4DB; fillColorDown : #ACB2B7; fillColorDisabled : #F0F2F6; borderColorUp : #CDD4DB; - borderColorOver : #CDD4DB; - borderColorDown : #ACB2B7; + borderColorOver : #1070D7; + borderColorDown : #0A5EAC; borderColorDisabled : #CDD4DB; - borderThikness : 1; + /* Icon states */ + iconColor : #4E5A66; + iconColorOver : #1070D7; + iconColorDown : #4E5A66; - iconColor : #5E6C73; + borderThickness : 1; skin : ClassReference("org.bigbluebutton.skins.PopUpButtonSkin"); } @@ -919,7 +948,7 @@ presentation|UploadedPresentationRenderer { tickOffset : 2; tickLength : 5; tickThickness : 2; - tickColor : #3B97D3; + tickColor : #1070D7; showTrackHighlight : true; invertThumbDirection : false; borderColor : #CDD4DB; @@ -952,10 +981,6 @@ presentation|FileUploadWindow { color : #2A2D33; } -.presentationUploadCancelButtonStyle { - color : #2A2D33; -} - .presentationUploadShowButtonStyle { color : #2A2D33; } @@ -1000,7 +1025,7 @@ poll|PollChoicesModal { mx|ProgressBar { color : #8A9AA7; - barColor : #3697D3; + barColor : #1070D7; trackColors : #FFFFFF, #FFFFFF; borderColor : #CDD4DB; barSkin : ClassReference("org.bigbluebutton.skins.ProgressBarSkin"); @@ -1067,11 +1092,15 @@ sharednotes|SharedNotesRichTextEditor { */ mx|TitleWindow { - borderColor : #FFFFFF; - cornerRadius : 4; - roundedBottomCorners : true; - dropShadowEnabled : true; - shadowDistance : 0; + closeButtonDisabledSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Button_Disabled"); + closeButtonDownSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Button_Down"); + closeButtonOverSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Button_Over"); + closeButtonUpSkin : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Button_Up"); + borderColor : #FFFFFF; + cornerRadius : 4; + roundedBottomCorners : true; + dropShadowEnabled : true; + shadowDistance : 0; } /* @@ -1082,7 +1111,7 @@ mx|TitleWindow { mx|ToolTip { borderSkin : ClassReference("org.bigbluebutton.skins.ToolTipSkin"); - backgroundColor : #3B97D3; + backgroundColor : #1070D7; color : #FFFFFF; fontSize : 13; backgroundAlpha : 0.9; @@ -1090,7 +1119,7 @@ mx|ToolTip { } .errorTip { - borderColor : #FF6666; + borderColor : #DE2721; } /* @@ -1124,16 +1153,17 @@ users|StatusItemRenderer { } users|MediaItemRenderer { - iconAudioMuted : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio_Muted"); - iconAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio"); - iconSound : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Sound"); - iconLock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Lock"); - iconUnlock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Unlock"); - iconSettings : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Settings"); - iconWebcam : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Webcam"); - iconDemote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Demote"); - iconPromote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Promote"); - iconEject : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Eject"); + iconAudioMuted : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio_Muted"); + iconAudio : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Audio"); + iconSound : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Sound"); + iconLock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Lock"); + iconUnlock : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Unlock"); + iconSettings : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Settings"); + iconWebcam : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Webcam"); + iconDemote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Demote"); + iconPromote : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Promote"); + iconEject : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Eject"); + glowFilterColor : #1070D7; } users|NameItemRenderer { @@ -1181,7 +1211,7 @@ users|MoodMenu { /* FIXME - start*/ iconMoodSpeakFaster : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); iconMoodSpeakSlower : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); - iconMoodSpeakLouder : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); + iconMoodSpeakLouder : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Speak_Louder"); iconMoodSpeakSofter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); /* FIXME - end */ iconMoodBeRightBack : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_User_Mood_Away"); @@ -1200,13 +1230,13 @@ users|MoodMenu { videoconf|UserGraphicHolder { iconPresenter : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Presenter"); iconModerator : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Moderator"); - iconClose : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Video_Moderator"); + iconClose : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Close_Video"); iconFullScreen : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Fullscreen_White"); iconExitFullScreen : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Exit_Fullscreen_White"); } .videoToolbarBackgroundTalkingStyle { - backgroundColor : #3B97D3; + backgroundColor : #1070D7; backgroundAlpha : 0.5; } diff --git a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla index 399f8632f24503deb1ee8b0d309153e9ca6bbf2d..033ca1db7c960307e522653da89003ab48148174 100644 Binary files a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla and b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.fla differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf index 77f4092b0b6f33eca48709f372196b7ff55a2404..81fecfff53338e76e7208ef925dfa6c86b442f86 100644 Binary files a/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf and b/bigbluebutton-client/branding/default/style/css/assets/swf/v2_skin.swf differ diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as index 6144a55424efa98f45ffe1ab06fbd56d2d55d7e1..17869687a4fd46b750df112b26f0d5871aa91337 100644 --- a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ButtonSkin.as @@ -94,7 +94,7 @@ package org.bigbluebutton.skins { var borderAlphaDown:uint = getStyle("borderAlphaDown"); var borderAlphaDisabled:uint = getStyle("borderAlphaDisabled"); - var borderThikness:uint = getStyle("borderThikness"); + var borderThickness:uint = getStyle("borderThickness"); var fillColorUp:uint = getStyle("fillColorUp"); var fillColorOver:uint = getStyle("fillColorOver"); @@ -114,7 +114,7 @@ package org.bigbluebutton.skins { // Corner radius var cr:Number = Math.max(0, cornerRadius); - var cr1:Number = Math.max(0, cornerRadius - borderThikness); + var cr1:Number = Math.max(0, cornerRadius - borderThickness); graphics.clear(); @@ -160,7 +160,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorUp, borderAlphaUp); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); break; } @@ -169,7 +169,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorOver, borderAlphaOver); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorOver, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1); break; } @@ -178,7 +178,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorDown, borderAlphaDown); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorDown, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1); break; } @@ -188,7 +188,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorDisabled, borderAlphaDisabled); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorDisabled, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); break; } diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as index 435cf4e0d3ee3415c97baa8673bcd1f42c4cd5dc..60cc05bffc9cc7cedf4c600bfd13ccce794c50ec 100644 --- a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/ComboBoxSkin.as @@ -73,7 +73,7 @@ package org.bigbluebutton.skins { var borderColorDown:uint = getStyle("borderColorDown"); var borderColorDisabled:uint = getStyle("borderColorDisabled"); - var borderThikness:uint = getStyle("borderThikness"); + var borderThickness:uint = getStyle("borderThickness"); var fillColorUp:uint = getStyle("fillColorUp"); var fillColorOver:uint = getStyle("fillColorOver"); @@ -90,7 +90,7 @@ package org.bigbluebutton.skins { var cornerRadius1:Number = Math.max(cornerRadius - 1, 0); var cr:Object = {tl: 0, tr: cornerRadius, bl: 0, br: cornerRadius}; - var cr1:Object = {tl: 0, tr: cornerRadius - borderThikness, bl: 0, br: cornerRadius - borderThikness}; + var cr1:Object = {tl: 0, tr: cornerRadius - borderThickness, bl: 0, br: cornerRadius - borderThickness}; var arrowOnly:Boolean = true; @@ -114,7 +114,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); if (!arrowOnly) { // line @@ -131,7 +131,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorOver, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorOver, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorOver, 1); if (!arrowOnly) { // line @@ -148,7 +148,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorDown, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorDown, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDown, 1); if (!arrowOnly) { // line @@ -165,7 +165,7 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorDisabled, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorDisabled, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); if (!arrowOnly) { // line diff --git a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as index 0af5c6a741a791ce4ccf4627b5db0a719c9ea81f..20f6434a9b17992db92cb3c60f1ae6a2a11309b6 100644 --- a/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as +++ b/bigbluebutton-client/branding/default/style/css/org/bigbluebutton/skins/PopUpButtonSkin.as @@ -38,7 +38,7 @@ package org.bigbluebutton.skins { import flash.display.DisplayObject; - + import mx.core.IFlexDisplayObject; import mx.core.IProgrammaticSkin; import mx.core.UIComponent; @@ -115,7 +115,7 @@ package org.bigbluebutton.skins { var borderColorDown:uint = getStyle("borderColorDown"); var borderColorDisabled:uint = getStyle("borderColorDisabled"); - var borderThikness:uint = getStyle("borderThikness"); + var borderThickness:uint = getStyle("borderThickness"); var fillColorUp:uint = getStyle("fillColorUp"); var fillColorOver:uint = getStyle("fillColorOver"); @@ -124,6 +124,9 @@ package org.bigbluebutton.skins { // User-defined styles. var arrowColor:uint = getStyle("iconColor"); + var arrowColorOver:uint = getStyle("iconColorOver"); + var arrowColorDown:uint = getStyle("iconColorDown"); + var cornerRadius:Number = getStyle("cornerRadius"); var popUpIcon:IFlexDisplayObject = IFlexDisplayObject(getChildByName("popUpIcon")); @@ -136,7 +139,7 @@ package org.bigbluebutton.skins { DisplayObject(popUpIcon).visible = true; } - var arrowButtonWidth:Number = Math.max(getStyle("arrowButtonWidth"), popUpIcon.width + 3 + borderThikness); + var arrowButtonWidth:Number = Math.max(getStyle("arrowButtonWidth"), popUpIcon.width + 3 + borderThickness); var dividerPosX:Number = w - arrowButtonWidth; @@ -144,7 +147,7 @@ package org.bigbluebutton.skins { // Corner radius var cr:Number = Math.max(0, cornerRadius); - var cr1:Number = Math.max(0, cornerRadius - borderThikness); + var cr1:Number = Math.max(0, cornerRadius - borderThickness); graphics.clear(); @@ -154,41 +157,43 @@ package org.bigbluebutton.skins { drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); // Separator - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), cr, borderColorUp, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), cr, borderColorUp, 1); break; } case "overSkin": // for hover on the main button (left) side { // button border/edge - drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + drawRoundRect(0, 0, w, h, cr, borderColorOver, 1); - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), 0, borderColorOver, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorOver, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); // left/main button fill - drawRoundRect(borderThikness, borderThikness, w - arrowButtonWidth - (borderThikness * 2), h - (borderThikness * 2), getRadius(cr1, true), fillColorOver, 1); + drawRoundRect(borderThickness, borderThickness, w - arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorOver, 1); break; } case "popUpOverSkin": // for hover on the arrow-button (right) side { + arrowColor = arrowColorOver; + // button border/edge - drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + drawRoundRect(0, 0, w, h, cr, borderColorOver, 1); - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), 0, borderColorOver, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorOver, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), getRadius(cr1, true), fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorUp, 1); // right button fill - drawRoundRect(dividerPosX + borderThikness, borderThikness, arrowButtonWidth - (borderThikness * 2), h - (borderThikness * 2), getRadius(cr1, false), fillColorOver, 1); + drawRoundRect(dividerPosX + borderThickness, borderThickness, arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, false), fillColorOver, 1); break; } @@ -196,31 +201,33 @@ package org.bigbluebutton.skins { case "downSkin": // for press on the main button (left) side { // button border/ddge - drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + drawRoundRect(0, 0, w, h, cr, borderColorDown, 1); - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), 0, borderColorDown, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorDown, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); // left/main button fill - drawRoundRect(borderThikness, borderThikness, w - arrowButtonWidth - (borderThikness * 2), h - (borderThikness * 2), getRadius(cr1, true), fillColorDown, 1); + drawRoundRect(borderThickness, borderThickness, w - arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, true), fillColorDown, 1); break; } case "popUpDownSkin": // for press on the arrow-button (right) side { + arrowColor = arrowColorDown; + // button border/edge - drawRoundRect(0, 0, w, h, cr, borderColorUp, 1); + drawRoundRect(0, 0, w, h, cr, borderColorDown, 1); - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), 0, fillColorDown, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorDown, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorUp, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorUp, 1); // right button fill - drawRoundRect(dividerPosX + borderThikness, borderThikness, arrowButtonWidth - (borderThikness * 2), h - (borderThikness * 2), getRadius(cr1, false), fillColorDown, 1); + drawRoundRect(dividerPosX + borderThickness, borderThickness, arrowButtonWidth - (borderThickness * 2), h - (borderThickness * 2), getRadius(cr1, false), fillColorDown, 1); break; } @@ -231,10 +238,10 @@ package org.bigbluebutton.skins { // outer edge drawRoundRect(0, 0, w, h, cornerRadius, fillColorDisabled, 1); - drawRoundRect(dividerPosX, borderThikness, borderThikness, h - (borderThikness * 2), 0, borderColorDisabled, 1); + drawRoundRect(dividerPosX, borderThickness, borderThickness, h - (borderThickness * 2), 0, borderColorDisabled, 1); // button fill - drawRoundRect(borderThikness, borderThikness, w - (borderThikness * 2), h - (borderThikness * 2), cr1, fillColorDisabled, 1); + drawRoundRect(borderThickness, borderThickness, w - (borderThickness * 2), h - (borderThickness * 2), cr1, fillColorDisabled, 1); break; } diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties index 87a288a0cf5da88ed071f2e9ccd9f71f6cfb162b..f0bd19a1493c12bdfc2f0cfcc08ce27d30328f07 100755 --- a/bigbluebutton-client/locale/en_US/bbbResources.properties +++ b/bigbluebutton-client/locale/en_US/bbbResources.properties @@ -254,7 +254,6 @@ bbb.presentation.error.convert.notsupported = Error: The uploaded document is un bbb.presentation.error.convert.nbpage = Error: Failed to determine the number of pages in the uploaded document. bbb.presentation.error.convert.maxnbpagereach = Error: The uploaded document has too many pages. bbb.presentation.converted = Converted {0} of {1} slides. -bbb.presentation.ok = OK bbb.presentation.slider = Presentation zoom level bbb.presentation.slideloader.starttext = Slide text start bbb.presentation.slideloader.endtext = Slide text end @@ -518,6 +517,7 @@ bbb.notes.cmpColorPicker.toolTip = Text Color bbb.notes.saveBtn = Save bbb.notes.saveBtn.toolTip = Save Note bbb.sharedNotes.title = Shared notes +bbb.sharedNotes.quickLink.label = Shared notes Window bbb.sharedNotes.name = Note name bbb.sharedNotes.save.toolTip = Save notes to file bbb.sharedNotes.save.complete = Notes were successfully saved diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template index 24a7da81262991dcb7c691a239e60c634e344ea0..13d8767c76c18aad22aa552592e2c62ec7e35a9d 100755 --- a/bigbluebutton-client/resources/config.xml.template +++ b/bigbluebutton-client/resources/config.xml.template @@ -1,7 +1,6 @@ <?xml version="1.0" ?> <config> <localeversion suppressWarning="false">0.9.0</localeversion> - <version>VERSION</version> <help url="http://HOST/help.html"/> <javaTest url="http://HOST/testjava.html"/> <porttest host="HOST" application="video/portTest" timeout="10000"/> @@ -14,7 +13,7 @@ <browserVersions chrome="CHROME_VERSION" firefox="FIREFOX_VERSION" flash="FLASH_VERSION" java="1.7.0_51" /> <layout showLogButton="false" defaultLayout="bbb.layout.name.defaultlayout" showToolbar="true" showFooter="true" showMeetingName="true" showHelpButton="true" - showLogoutWindow="true" showLayoutTools="true" confirmLogout="true" showNetworkMonitor="true" + showLogoutWindow="true" showLayoutTools="true" confirmLogout="true" showNetworkMonitor="false" showRecordingNotification="true" logoutOnStopRecording="false"/> <meeting muteOnStart="false" /> <breakoutRooms enabled="true" record="false" /> @@ -119,7 +118,7 @@ <module name="LayoutModule" url="http://HOST/client/LayoutModule.swf?v=VERSION" uri="rtmp://HOST/bigbluebutton" layoutConfig="http://HOST/client/conf/layout.xml" - enableEdit="true" + enableEdit="false" /> <module name="SharedNotesModule" url="http://HOST/client/SharedNotesModule.swf?v=VERSION" diff --git a/bigbluebutton-client/resources/prod/logo.swf b/bigbluebutton-client/resources/prod/logo.swf index 19ef9166c7dd8b9ac370a9e49798b49a04deb020..20137460bba09dc860919b34eddf55f5e68fddad 100644 Binary files a/bigbluebutton-client/resources/prod/logo.swf and b/bigbluebutton-client/resources/prod/logo.swf differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/events/ShortcutEvent.as b/bigbluebutton-client/src/org/bigbluebutton/main/events/ShortcutEvent.as index e1861fcb516ff5c8966468338ccb05ee3497fbf7..c795de2182bea54f65656b5b1a332d7a34a27f63 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/main/events/ShortcutEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/events/ShortcutEvent.as @@ -49,6 +49,8 @@ package org.bigbluebutton.main.events { public static const FOCUS_CAPTION_WINDOW:String = 'FOCUS_CAPTION_WINDOW'; + public static const FOCUS_SHARED_NOTES_WINDOW:String = 'FOCUS_SHARED_NOTES_WINDOW'; + public static const REMOTE_FOCUS_DESKTOP:String = 'REMOTE_FOCUS_DESKTOP'; public static const REMOTE_FOCUS_WEBCAM:String = 'REMOTE_FOCUS_WEBCAM'; // Remote focus microphone not necessary; audio options already hog focus diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as index 0d4cdabebba6488922df8edc1df40f1ddebacc53..858976ec3dda6ec16c25b2f8e51eb8de1aff09a7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/options/LayoutOptions.as @@ -52,7 +52,7 @@ package org.bigbluebutton.main.model.options { public var logoutOnStopRecording:Boolean = false; [Bindable] - public var showNetworkMonitor:Boolean = true; + public var showNetworkMonitor:Boolean = false; public var defaultLayout:String = "Default"; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml index efe5511dfcc2c7bedb0b76c6d3a74715f4e6935b..27fdaad4d96cebf21fc1dc35876833ab069ee2ac 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml @@ -85,68 +85,69 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import flash.events.Event; - import flash.events.FullScreenEvent; - import flash.events.IOErrorEvent; - import flash.events.TextEvent; - import flash.geom.Point; - import flash.net.navigateToURL; - - import mx.binding.utils.ChangeWatcher; - import mx.collections.ArrayCollection; - import mx.controls.Alert; - import mx.core.FlexGlobals; - import mx.core.IFlexDisplayObject; - import mx.core.UIComponent; - import mx.events.FlexEvent; - - import flexlib.mdi.effects.effectsLib.MDIVistaEffects; - - import org.as3commons.lang.StringUtils; - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbModuleWindow; - import org.bigbluebutton.common.events.AddUIComponentToMainCanvas; - import org.bigbluebutton.common.events.CloseWindowEvent; - import org.bigbluebutton.common.events.OpenWindowEvent; - 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.UsersUtil; - import org.bigbluebutton.core.events.LockControlEvent; - import org.bigbluebutton.core.events.NewGuestWaitingEvent; - import org.bigbluebutton.core.events.SwitchedLayoutEvent; - import org.bigbluebutton.core.vo.LockSettingsVO; - import org.bigbluebutton.main.events.AppVersionEvent; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.BreakoutRoomEvent; - import org.bigbluebutton.main.events.ClientStatusEvent; - import org.bigbluebutton.main.events.ConfigLoadedEvent; - import org.bigbluebutton.main.events.ExitApplicationEvent; - import org.bigbluebutton.main.events.InvalidAuthTokenEvent; - import org.bigbluebutton.main.events.MeetingNotFoundEvent; - import org.bigbluebutton.main.events.ModuleLoadEvent; - import org.bigbluebutton.main.events.NetworkStatsEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.model.Guest; - import org.bigbluebutton.main.model.ImageLoader; - import org.bigbluebutton.main.model.options.BrandingOptions; - import org.bigbluebutton.main.model.options.BrowserVersionsOptions; - import org.bigbluebutton.main.model.options.LanguageOptions; - import org.bigbluebutton.main.model.options.LayoutOptions; - import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; - import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; - import org.bigbluebutton.modules.phone.events.FlashMicSettingsEvent; - import org.bigbluebutton.modules.phone.events.WebRTCCallEvent; - import org.bigbluebutton.modules.phone.events.WebRTCEchoTestEvent; - import org.bigbluebutton.modules.phone.events.WebRTCMediaEvent; - import org.bigbluebutton.modules.phone.models.PhoneOptions; - import org.bigbluebutton.modules.users.views.BreakoutRoomSettings; - import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import flash.events.Event; + import flash.events.FullScreenEvent; + import flash.events.IOErrorEvent; + import flash.events.TextEvent; + import flash.geom.Point; + import flash.net.navigateToURL; + + import flexlib.mdi.effects.effectsLib.MDIVistaEffects; + + import mx.binding.utils.ChangeWatcher; + import mx.collections.ArrayCollection; + import mx.controls.Alert; + import mx.core.FlexGlobals; + import mx.core.IFlexDisplayObject; + import mx.core.UIComponent; + import mx.events.FlexEvent; + + import org.as3commons.lang.StringUtils; + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbModuleWindow; + import org.bigbluebutton.common.events.AddUIComponentToMainCanvas; + import org.bigbluebutton.common.events.CloseWindowEvent; + import org.bigbluebutton.common.events.OpenWindowEvent; + 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.UsersUtil; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.NewGuestWaitingEvent; + import org.bigbluebutton.core.events.SwitchedLayoutEvent; + import org.bigbluebutton.core.vo.LockSettingsVO; + import org.bigbluebutton.main.events.AppVersionEvent; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.BreakoutRoomEvent; + import org.bigbluebutton.main.events.ClientStatusEvent; + import org.bigbluebutton.main.events.ConfigLoadedEvent; + import org.bigbluebutton.main.events.ExitApplicationEvent; + import org.bigbluebutton.main.events.InvalidAuthTokenEvent; + import org.bigbluebutton.main.events.MeetingNotFoundEvent; + import org.bigbluebutton.main.events.ModuleLoadEvent; + import org.bigbluebutton.main.events.NetworkStatsEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.model.Guest; + import org.bigbluebutton.main.model.ImageLoader; + import org.bigbluebutton.main.model.options.BrandingOptions; + import org.bigbluebutton.main.model.options.BrowserVersionsOptions; + import org.bigbluebutton.main.model.options.LanguageOptions; + import org.bigbluebutton.main.model.options.LayoutOptions; + import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; + import org.bigbluebutton.modules.phone.events.AudioSelectionWindowEvent; + import org.bigbluebutton.modules.phone.events.FlashMicSettingsEvent; + import org.bigbluebutton.modules.phone.events.WebRTCCallEvent; + import org.bigbluebutton.modules.phone.events.WebRTCEchoTestEvent; + import org.bigbluebutton.modules.phone.events.WebRTCMediaEvent; + import org.bigbluebutton.modules.phone.models.PhoneOptions; + import org.bigbluebutton.modules.users.model.UsersOptions; + import org.bigbluebutton.modules.users.views.BreakoutRoomSettings; + import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(MainApplicationShell); @@ -178,6 +179,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var layoutOptions:LayoutOptions; [Bindable] private var brandingOptions:BrandingOptions; + [Bindable] private var usersOptions:UsersOptions; [Bindable] private var showToolbarOpt:Boolean = true; [Bindable] private var _showToolbar:Boolean = true; @@ -215,7 +217,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. public function initOptions(e:Event):void { brandingOptions = Options.getOptions(BrandingOptions) as BrandingOptions; layoutOptions = Options.getOptions(LayoutOptions) as LayoutOptions; - + usersOptions = Options.getOptions(UsersOptions) as UsersOptions; + updateCopyrightText(); loadBackground(); @@ -495,7 +498,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function refreshGuestView(evt:NewGuestWaitingEvent):void { // do not show the guest window if the user isn't moderator or if he's waiting for acceptance - if (!UsersUtil.amIModerator() || UsersUtil.amIWaitingForAcceptance()) { + if (!UsersUtil.amIModerator() || UsersUtil.amIWaitingForAcceptance() && usersOptions.enableGuestUI) { closeGuestWindow(); return; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml index 2cadd89925282afb55495d4dda3f9a2a200618ea..f1803961c2c506a162a079a6a43ae7e630893432 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml @@ -52,44 +52,44 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </fx:Declarations> <fx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import mx.binding.utils.BindingUtils; - import mx.controls.Alert; - import mx.core.FlexGlobals; - import mx.core.IToolTip; - import mx.core.UIComponent; - import mx.events.CloseEvent; - import mx.events.ToolTipEvent; - import mx.managers.PopUpManager; - - import org.as3commons.lang.ArrayUtils; - import org.as3commons.lang.StringUtils; - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbToolbarComponent; - import org.bigbluebutton.common.events.SettingsComponentEvent; - import org.bigbluebutton.common.events.ToolbarButtonEvent; - import org.bigbluebutton.core.BBB; - import org.bigbluebutton.core.Options; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.model.Config; - import org.bigbluebutton.core.model.LiveMeeting; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.ConfigLoadedEvent; - import org.bigbluebutton.main.events.LogoutEvent; - import org.bigbluebutton.main.events.NetworkStatsEvent; - import org.bigbluebutton.main.events.SettingsEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.main.events.SuccessfulLoginEvent; - import org.bigbluebutton.main.model.NetworkStatsData; - import org.bigbluebutton.main.model.options.BrandingOptions; - import org.bigbluebutton.main.model.options.LayoutOptions; - import org.bigbluebutton.main.model.options.ShortcutKeysOptions; - import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.main.model.users.events.ConferenceCreatedEvent; - import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import com.asfusion.mate.events.Dispatcher; + + import mx.binding.utils.BindingUtils; + import mx.controls.Alert; + import mx.core.FlexGlobals; + import mx.core.IToolTip; + import mx.core.UIComponent; + import mx.events.CloseEvent; + import mx.events.ToolTipEvent; + import mx.managers.PopUpManager; + + import org.as3commons.lang.StringUtils; + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.IBbbToolbarComponent; + import org.bigbluebutton.common.events.SettingsComponentEvent; + import org.bigbluebutton.common.events.ToolbarButtonEvent; + import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.Options; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.model.Config; + import org.bigbluebutton.core.model.LiveMeeting; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.events.ConfigLoadedEvent; + import org.bigbluebutton.main.events.LogoutEvent; + import org.bigbluebutton.main.events.NetworkStatsEvent; + import org.bigbluebutton.main.events.SettingsEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.main.events.SuccessfulLoginEvent; + import org.bigbluebutton.main.model.NetworkStatsData; + import org.bigbluebutton.main.model.options.BrandingOptions; + import org.bigbluebutton.main.model.options.LayoutOptions; + import org.bigbluebutton.main.model.options.ShortcutKeysOptions; + import org.bigbluebutton.main.model.users.events.ChangeMyRole; + import org.bigbluebutton.main.model.users.events.ConferenceCreatedEvent; + import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; + import org.bigbluebutton.modules.users.model.UsersOptions; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(MainToolbar); @@ -104,6 +104,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. [Bindable] private var showRecordButton:Boolean = false; [Bindable] public var toolbarOptions:LayoutOptions; [Bindable] private var brandingOptions:BrandingOptions; + [Bindable] private var usersOptions:UsersOptions; [Bindable] private var numButtons:int; @@ -127,6 +128,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function init():void{ toolbarOptions = Options.getOptions(LayoutOptions) as LayoutOptions; brandingOptions = Options.getOptions(BrandingOptions) as BrandingOptions; + usersOptions = Options.getOptions(UsersOptions) as UsersOptions; + numButtons = 0; // Accessibility isn't active till a few second after the client starts to load so we need a delay @@ -162,6 +165,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. case "caption": dispatcher.dispatchEvent(new ShortcutEvent(ShortcutEvent.FOCUS_CAPTION_WINDOW)); break; + case "sharedNotes": + dispatcher.dispatchEvent(new ShortcutEvent(ShortcutEvent.FOCUS_SHARED_NOTES_WINDOW)); + break; } } @@ -194,7 +200,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function refreshModeratorButtonsVisibility(e:*):void { - showGuestSettingsButton = UsersUtil.amIModerator(); + showGuestSettingsButton = UsersUtil.amIModerator() && usersOptions.enableGuestUI; showRecordButton = UsersUtil.amIModerator(); } @@ -503,7 +509,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </fx:Declarations> - <mx:Image id="logo" right="20" maxHeight="30" ioError="hideLogo()" /> + <mx:Image id="logo" right="20" maxHeight="35" ioError="hideLogo()" /> <mx:HBox id="quickLinks" width="1" includeInLayout="false"> <mx:LinkButton id="usersLinkBtn" click="onQuickLinkClicked('users')" label="{ResourceUtil.getInstance().getString('bbb.users.quickLink.label')}" accessibilityDescription="{usersLinkBtn.label}" toolTip="{usersLinkBtn.label}" @@ -519,7 +525,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. height="30" styleName="quickWindowLinkStyle" /> <mx:LinkButton id="captionLinkBtn" click="onQuickLinkClicked('caption')" label="{ResourceUtil.getInstance().getString('bbb.caption.quickLink.label')}" accessibilityDescription="{captionLinkBtn.label}" toolTip="{captionLinkBtn.label}" - height="20" styleName="quickWindowLinkStyle" /> + height="30" styleName="quickWindowLinkStyle" /> + <mx:LinkButton id="sharedNotesLinkBtn" click="onQuickLinkClicked('sharedNotes')" label="{ResourceUtil.getInstance().getString('bbb.sharedNotes.quickLink.label')}" + accessibilityDescription="{sharedNotesLinkBtn.label}" toolTip="{sharedNotesLinkBtn.label}" + height="30" styleName="quickWindowLinkStyle" /> </mx:HBox> <mx:VRule styleName="toolbarSeparator" height="10" /> <mx:Label id="meetingNameLbl" minWidth="1" styleName="meetingNameLabelStyle" /> @@ -544,11 +553,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. styleName="bandwidthButtonStyle" toolTip="dummy text" click="onNetStatsButtonClick()" - visible="{toolbarOptions.showNetworkMonitor}" /> + visible="{toolbarOptions.showNetworkMonitor}" + includeInLayout="{toolbarOptions.showNetworkMonitor}"/> <mx:Button id="shortcutKeysBtn" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.shortcutBtn')}" styleName="shortcutButtonStyle" click="onShortcutButtonClick()" height="30" toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.shortcutBtn.toolTip')}"/> - <mx:LinkButton id="helpBtn" visible="{showHelpBtn}" includeInLayout="{showHelpBtn}" label="?" click="onHelpButtonClicked()" height="30" + <mx:LinkButton id="helpBtn" visible="{showHelpBtn}" includeInLayout="{showHelpBtn}" click="onHelpButtonClicked()" height="30" styleName="helpLinkButtonStyle" toolTip="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" accessibilityName="{ResourceUtil.getInstance().getString('bbb.micSettings.access.helpButton')}"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml index 33f41659cb856fdc1a577aef53a75a8b1189589e..197f1f70629ac1111e4610cf10112f6eef78051f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml @@ -88,7 +88,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.events.UserJoinedEvent; import org.bigbluebutton.main.events.UserLeftEvent; import org.bigbluebutton.main.model.users.events.ChangeMyRole; - import org.bigbluebutton.modules.chat.ChatConstants; import org.bigbluebutton.modules.chat.ChatUtil; import org.bigbluebutton.modules.chat.events.ChatEvent; import org.bigbluebutton.modules.chat.events.ChatHistoryEvent; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml index 59ebf88f0bcb7c12be94b4272917a38123f8eb4e..55ac14ac646565ef0de4b1b4b5552d20a3ea764f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/MuteMeButton.mxml @@ -57,11 +57,10 @@ $Id: $ <fx:Script> <![CDATA[ import flash.filters.BitmapFilterQuality; + import flash.filters.GlowFilter; import mx.core.mx_internal; - import spark.filters.GlowFilter; - import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.common.IBbbToolbarComponent; @@ -97,7 +96,7 @@ $Id: $ //rest rolledOver when the data changes because onRollOut wont be called if the row moves if (UsersUtil.isMe(e.message.userID)) { if (e.message.talking) { - currentIcon.filters = [new GlowFilter(0x000000, 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; + currentIcon.filters = [new GlowFilter(getStyle("glowFilterColor"), 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; } else { currentIcon.filters = []; } @@ -168,7 +167,7 @@ $Id: $ toolTip = ResourceUtil.getInstance().getString("bbb.users.muteMeBtnTxt.muted"); } else { selected = false; - styleName = "muteMeOnButtonStyle"; + styleName = "muteMeDefaultButtonStyle"; } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml index a5eb5bcc6aa6a8ca82632bb54f4dafc744db6e6a..9ffd0f2faf377c262867a029d908e450b25003af 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/views/components/ToolbarButton.mxml @@ -101,7 +101,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if (_currentState == ACTIVE_STATE) this.styleName = "voiceConfInactiveButtonStyle"; else - this.styleName = "voiceConfActiveButtonStyle"; + this.styleName = "voiceConfOverButtonStyle"; } private function mouseOutHandler(event:MouseEvent):void { @@ -150,7 +150,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } - private function onUserJoinedConference():void { PhoneOptions.firstAudioJoin = false; @@ -237,7 +236,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. this.enabled = true; LOGGER.debug("onClosedAudioSelection enabled=[{0}] selected=[{1}]", [enabled, selected]); _currentState = DEFAULT_STATE; - this.styleName = "voiceConfDefaultButtonStyle"; + this.styleName = "voiceConfDefaultButtonStyle"; this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.phone.toolTip.start'); joinDefaultListenOnlyMode(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml index 1c82c4c1e879a305fdefe5de49345cd5bac659e6..78efe27af21513188b40af9d4bc17ce251f23551 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml @@ -29,8 +29,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. verticalScrollPolicy="off" horizontalScrollPolicy="off" showCloseButton="true" - initialize="initData();"> - + close="globalDispatch.dispatchEvent(new UploadEvent(UploadEvent.CLOSE_UPLOAD_WINDOW))" + initialize="initData()" + creationComplete="onCreationComplete(event)"> + <fx:Declarations> <mate:Dispatcher id="globalDispatch" /> <mate:Listener type="{UploadProgressEvent.UPLOAD_PROGRESS_UPDATE}" method="handleUploadProgressUpdate" /> @@ -52,6 +54,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; + import mx.core.mx_internal; + import mx.events.FlexEvent; import mx.utils.StringUtil; import org.as3commons.lang.StringUtils; @@ -80,6 +84,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.present.model.PresentationModel; import org.bigbluebutton.util.i18n.ResourceUtil; + use namespace mx_internal; private static const LOGGER:ILogger = getClassLogger(FileUploadWindow); @@ -96,15 +101,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. override public function move(x:Number, y:Number):void{ return; } - - private function initData():void { - presentOptions = Options.getOptions(PresentOptions) as PresentOptions; - presentationNamesAC = PresentationModel.getInstance().getPresentations(); - if (presentationNamesAC.length <= 0) { - selectFile(); - } - } - + + protected function onCreationComplete(event:FlexEvent):void + { + this.mx_internal::closeButton.toolTip = ResourceUtil.getInstance().getString('bbb.fileupload.okCancelBtn.toolTip'); + } + + private function initData():void { + presentOptions = Options.getOptions(PresentOptions) as PresentOptions; + presentationNamesAC = PresentationModel.getInstance().getPresentations(); + if (presentationNamesAC.length <= 0) { + selectFile(); + } + } + private function handleThumbnailsProgressEvent(event:CreatingThumbnailsEvent):void { genThumbDots = "."; @@ -155,11 +165,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. fileFormatHintLbl.visible = false; fileFormatHintLbl.includeInLayout = false; - uploadedFilesList.enabled = false; + uploadedFilesList.enabled = false; progressReportBox.visible = true; progressBar.visible = true; - okCancelBtn.visible = true; disableClosing(); @@ -265,19 +274,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function displayAlert(error:String, message:String = null):void { - var okLabel:String = ResourceUtil.getInstance().getString('bbb.presentation.ok'); progressBar.setStyle("color", 0xFF0000); progressBar.label = error; if (!StringUtils.isEmpty(message)) { progressBar.label += message; } - // FIXME : to be localised - okCancelBtn.label = "Ok"; } private function enableControls():void { - okCancelBtn.visible = true; - okCancelBtn.enabled = true; + enableClosing(); selectBtn.enabled = true; uploadBtn.enabled = true; lblFileName.enabled = true; @@ -291,19 +296,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function handleConversionCompleted(e:ConversionCompletedEvent):void{ - okCancelBtn.label = ResourceUtil.getInstance().getString('bbb.presentation.ok'); enableClosing(); globalDispatch.dispatchEvent(new UploadEvent(UploadEvent.CLOSE_UPLOAD_WINDOW)); } - private function disableClosing():void { - okCancelBtn.enabled = false; - } - - private function enableClosing():void { - okCancelBtn.enabled = true; - } - + private function disableClosing():void { + showCloseButton = false; + } + + private function enableClosing():void { + showCloseButton = true; + } + private function handlePresentationRemoved(e:RemovePresentationEvent):void { for(var i:int = 0; i < presentationNamesAC.length; i++) { if(e.presentationName == presentationNamesAC.getItemAt(i).id) { @@ -312,7 +316,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } } - ]]> + + ]]> </fx:Script> @@ -350,12 +355,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. dragEnabled="false" dataProvider="{presentationNamesAC}"> </mx:List> </mx:Canvas> - <mx:Canvas width="100%" height="100%"> - <mx:Button id="okCancelBtn" label="{ResourceUtil.getInstance().getString('bbb.fileupload.okCancelBtn')}" - styleName="presentationUploadCancelButtonStyle" right="5" bottom="15" - click="globalDispatch.dispatchEvent(new UploadEvent(UploadEvent.CLOSE_UPLOAD_WINDOW))" - toolTip="{ResourceUtil.getInstance().getString('bbb.fileupload.okCancelBtn.toolTip')}"/> - </mx:Canvas> </mx:VBox> </mx:TitleWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml index 9827d6e33b8029a3495e6fa719c6bc9f61339a92..cbc3c9181d7676e318b99c49622bb550d5fe326a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/maps/WebRTCDeskshareEventMap.mxml @@ -45,7 +45,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.screenshare.events.WebRTCViewStreamEvent; import org.bigbluebutton.modules.screenshare.events.WebRTCViewWindowEvent; import org.bigbluebutton.modules.screenshare.managers.WebRTCDeskshareManager; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; ]]> </fx:Script> @@ -73,12 +72,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleRequestStopSharingEvent"/> </EventHandlers> -<!-- - <EventHandlers type="{ShareStartRequestResponseEvent.SHARE_START_REQUEST_RESPONSE}"> - <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleShareStartRequestResponseEvent" arguments="{event}"/> - </EventHandlers> ---> - <EventHandlers type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}"> <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleMadePresenterEvent" arguments="{event}"/> </EventHandlers> @@ -115,10 +108,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleRequestStopSharingEvent"/> </EventHandlers> - <EventHandlers type="{WebRTCConnectionEvent.SUCCESS}"> - <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleConnectionSuccessEvent"/> - </EventHandlers> - <EventHandlers type="{StartedViewingEvent.STARTED_VIEWING_EVENT}"> <MethodInvoker generator="{WebRTCDeskshareManager}" method="handleStartedViewingEvent" arguments="{event.stream}"/> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as index a43556c12f16d73646212e351381e7f6258e7541..d1b6ece946aaf716fc8865bb3b9d579915032e40 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/WebRTCDeskshareService.as @@ -24,19 +24,12 @@ package org.bigbluebutton.modules.screenshare.services import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnection; import org.bigbluebutton.modules.screenshare.services.red5.Connection; - /** - * The DeskShareProxy communicates with the Red5 deskShare server application - * @author Snap - * - */ public class WebRTCDeskshareService { private static const LOGGER:ILogger = getClassLogger(ScreenshareService); - private var conn:WebRTCConnection; private var red5conn:Connection; private var module:ScreenshareModule; @@ -65,18 +58,14 @@ package org.bigbluebutton.modules.screenshare.services this.uri = uri; this.room = room; LOGGER.debug("Deskshare Service connecting to {0}", [uri]); - conn = new WebRTCConnection(room); //to red5 deskshare - - conn.setURI(uri); - conn.connect(); } public function getConnection():NetConnection{ - return conn.getConnection(); + return red5conn.getConnection(); } public function disconnect():void{ - conn.disconnect(); + red5conn.disconnect(); } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as deleted file mode 100755 index a362e16fef74968067106e731f76f40dacf04104..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/WebRTCConnection.as +++ /dev/null @@ -1,330 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2015 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.services.red5 -{ - import com.asfusion.mate.events.Dispatcher; - - import flash.events.AsyncErrorEvent; - import flash.events.NetStatusEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - import flash.net.NetConnection; - import flash.net.ObjectEncoding; - import flash.net.Responder; - import flash.utils.Timer; - - import mx.utils.ObjectUtil; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.core.BBB; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.managers.ReconnectionManager; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.modules.screenshare.events.WebRTCViewStreamEvent; - import org.bigbluebutton.modules.screenshare.services.red5.WebRTCConnectionEvent; - - public class WebRTCConnection { - private static const LOGGER:ILogger = getClassLogger(Connection); - - private var nc:NetConnection; - private var uri:String; - private var retryTimer:Timer = null; - private var retryCount:int = 0; - private const MAX_RETRIES:int = 5; - private var responder:Responder; - private var width:Number; - private var height:Number; - private var room:String; - private var logoutOnUserCommand:Boolean = false; - private var reconnecting:Boolean = false; - private var wasPresenterBeforeDisconnect:Boolean = false; - - private var dispatcher:Dispatcher = new Dispatcher(); - - public function WebRTCConnection(room:String) { - this.room = room; - - responder = new Responder( - function(result:Object):void { - if (result != null && (result.publishing as Boolean)){ - width = result.width as Number; - height = result.height as Number; - LOGGER.debug("Desk Share stream is streaming [{0},{1}]", [width, height]); - var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.START); - event.videoWidth = width; - event.videoHeight = height; - dispatcher.dispatchEvent(event); //TODO why? - } else { - LOGGER.debug("No screenshare stream being published"); - var connEvent:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - connEvent.status = WebRTCConnectionEvent.NO_DESKSHARE_STREAM; - dispatcher.dispatchEvent(connEvent); //TODO why? - } - }, - function(status:Object):void{ - var checkFailedEvent:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - checkFailedEvent.status = WebRTCConnectionEvent.FAIL_CHECK_FOR_DESKSHARE_STREAM; - dispatcher.dispatchEvent(checkFailedEvent); - LOGGER.debug("Error while trying to call remote mathod on server"); - } - ); - } - - public function connect(retry:Boolean = false):void { - nc = new NetConnection(); - nc.proxyType = "best"; - nc.objectEncoding = ObjectEncoding.AMF0; - nc.client = this; - - nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, debugAsyncErrorHandler); - nc.addEventListener(NetStatusEvent.NET_STATUS, debugNetStatusHandler); - nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); - - if (getURI().length == 0){ - LOGGER.error("please provide a valid URI connection string. URI Connection String missing"); - return; - } else if (nc.connected){ - LOGGER.error("You are already connected to {0}", [getURI()]); - return; - } - - LOGGER.debug("Trying to connect to [{0}] retry=[{1}]", [getURI(), retry]); - if (! (retryCount > 0)) { - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - ce.status = WebRTCConnectionEvent.CONNECTING; - - dispatcher.dispatchEvent(ce); - } - - nc.connect(getURI(), UsersUtil.getInternalMeetingID()); - } - - private function connectTimeoutHandler(e:TimerEvent):void { - LOGGER.debug("Connection attempt to [{0}] timedout. Retrying.", [getURI()]); - retryTimer.stop(); - retryTimer = null; - - nc.close(); - nc = null; - - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent();; - - retryCount++; - if (retryCount < MAX_RETRIES) { - ce.status = WebRTCConnectionEvent.CONNECTING_RETRY; - ce.retryAttempts = retryCount; - dispatcher.dispatchEvent(ce); - - connect(false); - } else { - ce.status = WebRTCConnectionEvent.CONNECTING_MAX_RETRY; - dispatcher.dispatchEvent(ce); - } - } - - public function close():void{ - nc.close(); - } - - public function setURI(p_URI:String):void{ - uri = p_URI; - } - - public function getURI():String{ - return uri; - } - - public function onBWCheck(... rest):Number { - return 0; - } - - public function onBWDone(... rest):void { - var p_bw:Number; - if (rest.length > 0) p_bw = rest[0]; - // your application should do something here - // when the bandwidth check is complete - LOGGER.debug("bandwidth = {0} Kbps.", [p_bw]); - } - - private function netStatusHandler(event:NetStatusEvent):void { - LOGGER.debug("Connected to [" + getURI() + "]. [" + event.info.code + "]"); - - var logData:Object = {}; - logData.type = "ConnectionStatusChanged"; - logData.newStatus = event.info.code; - logData.connection = getURI(); - LOGGER.info(JSON.stringify(logData)); - - if (retryTimer) { - retryCount = 0; - LOGGER.debug("Cancelling retry timer."); - retryTimer.stop(); - retryTimer = null; - } - - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - - switch(event.info.code){ - case "NetConnection.Connect.Failed": - if (reconnecting) { - var attemptFailedEvent:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_CONNECTION_ATTEMPT_FAILED_EVENT); - attemptFailedEvent.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - dispatcher.dispatchEvent(attemptFailedEvent); - } - ce.status = WebRTCConnectionEvent.FAILED; - - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Success": - ce.status = WebRTCConnectionEvent.SUCCESS; - if (reconnecting) { - reconnecting = false; - if (wasPresenterBeforeDisconnect) { - wasPresenterBeforeDisconnect = false; - // stopSharingDesktop(room, room) //TODO - } - - var attemptSucceeded:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_CONNECTION_ATTEMPT_SUCCEEDED_EVENT); - attemptSucceeded.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - dispatcher.dispatchEvent(attemptSucceeded); - } - - // request desktop sharing info (as a late joiner) - LOGGER.debug("Sending [desktopSharing.requestDeskShareInfo] to server."); - var _nc:ConnectionManager = BBB.initConnectionManager(); - _nc.sendMessage("desktopSharing.requestDeskShareInfo", - function(result:String):void { // On successful result - LOGGER.debug(result); - }, - function(status:String):void { // status - On error occurred - LOGGER.error(status); - } - ); - - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Rejected": - ce.status = WebRTCConnectionEvent.REJECTED; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.Closed": - LOGGER.debug("Deskshare connection closed."); - ce.status = WebRTCConnectionEvent.CLOSED; - if (UsersUtil.amIPresenter()) { - // Let's keep our presenter status before disconnected. We can't - // tell the other user's to stop desktop sharing as our connection is broken. (ralam july 24, 2015) - wasPresenterBeforeDisconnect = true; - - } else { - // stopViewing(); //TODO - } - - if (!logoutOnUserCommand) { - reconnecting = true; - - var disconnectedEvent:BBBEvent = new BBBEvent(BBBEvent.RECONNECT_DISCONNECTED_EVENT); - disconnectedEvent.payload.type = ReconnectionManager.DESKSHARE_CONNECTION; - disconnectedEvent.payload.callback = connect; - disconnectedEvent.payload.callbackParameters = []; - dispatcher.dispatchEvent(disconnectedEvent); - } - break; - - case "NetConnection.Connect.InvalidApp": - ce.status = WebRTCConnectionEvent.INVALIDAPP; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.AppShutdown": - ce.status = WebRTCConnectionEvent.APPSHUTDOWN; - dispatcher.dispatchEvent(ce); - break; - - case "NetConnection.Connect.NetworkChange": - // LOGGER.info("Detected network change. User might be on a wireless and - // temporarily dropped connection. Doing nothing. Just making a note."); - break; - - default : - // I dispatch DISCONNECTED incase someone just simply wants to know if we're not connected' - // rather than having to subscribe to the events individually - ce.status = WebRTCConnectionEvent.DISCONNECTED; - dispatcher.dispatchEvent(ce); - break; - } - } - - private function securityErrorHandler(event:SecurityErrorEvent):void{ - var ce:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - ce.status = WebRTCConnectionEvent.SECURITYERROR; - dispatcher.dispatchEvent(ce); - } - - /** - * Check if anybody is publishing the stream for this room - * This method is useful for clients which have joined a room where somebody is already publishing - * - */ - private function checkIfStreamIsPublishing(room: String):void{ - LOGGER.debug("checking if desk share stream is publishing"); - var event:WebRTCConnectionEvent = new WebRTCConnectionEvent(); - event.status = WebRTCConnectionEvent.CHECK_FOR_DESKSHARE_STREAM; - dispatcher.dispatchEvent(event); // TODO anton send to akka-bbb-apps - - nc.call("screenshare.checkIfStreamIsPublishing", responder, room); - } - - public function disconnect():void{ - logoutOnUserCommand = true; - if (nc != null) nc.close(); - } - - public function connectionSuccessHandler():void{ - LOGGER.debug("Successully connection to {0}", [uri]); - - checkIfStreamIsPublishing(room); - } - - private function debugNetStatusHandler(e:NetStatusEvent):void { - LOGGER.debug("netStatusHandler target={0} info={1}", [e.target, ObjectUtil.toString(e.info)]); - } - - private function debugAsyncErrorHandler(e:AsyncErrorEvent):void { - LOGGER.debug("asyncErrorHandler target={0} info={1}", [e.target, e.text]); - } - - public function getConnection():NetConnection{ - return nc; - } - - public function connectionFailedHandler(e:WebRTCConnectionEvent):void{ - LOGGER.error("connection failed to {0} with message {1}", [uri, e.toString()]); - } - - public function connectionRejectedHandler(e:WebRTCConnectionEvent):void{ - LOGGER.error("connection rejected to {0} with message {1}", [uri, e.toString()]); - } - } -} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml index 5fc6fbfd366d237436e7e4405757bb195e3c12d5..610692d8531d5a1ab9e30f02b5052cae1f772f47 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ToolbarButton.mxml @@ -105,7 +105,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if(_currentState == ON_STATE) styleName="deskshareOffButtonStyle" else - styleName="deskshareOnButtonStyle" + styleName="deskshareOverButtonStyle" } private function mouseOutHandler(event:MouseEvent):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml index 1884cb9e8a997dad08a6f6185163c14e883cfbb4..45c641e4a51d55905893cfdc1c88a60c8b6fe123 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml @@ -32,6 +32,7 @@ <mate:Listener type="{ReceivePatchEvent.RECEIVE_PATCH_EVENT}" method="receivePatch"/> <mate:Listener type="{CurrentDocumentEvent}" method="gotCurrentDocument"/> <mate:Listener type="{SharedNotesEvent.SYNC_NOTE_REPLY_EVENT}" method="handleSyncNote"/> + <mate:Listener type="{ShortcutEvent.FOCUS_SHARED_NOTES_WINDOW}" method="focusWindow" /> </fx:Declarations> <fx:Script> @@ -57,6 +58,7 @@ import org.bigbluebutton.common.Role; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.views.MainCanvas; import org.bigbluebutton.main.views.WellPositionedMenu; import org.bigbluebutton.modules.sharednotes.SharedNotesOptions; @@ -433,6 +435,12 @@ public function handleResizableStatus(value:Boolean):void { this.resizable = value; } + + private function focusWindow(e:ShortcutEvent):void { + if (this.visible) { + focusManager.setFocus(titleBarOverlay); + } + } ]]> </fx:Script> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as index db9bc8ec71f950d706c53847a6bbf8f413847b13..cdfa54a4459669f95c145425107249e0a697a158 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/model/UsersOptions.as @@ -33,6 +33,9 @@ package org.bigbluebutton.modules.users.model { [Bindable] public var enableSettingsButton:Boolean = true; + + [Bindable] + public var enableGuestUI:Boolean = false; public function UsersOptions() { name = "UsersModule"; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml index f8654f226bb00dd1d76034cb20cf8ec1900f1605..34a7b98d814832e4c4bb144cb954b287ea37bed5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml @@ -203,7 +203,7 @@ muteBtn.enabled = true; if(data.talking && !rolledOver){ - muteImg.filters = [new GlowFilter(0x000000, 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; + muteImg.filters = [new GlowFilter(getStyle("glowFilterColor"), 1, 6, 6, 2, BitmapFilterQuality.HIGH, false, false)]; }else{ muteImg.filters = []; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml index ec1c3964d2fc9b159490650e37c49fd6ac22f24f..bcfa0b19b9986c2e5dfa05bd93e524dc0d89089b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarPopupButton.mxml @@ -218,7 +218,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. if(_currentState == ON_STATE) this.styleName = "webcamOffButtonStyle"; else - this.styleName = "webcamOnButtonStyle"; + this.styleName = "webcamOverButtonStyle"; this.selected = false; } diff --git a/bigbluebutton-config/web/index.html b/bigbluebutton-config/web/index.html index 9080f6c93cee5bfbf7bbfff195dff6bd5ba3add2..b60d622dc31def623855743a07faa3b94c3a5995 100644 --- a/bigbluebutton-config/web/index.html +++ b/bigbluebutton-config/web/index.html @@ -262,7 +262,7 @@ <div class="row"> <div class="span twelve center"> <p>Copyright © 2017 BigBlueButton Inc.<br> - <small>Version <a href="http://docs.bigbluebutton.org/">1.1.0</a></small> + <small>Version <a href="http://docs.bigbluebutton.org/">2.0-dev</a></small> </p> </div> </div> diff --git a/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js index ad3e42d9f47abb6fe9a93dddbc86909e61803389..c01d378aff7c1e2907e778b3e00d475382feca7c 100644 --- a/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js +++ b/bigbluebutton-html5/imports/api/1.1/audio/client/bridge/sip.js @@ -13,18 +13,18 @@ export default class SIPBridge extends BaseAudioBridge { this.userData = userData; } - joinListenOnly() { + joinListenOnly(stunServers, turnServers) { makeCall('listenOnlyToggle', true); - this._joinVoiceCallSIP({ isListenOnly: true }); + this._joinVoiceCallSIP({ isListenOnly: true, stunServers, turnServers }); } - joinMicrophone() { - this._joinVoiceCallSIP({ isListenOnly: false }); + joinMicrophone(stunServers, turnServers) { + this._joinVoiceCallSIP({ isListenOnly: false, stunServers, turnServers }); } // Periodically check the status of the WebRTC call, when a call has been established attempt to // hangup, retry if a call is in progress, send the leave voice conference message to BBB - exitAudio(isListenOnly, afterExitCall = () => {}) { + exitAudio(isListenOnly, afterExitCall = () => { }) { // To be called when the hangup is confirmed const hangupCallback = function () { console.log(`Exited Voice Conference, listenOnly=${isListenOnly}`); @@ -40,7 +40,7 @@ export default class SIPBridge extends BaseAudioBridge { triedHangup = false; // function to initiate call - const checkToHangupCall = ((context, afterExitCall = () => {}) => { + const checkToHangupCall = ((context, afterExitCall = () => { }) => { // if an attempt to hang up the call is made when the current session is not yet finished, // the request has no effect keep track in the session if we haven't tried a hangup if (window.getCallStatus() != null && !triedHangup) { @@ -96,8 +96,8 @@ export default class SIPBridge extends BaseAudioBridge { }; const stunsAndTurns = { - stun: this.userData.stuns, - turn: this.userData.turns, + stun: options.stunServers, + turn: options.turnServers, }; callIntoConference(extension, (audio) => { diff --git a/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js b/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js index 8092a0931503676d1d658f988c937200984c602e..62033062abb93c795f872fbcb691a5d3521edd12 100644 --- a/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js +++ b/bigbluebutton-html5/imports/api/1.1/audio/client/manager/index.js @@ -1,3 +1,4 @@ +import Auth from '/imports/ui/services/auth'; import BaseAudioBridge from '../bridge/base'; import VertoBridge from '../bridge/verto'; import SIPBridge from '../bridge/sip'; @@ -24,12 +25,42 @@ export default class AudioManager { } joinAudio(listenOnly) { - if (listenOnly || this.microphoneLockEnforced) { - this.isListenOnly = true; - this.bridge.joinListenOnly(); - } else { - this.bridge.joinMicrophone(); - } + AudioManager.fetchServers().then(({ error, stunServers, turnServers }) => { + if (error) { + //We need to alert the user about this problem by some gui message. + console.error("Couldn't fetch the stuns/turns servers!"); + return; + } + + if (listenOnly || this.microphoneLockEnforced) { + this.isListenOnly = true; + this.bridge.joinListenOnly(stunServers, turnServers); + } else { + this.bridge.joinMicrophone(stunServers, turnServers); + } + }); + } + + // We use on the SIP an String Array, while in the server, it comes as + // an Array of objects, we need to map from Array<Object> to Array<String> + static mapToArray({ response, stunServers, turnServers }) { + const promise = new Promise((resolve) => { + if (response) { + resolve({ error: 404, stunServers: [], turnServers: [] }); + } + resolve({ + stunServers: stunServers.map(server => server.url), + turnServers: turnServers.map(server => server.url), + }); + }); + return promise; } + static fetchServers() { + const url = `/bigbluebutton/api/stuns?sessionToken=${Auth.sessionToken}`; + + return fetch(url) + .then(response => response.json()) + .then(json => AudioManager.mapToArray(json)); + } } diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/handlers/presenterAssigned.js b/bigbluebutton-html5/imports/api/2.0/users/server/handlers/presenterAssigned.js index 2c11d9f772cc7d2f27fd9a3e694b4e67fc1995b2..060e5cd20edcf3c37900743c43147b7d56df4e16 100644 --- a/bigbluebutton-html5/imports/api/2.0/users/server/handlers/presenterAssigned.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/handlers/presenterAssigned.js @@ -13,16 +13,17 @@ const unassignCurrentPresenter = (meetingId, presenterId) => { $set: { 'user.presenter': false, }, + $pop: { + 'user.roles': 'presenter', + }, }; - const cb = (err, numChanged) => { + const cb = (err) => { if (err) { return Logger.error(`Unassigning current presenter from collection: ${err}`); } - if (numChanged) { - return Logger.info(`Unassign current presenter meeting=${meetingId}`); - } + return Logger.info(`Unassign current presenter meeting=${meetingId}`); }; return Users.update(selector, modifier, cb); @@ -42,17 +43,22 @@ export default function handlePresenterAssigned({ body }, meetingId) { $set: { 'user.presenter': true, }, + $push: { + 'user.roles': 'presenter', + }, }; - const cb = (err, numChanged) => { + const cb = (err, numChange) => { if (err) { return Logger.error(`Assigning user as presenter: ${err}`); } - if (numChanged) { + if (numChange) { unassignCurrentPresenter(meetingId, presenterId); return Logger.info(`Assigned user as presenter id=${presenterId} meeting=${meetingId}`); } + + return Logger.info(`User not assigned as presenter id=${presenterId} meeting=${meetingId}`); }; return Users.update(selector, modifier, cb); diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/methods.js b/bigbluebutton-html5/imports/api/2.0/users/server/methods.js index 53eab01a42d79a810bc566edd303ba6e0e557e60..e898b3ff4a886d6bd16364f2c4a2cf042f88aedd 100644 --- a/bigbluebutton-html5/imports/api/2.0/users/server/methods.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/methods.js @@ -3,11 +3,15 @@ import mapToAcl from '/imports/startup/mapToAcl'; import userLogout from './methods/userLogout'; import validateAuthToken from './methods/validateAuthToken'; import setEmojiStatus from './methods/setEmojiStatus'; +import assignPresenter from './methods/assignPresenter'; +import listenOnlyToggle from './methods/listenOnlyToggle'; -Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', +Meteor.methods(mapToAcl(['methods.userLogout', 'methods.setEmojiStatus', 'methods.assignPresenter', 'methods.listenOnlyToggle', ], { userLogout, setEmojiStatus, + assignPresenter, + listenOnlyToggle, })); Meteor.methods({ validateAuthToken2x: validateAuthToken }); diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/methods/assignPresenter.js b/bigbluebutton-html5/imports/api/2.0/users/server/methods/assignPresenter.js new file mode 100755 index 0000000000000000000000000000000000000000..e8e38d50fb9d40fd490c883eb6302973b3373177 --- /dev/null +++ b/bigbluebutton-html5/imports/api/2.0/users/server/methods/assignPresenter.js @@ -0,0 +1,45 @@ +import { Meteor } from 'meteor/meteor'; +import { check } from 'meteor/check'; +import RedisPubSub from '/imports/startup/server/redis2x'; +import Logger from '/imports/startup/server/logger'; +import Users from '/imports/api/2.0/users'; + +export default function assignPresenter(credentials, userId) { + const REDIS_CONFIG = Meteor.settings.redis; + const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; + const EVENT_NAME = 'AssignPresenterReqMsg'; + + const { meetingId, requesterUserId } = credentials; + + check(meetingId, String); + check(requesterUserId, String); + check(userId, String); + + const User = Users.findOne({ + meetingId, + userId, + }); + + if (!User) { + throw new Meteor.Error( + 'user-not-found', 'You need a valid user to be able to set presenter'); + } + + const header = { + name: EVENT_NAME, + meetingId, + userId, + }; + + const payload = { + newPresenterId: userId, + newPresenterName: User.user.name, + assignedBy: requesterUserId, + requesterId: requesterUserId, + }; + + Logger.verbose(`User '${userId}' setted as presenter by '${ + requesterUserId}' from meeting '${meetingId}'`); + + return RedisPubSub.publish(CHANNEL, EVENT_NAME, meetingId, payload, header); +} diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js b/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js index b6d0bd3d54c3b5f56012039d2fb74346166a741b..f4d40b1760d9f36835ec2a24cffa1f3d42339f76 100755 --- a/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/methods/listenOnlyToggle.js @@ -7,7 +7,7 @@ import Users from '/imports/api/2.0/users'; export default function listenOnlyToggle(credentials, isJoining = true) { const REDIS_CONFIG = Meteor.settings.redis; - const CHANNEL = REDIS_CONFIG.channels.toBBBApps.meeting; + const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; const { meetingId, requesterUserId } = credentials; @@ -18,40 +18,36 @@ export default function listenOnlyToggle(credentials, isJoining = true) { let EVENT_NAME; if (isJoining) { - EVENT_NAME = 'user_connected_to_global_audio'; + EVENT_NAME = 'UserConnectedToGlobalAudioMsg'; } else { - EVENT_NAME = 'user_disconnected_from_global_audio'; + EVENT_NAME = 'UserDisconnectedFromGlobalAudioMsg'; } - const Meeting = Meetings.findOne({ meetingId }); - if (!Meeting) { - throw new Meteor.Error( - 'meeting-not-found', 'You need a valid meeting to be able to toggle audio'); - } - - check(Meeting.voiceConf, String); - const User = Users.findOne({ - meetingId, userId: requesterUserId, }); + const Meeting = Meetings.findOne({ meetingId }); + if (!User) { throw new Meteor.Error( 'user-not-found', 'You need a valid user to be able to toggle audio'); } - check(User.user.name, String); + // check(User.user.name, String); + + const header = { + name: EVENT_NAME, + voiceConf: Meeting.voiceProp.voiceConf, + }; const payload = { userId: requesterUserId, - meeting_id: meetingId, - voice_conf: Meeting.voiceConf, - name: User.user.name, + name: User.name, }; Logger.verbose(`User '${requesterUserId}' ${isJoining ? 'joined' : 'left'} global audio from meeting '${meetingId}'`); - return RedisPubSub.publish(CHANNEL, EVENT_NAME, payload); + return RedisPubSub.publish(CHANNEL, EVENT_NAME, meetingId, payload, header); } diff --git a/bigbluebutton-html5/imports/api/2.0/users/server/modifiers/addUser.js b/bigbluebutton-html5/imports/api/2.0/users/server/modifiers/addUser.js index 809d6e8ebc0bd4419f2f295c9151876861df7fa3..ca2d20fcf25d052533b5d54ebbdfb3203aa69a29 100644 --- a/bigbluebutton-html5/imports/api/2.0/users/server/modifiers/addUser.js +++ b/bigbluebutton-html5/imports/api/2.0/users/server/modifiers/addUser.js @@ -31,26 +31,16 @@ export default function addUser(meetingId, user) { user.role = ROLE_VIEWER; } - const userRoles = []; - userRoles.push('viewer'); - userRoles.push(user.presenter ? 'presenter' : undefined); - userRoles.push(user.role === 'MODERATOR' ? 'moderator' : undefined); + let userRoles = []; + + userRoles.push( + 'viewer', + user.presenter ? 'presenter' : false, + user.role === 'MODERATOR' ? 'moderator' : false, + ); + + userRoles = userRoles.filter(Boolean); - /** - * { - "intId": "w_opaqxrriwvga", - "extId": "w_opaqxrriwvga", - "name": "html5", - "role": "VIEWER", - "guest": false, - "authed": false, - "waitingForAcceptance": false, - "emoji": "none", - "presenter": false, - "locked": false, - "avatar": "http://localhost/client/avatar.png" -} - */ const modifier = { $set: Object.assign( { meetingId }, @@ -74,9 +64,7 @@ export default function addUser(meetingId, user) { return Logger.info(`Added user id=${userId} meeting=${meetingId}`); } - if (numChanged) { - return Logger.info(`Upserted user id=${userId} meeting=${meetingId}`); - } + return Logger.info(`Upserted user id=${userId} meeting=${meetingId}`); }; return Users.upsert(selector, modifier, cb); diff --git a/bigbluebutton-html5/imports/api/acl/Acl.js b/bigbluebutton-html5/imports/api/acl/Acl.js index c205b5adc3913da89854be2bc15700785021a6be..597d8365cbaf57c8682108c98f32846a75e6eec0 100644 --- a/bigbluebutton-html5/imports/api/acl/Acl.js +++ b/bigbluebutton-html5/imports/api/acl/Acl.js @@ -9,9 +9,6 @@ export class Acl { } can(permission, credentials) { - - return true; // TODO !!!! REMOVE THIS - check(permission, String); const permissions = this.getPermissions(credentials); diff --git a/bigbluebutton-html5/imports/startup/client/auth.js b/bigbluebutton-html5/imports/startup/client/auth.js index 68d10187d55cb6eaa0dffdddbb0689509a66e430..5d6617aa9677e7b9ccf1493d7fa5729d1ceedc43 100755 --- a/bigbluebutton-html5/imports/startup/client/auth.js +++ b/bigbluebutton-html5/imports/startup/client/auth.js @@ -21,7 +21,7 @@ export function joinRouteHandler(nextState, replace, callback) { .then((data) => { const { meetingID, internalUserID, authToken, logoutUrl } = data.response; - Auth.set(meetingID, internalUserID, authToken, logoutUrl); + Auth.set(meetingID, internalUserID, authToken, logoutUrl, sessionToken); replace({ pathname: '/' }); callback(); }); diff --git a/bigbluebutton-html5/imports/startup/client/base.jsx b/bigbluebutton-html5/imports/startup/client/base.jsx index 096d407c46a158ecbd232cc497813e7f9f00df96..d4f6dec0b17e756c731fc19f36d04b901ba6771a 100644 --- a/bigbluebutton-html5/imports/startup/client/base.jsx +++ b/bigbluebutton-html5/imports/startup/client/base.jsx @@ -85,7 +85,7 @@ Base.defaultProps = defaultProps; const SUBSCRIPTIONS_NAME = [ 'users2x', 'users', 'chat', 'chat2x', 'cursor', 'cursor2x', 'deskshare', 'meetings', 'meetings2x', - 'polls', 'polls2x', 'presentations', 'presentations2x', 'shapes', 'shapes2x', 'slides', 'slides2x', 'captions', 'captions2x', 'breakouts', 'breakouts2x', + 'polls', 'polls2x', 'presentations', 'presentations2x', 'shapes', 'shapes2x', 'slides', 'slides2x', 'captions', 'captions2x', 'breakouts', 'breakouts2x', ]; const BaseContainer = createContainer(({ params }) => { diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js index e2fef659414f56ae2dafee9f87dbe955f8892f9d..7aa92057f2cf2fade4c3e633bda8136397cc8edc 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/service.js +++ b/bigbluebutton-html5/imports/ui/components/audio/service.js @@ -2,25 +2,23 @@ import Users from '/imports/api/2.0/users'; import Auth from '/imports/ui/services/auth'; import AudioManager from '/imports/api/1.1/audio/client/manager'; +import Meetings from '/imports/api/2.0/meetings'; let audioManager; + const init = () => { const userId = Auth.userID; const User = Users.findOne({ userId }); - const username = User.name; + const username = User.user.name; + const Meeting = Meetings.findOne({ meetingId: User.meetingId }); + const voiceBridge = Meeting.voiceProp.voiceConf; - const turns = []; - const stuns = []; - // FIX ME - const voiceBridge = 'Meeting.voiceConf'; // FIX ME - const microphoneLockEnforced = 'Meeting.roomLockSettings.disableMic'; + const microphoneLockEnforced = false; const userData = { userId, username, - turns, - stuns, voiceBridge, microphoneLockEnforced, }; diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js index 2b63515fde11e05f706586cf0c31ae6a5cf9eaea..4b2c73f2f9c1d73815b792feaea7b66684da40f9 100644 --- a/bigbluebutton-html5/imports/ui/services/auth/index.js +++ b/bigbluebutton-html5/imports/ui/services/auth/index.js @@ -13,6 +13,7 @@ class Auth { this._meetingID = Storage.getItem('meetingID'); this._userID = Storage.getItem('userID'); this._authToken = Storage.getItem('authToken'); + this._sessionToken = Storage.getItem('sessionToken'); this._logoutURL = Storage.getItem('logoutURL'); this._loggedIn = { value: false, @@ -29,6 +30,15 @@ class Auth { Storage.setItem('meetingID', this._meetingID); } + set sessionToken(sessionToken) { + this._sessionToken = sessionToken; + Storage.setItem('sessionToken', this._sessionToken); + } + + get sessionToken() { + return this._sessionToken; + } + get userID() { return this._userID; } @@ -72,14 +82,16 @@ class Auth { requesterUserId: this.userID, requesterToken: this.token, logoutURL: this.logoutURL, + sessionToken: this.sessionToken, }; } - set(meetingId, requesterUserId, requesterToken, logoutURL) { + set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken) { this.meetingID = meetingId; this.userID = requesterUserId; this.token = requesterToken; this.logoutURL = logoutURL; + this.sessionToken = sessionToken; } clearCredentials(...args) { @@ -88,6 +100,7 @@ class Auth { this.token = null; this.loggedIn = false; this.logoutURL = null; + this.sessionToken = null; return Promise.resolve(...args); } diff --git a/bigbluebutton-html5/private/config/public/acl.yaml b/bigbluebutton-html5/private/config/public/acl.yaml index 698feddba35e81bfa8309511193eb423516cb742..57c97d18b066538009a22ca97cf959a856fa39a5 100644 --- a/bigbluebutton-html5/private/config/public/acl.yaml +++ b/bigbluebutton-html5/private/config/public/acl.yaml @@ -4,6 +4,7 @@ acl: - 'users' - 'cursor' - 'deskshare' + - 'screenshare' - 'meetings' - 'polls' - 'chat' @@ -20,6 +21,7 @@ acl: - 'sendChat' moderator: methods: + - 'assignPresenter' - 'kickUser' - 'muteUser' - 'unmuteUser'