diff --git a/bigbluebutton-client/branding/default/style/css/V2Theme.css b/bigbluebutton-client/branding/default/style/css/V2Theme.css index e4abfd5ca838cad29f2c39229fbfba7bb96050a2..10c789bc0c82193427d0b6584d26cfdedaf3b919 100755 --- a/bigbluebutton-client/branding/default/style/css/V2Theme.css +++ b/bigbluebutton-client/branding/default/style/css/V2Theme.css @@ -63,6 +63,7 @@ global { mx|Application { backgroundGradientColors : #F1F3F7, #F1F3F7; backgroundColor : #F1F3F7; + paddingTop : 0; } /* @@ -123,16 +124,41 @@ mx|Application { */ mx|ApplicationControlBar { + borderSkin : ClassReference(null); cornerRadius : 0; fillAlphas : 1, 1; fillColors : #FFFFFF, #FFFFFF; highlightAlphas : 0, 0; + paddingBottom : 0; + paddingLeft : 0; + paddingRight : 0; + paddingTop : 0; + verticalAlign : top; } phonecomponents|MuteMeButton { glowFilterColor : #1070D7; } +.toolbarMainBox { + backgroundColor : #FFFFFF; + paddingTop : 4; + paddingBottom : 4; +} + +.breakoutRoomRibbon { + backgroundColor : #1070D7; + color : #FFFFFF; + fontSize : 16; + verticalAlign : middle; + horizontalAlign : center; +} + +.topBoxStyle { + paddingLeft : 8; + paddingRight : 8; +} + .toolbarSeparator { strokeWidth : 1; strokeColor : #CDD4DB; @@ -402,6 +428,14 @@ users|BreakoutRoomSettings { headerHeight : 0; } +users|JoinBreakoutRoomWindow { + horizontalAlign : center; + iconRooms : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Join_Room"); + paddingBottom : 24; + paddingTop : 0; + verticalGap : 18; +} + users|RoomActionsRenderer { paddingLeft : 5; paddingRight : 5; @@ -445,6 +479,26 @@ users|RoomActionsRenderer { horizontalAlign : center; } +.roomNumberStyle { + color : #25385D; + fontSize : 30; + fontWeight : bold; + verticalAlign : middle; + textAlign : center; +} + +.joinBreakoutRoomButton { + fillColorUp : #1070D7; + fillColorOver : #0A5EAC; + fillColorDown : #1070D7; + fillColorDisabled : #F0F2F6; + color : #FFFFFF; + textRollOverColor : #FFFFFF; + textSelectedColor : #FFFFFF; + borderStyle : none; + borderThickness : 0; +} + /* //------------------------------ // BrowserPermissionHelper @@ -802,7 +856,8 @@ views|LockSettings { */ views|MainApplicationShell { - verticalGap : 0; + paddingBottom : 0; + verticalGap : 0; } .logsButton { 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 03a0d0661716db37f5fd41260b1237d59e369705..06b5859ba6294339318e41008864e5a9ad5c72b2 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 180d4f5fd17268b5ab190e384fa24ad0986eebc2..f26e3a69c1a7421e9af6fd53b356db7f2847fcf8 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/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties index 000cbeb6d5ce75aec440cfd116b2d356f0fa97aa..ee44114ae8b535d7b6231aa8d10a67e6c3e0122d 100755 --- a/bigbluebutton-client/locale/en_US/bbbResources.properties +++ b/bigbluebutton-client/locale/en_US/bbbResources.properties @@ -788,11 +788,8 @@ bbb.lockSettings.feature=Feature bbb.lockSettings.locked=Locked bbb.lockSettings.lockOnJoin=Lock On Join -bbb.meeting.timeRemaining = Time remaining - bbb.users.breakout.breakoutRooms = Breakout Rooms bbb.users.breakout.updateBreakoutRooms = Update Breakout Rooms -bbb.users.breakout.timer = <b>{0}</b> bbb.users.breakout.timer.toolTip = Time left for breakout rooms bbb.users.breakout.calculatingRemainingTime = Calculating remaining time... bbb.users.breakout.closing = Closing @@ -812,8 +809,11 @@ bbb.users.breakout.invite = Invite bbb.users.breakout.close = Close bbb.users.breakout.closeAllRooms = Close All Breakout Rooms bbb.users.breakout.insufficientUsers = Insufficient users. You should place at least one user in one breakout room. -bbb.users.breakout.openJoinURL = You have been invited to join Breakout Room {0}\n(By accepting, you will automatically leave the audio conference) -bbb.users.breakout.confirm = Confirm Join Breakout Room +bbb.users.breakout.confirm = Join A Breakout Room +bbb.users.breakout.invited = You have been invited to join <b>Breakout Room</b> +bbb.users.breakout.accept = By accepting, you will automatically leave the audio and the video confrences. +bbb.users.breakout.joinSession = Join Session +bbb.users.breakout.youareinroom = You are in Breakout Room {0} bbb.users.roomsGrid.room = Room bbb.users.roomsGrid.users = Users bbb.users.roomsGrid.action = Action diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/BreakoutTimerUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/BreakoutTimerUtil.as deleted file mode 100755 index 15f3ce07ccf1ae073ad37595f608a9c3e07e2a51..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/core/BreakoutTimerUtil.as +++ /dev/null @@ -1,64 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2016 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.core { - - import flash.events.TimerEvent; - import flash.utils.Dictionary; - import flash.utils.Timer; - - import mx.controls.Label; - - import org.bigbluebutton.util.i18n.ResourceUtil; - - public final class BreakoutTimerUtil { - public static var timers:Dictionary = new Dictionary(true); - - public static function setCountDownTimer(label:Label, seconds:int):void { - var timer:Timer = getTimer(label.id, seconds); - if (!timer.hasEventListener(TimerEvent.TIMER)) { - timer.addEventListener(TimerEvent.TIMER, function():void { - var remainingSeconds:int = timer.repeatCount - timer.currentCount; - var formattedTime:String = (Math.floor(remainingSeconds / 60)) + ":" + (remainingSeconds % 60 >= 10 ? "" : "0") + (remainingSeconds % 60); - label.htmlText = ResourceUtil.getInstance().getString('bbb.users.breakout.timer', [formattedTime]); - }); - timer.addEventListener(TimerEvent.TIMER_COMPLETE, function():void { - label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.closing'); - }); - } else { - timer.stop(); - timer.reset(); - } - timer.start(); - } - - public static function getTimer(name:String, defaultRepeatCount:Number):Timer { - if (timers[name] == undefined) { - timers[name] = new Timer(1000, defaultRepeatCount); - } - Timer(timers[name]).repeatCount = defaultRepeatCount; - return timers[name]; - } - - public static function stopTimer(name:String):void { - if (timers[name] != undefined) { - timers[name].stop(); - } - } - } -} diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as index 2d8090c5562ef307327a75044763aed21e5ce7e9..c997d978643fff0c1373576afe0b7d1396de4458 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as @@ -21,10 +21,10 @@ package org.bigbluebutton.core { import flash.events.TimerEvent; import flash.utils.Dictionary; import flash.utils.Timer; - + import mx.controls.Label; - - import org.bigbluebutton.util.i18n.ResourceUtil; + + import org.bigbluebutton.util.i18n.ResourceUtil; public final class TimerUtil { public static var timers:Dictionary = new Dictionary(true); @@ -35,7 +35,7 @@ package org.bigbluebutton.core { timer.addEventListener(TimerEvent.TIMER, function():void { var remainingSeconds:int = timer.repeatCount - timer.currentCount; var formattedTime:String = (Math.floor(remainingSeconds / 60)) + ":" + (remainingSeconds % 60 >= 10 ? "" : "0") + (remainingSeconds % 60); - label.htmlText = ResourceUtil.getInstance().getString('bbb.users.breakout.timer', [formattedTime]); + label.text = formattedTime; }); timer.addEventListener(TimerEvent.TIMER_COMPLETE, function():void { label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.closing'); diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml index b98aeb7dcb163409c00bfff9937e78eb80f288a1..98db8fb85aaf0aa197dcbb4a02512f7d6e4f9fd3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml @@ -32,8 +32,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:common="org.bigbluebutton.common.*" horizontalScrollPolicy="off" verticalScrollPolicy="off" creationComplete="initializeShell()" - addedToStage="onAddedToStage()" - verticalGap="0"> + addedToStage="onAddedToStage()" > <!-- height="{parentApplication.height - 1}" : The container height is set to fix height because the percentHeight @@ -82,76 +81,76 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{BBBEvent.REMOVE_GUEST_FROM_LIST}" method="removeGuestWindow" /> <mate:Listener type="{BBBEvent.WAITING_FOR_MODERATOR_ACCEPTANCE}" method="openWaitWindow" /> <mate:Listener type="{BBBEvent.RECONNECT_DISCONNECTED_EVENT}" method="closeWaitWindow"/> - <mate:Listener type="{RoundTripLatencyReceivedEvent.ROUND_TRIP_LATENCY_RECEIVED}" method="handleRoundTripLatencyReceivedEvent"/> + <mate:Listener type="{RoundTripLatencyReceivedEvent.ROUND_TRIP_LATENCY_RECEIVED}" method="handleRoundTripLatencyReceivedEvent"/> </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 flash.utils.setTimeout; - - 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.RoundTripLatencyReceivedEvent; - 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; + 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 flash.utils.setTimeout; + + 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.RoundTripLatencyReceivedEvent; + 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); @@ -245,11 +244,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. controlBar.visible = controlBar.includeInLayout = false; calculateCanvasHeight(); } - - _respTimer = new ResponsivenessTimer(); - _respTimer.start(); + _respTimer = new ResponsivenessTimer(); + _respTimer.start(); } - + private function updateCopyrightText():void { if (StringUtils.isEmpty(brandingOptions.copyright)) { copyrightText = ResourceUtil.getInstance().getString('bbb.mainshell.copyrightLabel2',[appVersion]); @@ -934,6 +932,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function updateToolbarHeight():void { if (toolbarHeight != 0) { toolbarHeight = Math.max(DEFAULT_TOOLBAR_HEIGHT, toolbar.logo.height + toolbar.quickLinks.includeInLayout ? toolbar.quickLinks.height : 0 + 10); + if (UsersUtil.isBreakout()) { + toolbarHeight += toolbar.breakoutRibbon.height; + } } calculateCanvasHeight(); } @@ -1042,8 +1043,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. verticalAlign="middle" toolbarOptions="{layoutOptions}" paddingTop="{toolbarPaddingTop}" - updateComplete="updateToolbarHeight()" - paddingBottom="0" /> + updateComplete="updateToolbarHeight()"/> <!-- MainCanvas height has to be forced or it will never show and the application will not continue loading --> <views:MainCanvas id="mdiCanvas" diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml index 9d4569e23c4d6e84be3a374336eda48327395e1b..44c6364377d4f1cd6f1c9c50bd74bb0b89a1c150 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml @@ -49,7 +49,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{SuccessfulLoginEvent.USER_LOGGED_IN}" method="refreshModeratorButtonsVisibility" /> <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" /> <mate:Listener type="{BBBEvent.CONFIRM_LOGOUT_END_MEETING_EVENT}" method="confirmEndSession" /> - <mate:Listener type="{MeetingTimeRemainingEvent.TIME_REMAINING}" method="handleRemainingTimeUpdate" /> + <mate:Listener type="{MeetingTimeRemainingEvent.TIME_REMAINING}" method="handleRemainingTimeUpdate" /> </fx:Declarations> <fx:Script> <![CDATA[ @@ -191,24 +191,30 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. initBandwidthToolTip(); } } - - private function handleRemainingTimeUpdate(e:MeetingTimeRemainingEvent):void { - if (! timeRemaining.visible) { - timeRemaining.visible = true; - timeRemainingLabel.visible = true; - } - TimerUtil.setCountDownTimer(timeRemaining, e.timeLeftInSec); - } - - private function retrieveMeetingName(e:ConferenceCreatedEvent):void { - if (toolbarOptions.showMeetingName) { - var meetingTitle:String = LiveMeeting.inst().meeting.name; - if (meetingTitle != null) { - meetingNameLbl.text = meetingTitle; - } - } - logFlashPlayerCapabilities(); - } + private function handleRemainingTimeUpdate(e:MeetingTimeRemainingEvent):void { + if (!timeRemaining.visible) { + timeRemaining.visible = true; + } + TimerUtil.setCountDownTimer(timeRemaining, e.timeLeftInSec); + } + + private function retrieveMeetingName(e:ConferenceCreatedEvent):void { + if (toolbarOptions.showMeetingName) { + var meetingTitle:String = LiveMeeting.inst().meeting.name; + if (meetingTitle != null) { + meetingNameLbl.text = meetingTitle; + } + } + + if (UsersUtil.isBreakout()) { + breakoutRibbon.visible = breakoutRibbon.includeInLayout = true; + var sequence:String = StringUtils.substringAfterLast(UsersUtil.getMeetingName(), " "); + sequence = StringUtils.substringBefore(sequence, ")"); + breakoutLabel.text = ResourceUtil.getInstance().getString("bbb.users.breakout.youareinroom", [sequence]); + } + + logFlashPlayerCapabilities(); + } private function refreshModeratorButtonsVisibility(e:*):void { showGuestSettingsButton = UsersUtil.amIModerator() && usersOptions.enableGuestUI; @@ -506,9 +512,19 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. tabIndices="{[recordBtn, webRTCAudioStatus, shortcutKeysBtn, helpBtn, btnLogout]}"/> </fx:Declarations> - <mx:VBox id="mainBox" width="100%" horizontalScrollPolicy="off" verticalAlign="middle"> + <mx:VBox id="mainBox" styleName="toolbarMainBox" width="100%" horizontalScrollPolicy="off" verticalAlign="top"> + <!-- Breakout room Ribbon--> + <mx:HBox id="breakoutRibbon" width="100%" height="30" + styleName="breakoutRoomRibbon" + visible="false" includeInLayout="false" > + <mx:Label id="breakoutLabel" /> + <mx:Label text="|" visible="{timeRemaining.visible}" includeInLayout="{timeRemaining.visible}"/> + <mx:Label id="timeRemaining" visible="false" includeInLayout="{timeRemaining.visible}" + text="{ResourceUtil.getInstance().getString('bbb.users.breakout.calculatingRemainingTime')}" + toolTip="{ResourceUtil.getInstance().getString('bbb.users.breakout.timer.toolTip')}"/> + </mx:HBox> <!-- Top bar --> - <mx:HBox id="topBox" width="100%" verticalAlign="middle" horizontalScrollPolicy="off"> + <mx:HBox id="topBox" width="100%" verticalAlign="middle" horizontalScrollPolicy="off" styleName="topBoxStyle"> <mx:HBox id="titleBox" width="40%" horizontalAlign="left" verticalAlign="middle" horizontalScrollPolicy="off"> <mx:Image id="logo" right="20" maxHeight="35" ioError="hideLogo()" /> <mx:VRule styleName="toolbarSeparator" height="10" /> @@ -520,12 +536,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:HBox id="addedBtnsDeskShare" /> </mx:HBox> <mx:HBox id="rightBox" width="40%" horizontalAlign="right" verticalAlign="middle" horizontalScrollPolicy="off"> - <mx:Label id="timeRemainingLabel" visible="false" includeInLayout="{timeRemainingLabel.visible}" - text="{ResourceUtil.getInstance().getString('bbb.meeting.timeRemaining')}:" - toolTip="{ResourceUtil.getInstance().getString('bbb.meeting.timeRemaining')}"/> - <mx:Label id="timeRemaining" visible="false" includeInLayout="{timeRemaining.visible}" - text="{ResourceUtil.getInstance().getString('bbb.users.breakout.calculatingRemainingTime')}" - toolTip="{ResourceUtil.getInstance().getString('bbb.users.breakout.timer.toolTip')}"/> <views:RecordButton id="recordBtn" visible="{showRecordButton}" includeInLayout="{showRecordButton}"/> <views:WebRTCAudioStatus id="webRTCAudioStatus" height="30"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/JoinBreakoutRoomWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/JoinBreakoutRoomWindow.mxml new file mode 100644 index 0000000000000000000000000000000000000000..c57c483692a38b4bd8268ecb06a4c974d22f76ad --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/JoinBreakoutRoomWindow.mxml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + +BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + +Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + +This program is free software; you can redistribute it and/or modify it under the +terms of the GNU Lesser General Public License as published by the Free Software +Foundation; either version 3.0 of the License, or (at your option) any later +version. + +BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + +--> + +<mx:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:mx="library://ns.adobe.com/flex/mx" + layout="vertical" + showCloseButton="true" + close="PopUpUtil.removePopUp(this)" + width="600"> + <fx:Script> + <![CDATA[ + import com.asfusion.mate.events.Dispatcher; + + import flash.net.navigateToURL; + + import org.bigbluebutton.core.PopUpUtil; + import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand; + import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; + + private var dispatcher:Dispatcher = new Dispatcher(); + + private var joinUrl:String; + + public function setBreakoutRoomSettings(sequence:int, joinUrl:String):void { + sequenceLabel.text = sequence.toString(); + this.joinUrl = joinUrl; + } + + protected function joinButtonClickHandler(event:MouseEvent):void { + dispatcher.dispatchEvent(new LeaveVoiceConferenceCommand()); + dispatcher.dispatchEvent(new StopBroadcastEvent()); + navigateToURL(new URLRequest(this.joinUrl), "_blank"); + PopUpUtil.removePopUp(this); + } + ]]> + </fx:Script> + + <s:Label styleName="titleWindowStyle" + maxWidth="500" + text="{ResourceUtil.getInstance().getString('bbb.users.breakout.confirm')}" /> + <mx:Label htmlText="{ResourceUtil.getInstance().getString('bbb.users.breakout.invited')}" /> + <mx:Canvas> + <mx:Image source="{getStyle('iconRooms')}" /> + <mx:Canvas x="16" + y="47" + height="38" + width="70"> + <s:Label id="sequenceLabel" + styleName="roomNumberStyle" + verticalCenter="0" + horizontalCenter="0" /> + </mx:Canvas> + </mx:Canvas> + <mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.accept')}" /> + <mx:Button id="joinButton" + label="{ResourceUtil.getInstance().getString('bbb.users.breakout.joinSession')}" + click="joinButtonClickHandler(event)" + styleName="joinBreakoutRoomButton" /> + +</mx:TitleWindow> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml index 3f2b5497fa041e08c659b20c908b53dd132b95aa..c8dec509bb7f5aef0d2d4136ebe63fa393c7a9f6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml @@ -65,17 +65,13 @@ $Id: $ <![CDATA[ import com.asfusion.mate.events.Dispatcher; - import flash.net.navigateToURL; - import mx.binding.utils.BindingUtils; import mx.collections.ArrayCollection; - import mx.controls.Alert; import mx.controls.Menu; import mx.controls.dataGridClasses.DataGridColumn; import mx.controls.listClasses.IListItemRenderer; import mx.core.FlexGlobals; import mx.core.mx_internal; - import mx.events.CloseEvent; import mx.events.CollectionEvent; import mx.events.ListEvent; import mx.events.MenuEvent; @@ -86,7 +82,6 @@ $Id: $ import org.bigbluebutton.common.IBbbModuleWindow; import org.bigbluebutton.common.Role; import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.BreakoutTimerUtil; import org.bigbluebutton.core.EventConstants; import org.bigbluebutton.core.KeyboardUtil; import org.bigbluebutton.core.PopUpUtil; @@ -119,13 +114,11 @@ $Id: $ import org.bigbluebutton.main.model.users.events.StreamStoppedEvent; import org.bigbluebutton.main.views.MainCanvas; import org.bigbluebutton.main.views.WellPositionedMenu; - import org.bigbluebutton.modules.phone.events.LeaveVoiceConferenceCommand; import org.bigbluebutton.modules.users.events.MeetingMutedEvent; import org.bigbluebutton.modules.users.events.UsersRollEvent; import org.bigbluebutton.modules.users.model.BreakoutRoomsOptions; import org.bigbluebutton.modules.users.model.UsersOptions; import org.bigbluebutton.modules.users.views.model.BBBUser2x; - import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(UsersWindow); @@ -162,7 +155,7 @@ $Id: $ [Bindable] private var amIPresenter:Boolean = false; - private var joinAlert : Alert; + private var joinWindow : JoinBreakoutRoomWindow; private const MAKE_PRESENTER:String = "Make Presenter"; private const KICK_USER:String = "Kick User"; @@ -449,7 +442,7 @@ $Id: $ } private function handleRemainingTimeUpdate(event:BreakoutRoomEvent):void { - BreakoutTimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes); + TimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes); } private function breakoutRoomsListChangeListener(event:CollectionEvent):void { @@ -457,7 +450,7 @@ $Id: $ breakoutTimeLabel.text = "..."; TimerUtil.stopTimer(breakoutTimeLabel.id); // All breakout rooms were close we don't need to display the join URL alert anymore - removeJoinAlert(); + removeJoinWindow(); } } @@ -469,26 +462,15 @@ $Id: $ private function handleBreakoutJoinUrl(event:BreakoutRoomEvent):void { // We display only one alert - removeJoinAlert(); - joinAlert = Alert.show( - ResourceUtil.getInstance().getString('bbb.users.breakout.openJoinURL', [event.breakoutMeetingSequence]), - ResourceUtil.getInstance().getString('bbb.users.breakout.confirm'), - Alert.YES | Alert.NO, - null, - function(e:CloseEvent):void { - if (e.detail == Alert.YES) { - dispatcher.dispatchEvent(new LeaveVoiceConferenceCommand()); - dispatcher.dispatchEvent(new StopBroadcastEvent()); - navigateToURL(new URLRequest(event.joinURL), "_blank"); - } - }, - null, Alert.YES); - } - - private function removeJoinAlert():void { - if (joinAlert != null) { + removeJoinWindow(); + joinWindow = PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, JoinBreakoutRoomWindow) as JoinBreakoutRoomWindow; + joinWindow.setBreakoutRoomSettings(event.breakoutMeetingSequence, event.joinURL); + } + + private function removeJoinWindow():void { + if (joinWindow != null) { // @todo: any way using PopUpUtil ? - PopUpManager.removePopUp(joinAlert); + PopUpManager.removePopUp(joinWindow); } }