diff --git a/bigbluebutton-client/branding/default/style/css/BBBDefault.css b/bigbluebutton-client/branding/default/style/css/BBBDefault.css index 56669639561baad4a6ddca92b79ce029e1779363..1bc2caf6c339996754a624a0e6e5a8bd89098894 100755 --- a/bigbluebutton-client/branding/default/style/css/BBBDefault.css +++ b/bigbluebutton-client/branding/default/style/css/BBBDefault.css @@ -395,70 +395,54 @@ DataGrid { icon: Embed('assets/images/questionmark.png'); } -MDIWindow { - +MDIWindow { /*None of the following properties are overridden by the MDIWindow class*/ + backgroundSize: '100%'; + + cornerRadius: 5; + dropShadowEnabled: false; + titleStyleName: "mypanelTitle"; + + cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); + cornerResizeWidth: 2; + cornerResizeHeight: 2; + cornerResizePaddingRight: 2; + cornerResizePaddingBottom: 2; + + controlButtonWidth: 10; + controlButtonHeight: 10; + controlButtonGap: 4; } .mdiWindowFocus, .presentationWindowStyleFocus, .videoDockStyleFocus { headerHeight: 26; roundedBottomCorners: true; - backgroundAlpha: 1; backgroundColor: #b9babc; - backgroundSize: '100%'; + backgroundAlpha: 1; borderStyle: solid; borderColor: #b9babc; borderAlpha: 1; - borderThickness: 1; - borderThicknessLeft: 1; - borderThicknessTop: 1; - borderThicknessBottom: 1; - borderThicknessRight: 1; - cornerRadius: 0; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; - - cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); - cornerResizeWidth: 2; - cornerResizeHeight: 2; - cornerResizePaddingRight: 2; - cornerResizePaddingBottom: 2; - - controlButtonWidth: 10; - controlButtonHeight: 10; - controlButtonGap: 4; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .mdiWindowNoFocus, .presentationWindowStyleNoFocus, .videoDockStyleNoFocus { headerHeight: 26; - roundedBottomCorners: false; - backgroundAlpha: 0.5; + roundedBottomCorners: true; backgroundColor: #b9babc; - backgroundSize: '100%'; - + backgroundAlpha: 0.5; + borderStyle: solid; borderColor: #b9babc; borderAlpha: 0.5; - borderThickness: 1; - borderThicknessLeft: 1; - borderThicknessTop: 1; - borderThicknessBottom: 1; - borderThicknessRight: 1; - cornerRadius: 0; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; - - cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize"); - cornerResizeWidth: 2; - cornerResizeHeight: 2; - cornerResizePaddingRight: 2; - cornerResizePaddingBottom: 2; - - controlButtonWidth: 10; - controlButtonHeight: 10; - controlButtonGap: 4; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .presentationSlideViewStyle { @@ -477,110 +461,105 @@ MDIWindow { .videoViewStyleNoFocus { - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; headerHeight: 20; - backgroundColor: #b9babc; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; backgroundAlpha: 0.5; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 0.5; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .videoViewStyleFocus { - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; headerHeight: 20; - backgroundColor: #b9babc; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; backgroundAlpha: 1; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 1; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .videoPublishStyleNoFocus { - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundColor: #b9babc; - backgroundAlpha: 0.5; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + headerHeight: 20; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; + backgroundAlpha: 0.5; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 0.5; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .videoPublishStyleFocus { - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundColor: #b9babc; - backgroundAlpha: 1; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + headerHeight: 20; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; + backgroundAlpha: 1; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 1; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .videoAvatarStyleNoFocus { - borderColor: #b9babc; - borderAlpha: 0.5; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundColor: #b9babc; - backgroundAlpha: 0.5; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + headerHeight: 20; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; + backgroundAlpha: 0.5; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 0.5; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .videoAvatarStyleFocus { - borderColor: #b9babc; - borderAlpha: 1; - borderThicknessLeft: 5; - borderThicknessTop: 5; - borderThicknessBottom: 5; - borderThicknessRight: 5; - roundedBottomCorners: true; - cornerRadius: 5; - headerHeight: 20; - backgroundColor: #b9babc; - backgroundAlpha: 1; - dropShadowEnabled: false; - titleStyleName: "mypanelTitle"; + headerHeight: 20; + roundedBottomCorners: true; + backgroundColor: #e6e6e6; + backgroundAlpha: 1; + + borderStyle: solid; + borderColor: #b9babc; + borderAlpha: 1; + borderThicknessLeft: 3; + borderThicknessTop: 0; + borderThicknessBottom: 3; + borderThicknessRight: 3; } .mypanelTitle { color: #5e5f63; fontFamily: Arial; fontSize: 12; + fontWeight: bold; } .closeBtnFocus, .closeBtnNoFocus diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template index 5e80ebd29f607aa26c84f9252c072f1cf91f80f3..0d5da36c2997cb6a016266300aae7a575bd5af6a 100755 --- a/bigbluebutton-client/resources/config.xml.template +++ b/bigbluebutton-client/resources/config.xml.template @@ -7,7 +7,7 @@ <application uri="rtmp://HOST/bigbluebutton" host="http://HOST/bigbluebutton/api/enter" /> <language userSelectionEnabled="true" /> <skinning enabled="true" url="http://HOST/client/branding/css/BBBDefault.css.swf" /> - <shortcutKeys userSelectionEnabled="true" /> + <shortcutKeys showButton="true" /> <layout showLogButton="false" showVideoLayout="false" showResetLayout="true" defaultLayout="Default" showToolbar="true" showFooter="true" showHelpButton="true" showLogoutWindow="true"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as index ce77ce584ceb98cbff75000f6f2b2ce1f20ddc8b..5609a74b8f68524bf0833c0126f4b26731df6958 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as @@ -67,7 +67,7 @@ package org.bigbluebutton.core.model public function get shortcutKeys():Object { var a:Object = new Object(); - a.userSelectionEnabled = ((config.shortcutKeys.@userSelectionEnabled).toUpperCase() == "TRUE") ? true : false; + a.showButton = ((config.shortcutKeys.@showButton).toUpperCase() == "TRUE") ? true : false; return a } diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as index b94d3703a744b713aee2b02ca10a015359a6114f..d005b462285c4cb1d8b7f492b3fe9ee2e5eebdfb 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as @@ -27,7 +27,7 @@ package org.bigbluebutton.core.vo { private var _host:String; private var _numModules:int; private var _languageEnabled:Boolean; - private var _shortcutKeysEnabled:Boolean; + private var _shortcutKeysShowButton:Boolean; private var _skinning:String = ""; private var _showDebug:Boolean = false; @@ -41,7 +41,7 @@ package org.bigbluebutton.core.vo { _host = builder.host; _numModules = builder.numModules; _languageEnabled = builder.languageEnabled; - _shortcutKeysEnabled = builder.shortcutKeysEnabled; + _shortcutKeysShowButton = builder.shortcutKeysShowButton; _skinning = builder.skinning; _showDebug = builder.showDebug; } @@ -82,8 +82,8 @@ package org.bigbluebutton.core.vo { return _languageEnabled; } - public function get shortcutKeysEnabled():Boolean { - return _shortcutKeysEnabled; + public function get shortcutKeysShowButton():Boolean { + return _shortcutKeysShowButton; } public function get skinning():String { diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as index 0ed233c1bf725eb45e0b624cc3386e17ddaae138..6e8f0ed2ed121efb0a3c7552090e7155ddb50d0a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as @@ -27,7 +27,7 @@ package org.bigbluebutton.core.vo { internal var host:String; internal var numModules:int; internal var languageEnabled:Boolean; - internal var shortcutKeysEnabled:Boolean; + internal var shortcutKeysShowButton:Boolean; internal var skinning:String = ""; internal var showDebug:Boolean = false; @@ -71,8 +71,8 @@ package org.bigbluebutton.core.vo { return this; } - public function withShortcutKeysEnabled(shortcutKeysEnabled:Boolean):ConfigBuilder { - this.shortcutKeysEnabled = shortcutKeysEnabled; + public function withShortcutKeysShowButton(shortcutKeysShowButton:Boolean):ConfigBuilder { + this.shortcutKeysShowButton = shortcutKeysShowButton; return this; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as index 9e5e162f80378ec52b3c685d11139d1f3b029c9d..f809e7464249bbc3c04df75aaf027fb05466b8bc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as @@ -52,7 +52,7 @@ package org.bigbluebutton.main.model public var host:String; public var numModules:int; public var languageEnabled:Boolean; - public var shortcutKeysEnabled:Boolean; + public var shortcutKeysShowButton:Boolean; public var skinning:String = ""; public var showDebug:Boolean = false; @@ -102,8 +102,8 @@ package org.bigbluebutton.main.model if (xml.language.@userSelectionEnabled == "true") languageEnabled = true; else languageEnabled = false; - if (xml.shortcutKeys.@userSelectionEnabled == "true") shortcutKeysEnabled = true; - else shortcutKeysEnabled = false; + if (xml.shortcutKeys.@showButton == "true") shortcutKeysShowButton = true; + else shortcutKeysShowButton = false; if (xml.skinning.@enabled == "true") skinning = xml.skinning.@url; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as index 1045948e87b8a31436b98d3939ab2b5657920bd3..c42db1ee559e092dc539690dc8b86e3aff5817a9 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as @@ -140,7 +140,7 @@ package org.bigbluebutton.main.model.modules .withHelpUrl(c.helpURL) .withHost(c.host) .withLanguageEnabled(c.languageEnabled) - .withShortcutKeysEnabled(c.shortcutKeysEnabled) + .withShortcutKeysShowButton(c.shortcutKeysShowButton) .withNumModule(c.numModules) .withPortTestApplication(c.portTestApplication) .withPortTestHost(c.portTestHost) diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml index fee037b4183d116ac5aed81c3053bd9eb67117c2..2d29523f0944abc8e1579c39088a98647c0c13b1 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml @@ -26,253 +26,256 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. showCloseButton="false" close="onCancelClicked()" keyDown="handleKeyDown(event)"> <mx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - import flash.ui.Keyboard; - import mx.events.CloseEvent; - import mx.events.ItemClickEvent; - import mx.managers.PopUpManager; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.LogUtil; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; - import org.bigbluebutton.util.i18n.ResourceUtil; - - static public var PADDING_HORIZONTAL:Number = 6; - static public var PADDING_VERTICAL:Number = 29; - - private var images:Images = new Images(); - - [Bindable] - private var cancelIcon:Class = images.control_play; - - [Bindable] - public var resolutions:Array; - public var publishInClient:Boolean; - - public var camWidth:Number = 320; - public var camHeight:Number = 240; - private var _camera:Camera = null; - - // Timer used to enable the start publishing button, only after get any activity on the camera. - // It avoids the problem of publishing a blank video - private var _activationTimer:Timer = null; - private var _waitingForActivation:Boolean = false; - - static private var _cameraAccessDenied:Boolean = false; - - private var _video:Video; - private var aspectRatio:Number = 1; - - private function onCreationComplete():void { - changeDefaultCamForMac(); - - if (UsersUtil.amIPresenter() && resolutions.length > 1) { - showResControls(true); - } - - if (Camera.names.length > 1) { - showVideoControls(true); - } - - updateCamera(); - } - - private function changeDefaultCamForMac():void { - for (var i:int = 0; i < Camera.names.length; i++){ - if (Camera.names[i] == "USB Video Class Video") { - /** Set as default for Macs */ - _camera = Camera.getCamera("USB Video Class Video"); - } - } - } - - private function showVideoControls(show:Boolean):void { - if (show) { - this.visible = true; - btnStartPublish.visible = true; - } else{ - this.width = 0; - this.height = 0; - btnStartPublish.visible = false; - this.visible = false; - } - } - - private function updateCamera():void { - _camera = null; - - _camera = Camera.getCamera(); - - if (_camera == null) { - _videoHolder.showWarning('bbb.video.publish.hint.cantOpenCamera'); - return; - } - - _camera.addEventListener(ActivityEvent.ACTIVITY, onActivityEvent); - _camera.addEventListener(StatusEvent.STATUS, onStatusEvent); - - if (_camera.muted) { - if (_cameraAccessDenied) { - onCameraAccessDisallowed(); - return; - } else { - _videoHolder.showWarning('bbb.video.publish.hint.waitingApproval'); - } - } else { - // if the camera isn't muted, that is because the user has - // previously allowed the camera capture on the flash privacy box - onCameraAccessAllowed(); - } - - displayVideoPreview(); - } - - private function displayVideoPreview():void { - var videoOptions:VideoConfOptions = new VideoConfOptions(); - _camera.setMotionLevel(5, 1000); - _camera.setKeyFrameInterval(videoOptions.camKeyFrameInterval); - _camera.setMode(camWidth, camHeight, videoOptions.camModeFps); - _camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture); - - if (_camera.width != camWidth || _camera.height != camHeight) { - LogUtil.debug("Resolution " + camWidth + "x" + camHeight + " is not supported, using " + _camera.width + "x" + _camera.height + " instead"); - setResolution(_camera.width, _camera.height); - } - - setComboResolution(); - - if (_video != null) { - _videoHolder.remove(_video); - } - - _video = new Video(); - _video.attachCamera(_camera); - - aspectRatio = (_video.width / _video.height); - - if (aspectRatio > _videoHolder.width / _videoHolder.height) { - _video.width = _videoHolder.width; - _video.height = _videoHolder.width / aspectRatio; - _video.x = 0; - _video.y = (_videoHolder.height - _video.height) / 2; - } else { - _video.width = _videoHolder.height * aspectRatio; - _video.height = _videoHolder.height; - _video.x = (_videoHolder.width - _video.width) / 2; - _video.y = 0; - } - - _videoHolder.add(_video); - } - - private function showResControls(show:Boolean):void { - if (show) cmbResolution.visible = true; - else cmbResolution.visible = false; - } - - private function setComboResolution():void { - var res:Array = cmbResolution.selectedLabel.split( "x" ); - setResolution(Number(res[0]), Number(res[1])); - } - - private function setAspectRatio(width:int, height:int):void { - aspectRatio = (width/height); - this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL; - } - - private function setResolution(width:int, height:int):void { - camWidth = width; - camHeight = height; - setAspectRatio(camWidth, camHeight); - } - - private function startPublishing():void { - updateCamera(); - - // Save the index of the camera. Need it to send the message. - var camIndex:int = _camera.index; - - disableCamera(); - - var globalDispatcher:Dispatcher = new Dispatcher(); - var camEvent:BBBEvent = new BBBEvent(BBBEvent.CAMERA_SETTING); - camEvent.payload.cameraIndex = camIndex; - camEvent.payload.cameraWidth = camWidth; - camEvent.payload.cameraHeight = camHeight; - camEvent.payload.publishInClient = publishInClient; - - globalDispatcher.dispatchEvent(camEvent); - - PopUpManager.removePopUp(this); - } - - private function disableCamera():void { - _camera = null; - _video.attachCamera(null); - _video.clear(); - _videoHolder.remove(_video); - _video = null; - } - - private function handleKeyDown(event:KeyboardEvent):void { - if (event.charCode == Keyboard.ESCAPE) { - disableCamera(); - this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE)); - } - } - - private function onCancelClicked():void { - disableCamera(); - var event:BBBEvent = new BBBEvent(BBBEvent.CAM_SETTINGS_CLOSED); - event.payload['clicked'] = "cancel"; - dispatchEvent(event); - PopUpManager.removePopUp(this); - } - - private function onActivityEvent(e:ActivityEvent):void { - if (_waitingForActivation && e.activating) { - _activationTimer.stop(); - _videoHolder.showWarning('bbb.video.publish.hint.videoPreview', false, "0xFFFF00"); - // controls.btnStartPublish.enabled = true; - _waitingForActivation = false; - } - } - - private function onStatusEvent(e:StatusEvent):void { - if (e.code == "Camera.Unmuted") { - onCameraAccessAllowed(); - // this is just to overwrite the message of waiting for approval - _videoHolder.showWarning('bbb.video.publish.hint.openingCamera'); - } else if (e.code == "Camera.Muted") { - onCameraAccessDisallowed(); - } - } - - private function onCameraAccessAllowed():void { - // set timer to ensure that the camera activates. If not, it might be in use by another application - _waitingForActivation = true; - if (_activationTimer != null) { - _activationTimer.stop(); - } - - _activationTimer = new Timer(10000, 1); - _activationTimer.addEventListener(TimerEvent.TIMER, activationTimeout); - _activationTimer.start(); - } - - private function onCameraAccessDisallowed():void { - _videoHolder.showWarning('bbb.video.publish.hint.cameraDenied'); - _cameraAccessDenied = true; - } - - private function activationTimeout(e:TimerEvent):void { - _videoHolder.showWarning('bbb.video.publish.hint.cameraIsBeingUsed'); - } - - private function showCameraSettings():void { - Security.showSettings(SecurityPanel.CAMERA); - } + import com.asfusion.mate.events.Dispatcher; + import flash.ui.Keyboard; + import mx.events.CloseEvent; + import mx.events.ItemClickEvent; + import mx.managers.PopUpManager; + import org.bigbluebutton.common.Images; + import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; + import org.bigbluebutton.util.i18n.ResourceUtil; + + static public var PADDING_HORIZONTAL:Number = 6; + static public var PADDING_VERTICAL:Number = 29; + + private var images:Images = new Images(); + + [Bindable] + private var cancelIcon:Class = images.control_play; + + [Bindable] + public var resolutions:Array; + public var publishInClient:Boolean; + + public var camWidth:Number = 320; + public var camHeight:Number = 240; + private var _camera:Camera = null; + + // Timer used to enable the start publishing button, only after get any activity on the camera. + // It avoids the problem of publishing a blank video + private var _activationTimer:Timer = null; + private var _waitingForActivation:Boolean = false; + + static private var _cameraAccessDenied:Boolean = false; + + private var _video:Video; + private var aspectRatio:Number = 1; + + private function onCreationComplete():void { + changeDefaultCamForMac(); + + if (UsersUtil.amIPresenter() && resolutions.length > 1) { + showResControls(true); + } + + if (Camera.names.length > 1) { + showVideoControls(true); + } + + updateCamera(); + } + + private function changeDefaultCamForMac():void { + for (var i:int = 0; i < Camera.names.length; i++){ + if (Camera.names[i] == "USB Video Class Video") { + /** Set as default for Macs */ + _camera = Camera.getCamera("USB Video Class Video"); + } + } + } + + private function showVideoControls(show:Boolean):void { + if (show) { + this.visible = true; + btnStartPublish.visible = true; + } else{ + this.width = 0; + this.height = 0; + btnStartPublish.visible = false; + this.visible = false; + } + } + + private function updateCamera():void { + _camera = null; + + _camera = Camera.getCamera(); + + if (_camera == null) { + _videoHolder.showWarning('bbb.video.publish.hint.cantOpenCamera'); + return; + } + + _camera.addEventListener(ActivityEvent.ACTIVITY, onActivityEvent); + _camera.addEventListener(StatusEvent.STATUS, onStatusEvent); + + if (_camera.muted) { + if (_cameraAccessDenied) { + //onCameraAccessDisallowed(); + //return; + Security.showSettings(SecurityPanel.PRIVACY) + } else { + _videoHolder.showWarning('bbb.video.publish.hint.waitingApproval'); + } + } else { + // if the camera isn't muted, that is because the user has + // previously allowed the camera capture on the flash privacy box + onCameraAccessAllowed(); + } + + displayVideoPreview(); + } + + private function displayVideoPreview():void { + var videoOptions:VideoConfOptions = new VideoConfOptions(); + _camera.setMotionLevel(5, 1000); + _camera.setKeyFrameInterval(videoOptions.camKeyFrameInterval); + _camera.setMode(camWidth, camHeight, videoOptions.camModeFps); + _camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture); + + if (_camera.width != camWidth || _camera.height != camHeight) { + LogUtil.debug("Resolution " + camWidth + "x" + camHeight + " is not supported, using " + _camera.width + "x" + _camera.height + " instead"); + setResolution(_camera.width, _camera.height); + } + + setComboResolution(); + + if (_video != null) { + _videoHolder.remove(_video); + } + + _video = new Video(); + _video.attachCamera(_camera); + + aspectRatio = (_video.width / _video.height); + + if (aspectRatio > _videoHolder.width / _videoHolder.height) { + _video.width = _videoHolder.width; + _video.height = _videoHolder.width / aspectRatio; + _video.x = 0; + _video.y = (_videoHolder.height - _video.height) / 2; + } else { + _video.width = _videoHolder.height * aspectRatio; + _video.height = _videoHolder.height; + _video.x = (_videoHolder.width - _video.width) / 2; + _video.y = 0; + } + + _videoHolder.add(_video); + } + + private function showResControls(show:Boolean):void { + if (show) cmbResolution.visible = true; + else cmbResolution.visible = false; + } + + private function setComboResolution():void { + var res:Array = cmbResolution.selectedLabel.split( "x" ); + setResolution(Number(res[0]), Number(res[1])); + } + + private function setAspectRatio(width:int, height:int):void { + aspectRatio = (width/height); + this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL; + } + + private function setResolution(width:int, height:int):void { + camWidth = width; + camHeight = height; + setAspectRatio(camWidth, camHeight); + } + + private function startPublishing():void { + updateCamera(); + + // Save the index of the camera. Need it to send the message. + var camIndex:int = _camera.index; + + disableCamera(); + + var globalDispatcher:Dispatcher = new Dispatcher(); + var camEvent:BBBEvent = new BBBEvent(BBBEvent.CAMERA_SETTING); + camEvent.payload.cameraIndex = camIndex; + camEvent.payload.cameraWidth = camWidth; + camEvent.payload.cameraHeight = camHeight; + camEvent.payload.publishInClient = publishInClient; + + globalDispatcher.dispatchEvent(camEvent); + + PopUpManager.removePopUp(this); + } + + private function disableCamera():void { + _camera = null; + _video.attachCamera(null); + _video.clear(); + _videoHolder.remove(_video); + _video = null; + } + + private function handleKeyDown(event:KeyboardEvent):void { + if (event.charCode == Keyboard.ESCAPE) { + disableCamera(); + this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE)); + } + } + + private function onCancelClicked():void { + disableCamera(); + var event:BBBEvent = new BBBEvent(BBBEvent.CAM_SETTINGS_CLOSED); + event.payload['clicked'] = "cancel"; + dispatchEvent(event); + PopUpManager.removePopUp(this); + } + + private function onActivityEvent(e:ActivityEvent):void { + if (_waitingForActivation && e.activating) { + _activationTimer.stop(); + _videoHolder.showWarning('bbb.video.publish.hint.videoPreview', false, "0xFFFF00"); + // controls.btnStartPublish.enabled = true; + _waitingForActivation = false; + } + } + + private function onStatusEvent(e:StatusEvent):void { + if (e.code == "Camera.Unmuted") { + onCameraAccessAllowed(); + // this is just to overwrite the message of waiting for approval + _videoHolder.showWarning('bbb.video.publish.hint.openingCamera'); + } else if (e.code == "Camera.Muted") { + onCameraAccessDisallowed(); + } + } + + private function onCameraAccessAllowed():void { + _cameraAccessDenied = false; + + // set timer to ensure that the camera activates. If not, it might be in use by another application + _waitingForActivation = true; + if (_activationTimer != null) { + _activationTimer.stop(); + } + + _activationTimer = new Timer(10000, 1); + _activationTimer.addEventListener(TimerEvent.TIMER, activationTimeout); + _activationTimer.start(); + } + + private function onCameraAccessDisallowed():void { + _videoHolder.showWarning('bbb.video.publish.hint.cameraDenied'); + _cameraAccessDenied = true; + } + + private function activationTimeout(e:TimerEvent):void { + _videoHolder.showWarning('bbb.video.publish.hint.cameraIsBeingUsed'); + } + + private function showCameraSettings():void { + Security.showSettings(SecurityPanel.CAMERA); + } ]]> </mx:Script> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml index 6633fc7f1dc98a154bca75a7539b648521b26de8..79b44be9a6dc384ed26a7f344d3f553d40a2d6e4 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml @@ -192,7 +192,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function gotConfigParameters(e:ConfigEvent):void{ langSelector.visible = e.config.languageEnabled; - shortcutKeysBtn.includeInLayout = shortcutKeysBtn.visible = e.config.shortcutKeysEnabled; + shortcutKeysBtn.includeInLayout = shortcutKeysBtn.visible = e.config.shortcutKeysShowButton; DEFAULT_HELP_URL = e.config.helpURL; } 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 162b685a19c3a37b52317e537e2d690c927deddf..f426c756b523407e658e1096e79ec8c8a586a781 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml @@ -587,7 +587,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </mx:Script> <mx:HBox width="100%" height="{chatListHeight}" verticalScrollPolicy="off"> - <chat:AdvancedList width="100%" height="{chatListHeight}" id="chatMessagesList" selectable="true" variableRowHeight="true" alternatingItemColors="[#EFEFEF, #FEFEFE]" + <chat:AdvancedList width="100%" height="{chatListHeight}" id="chatMessagesList" selectable="false" variableRowHeight="true" itemRenderer="org.bigbluebutton.modules.chat.views.ChatMessageRenderer" verticalScrollPolicy="auto" wordWrap="true" dataProvider="{chatMessages.messages}" tabIndex="{baseIndex}" diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml index 1b5b9d1b7290dffa534253ff2cafa5f9fac76801..07390b77a0f4d319f24daadde6194e9b60200b14 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml @@ -21,7 +21,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" verticalAlign="top" - verticalScrollPolicy="off" xmlns:common="org.bigbluebutton.common.*" dataChange="validateNow()" + verticalScrollPolicy="off" xmlns:common="org.bigbluebutton.common.*" creationComplete="onCreationComplete()"> <mx:Script> @@ -46,12 +46,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. * do this, we'll get a stale data which will display the chat * message repeatedly. (ralam Nov 1, 2010) */ - ChangeWatcher.watch(this, "data", dataChangeHandler); - if (data != null) { - chatMsg = data as ChatMessage; - data = null; - chatMsg.translateMessage(); - } + //ChangeWatcher.watch(this, "data", dataChangeHandler); + //dataChangeHandler(); // call to intialize /** * The next line will refresh the display so that chat history don't show up as @@ -62,13 +58,42 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. validateNow(); } - private function dataChangeHandler(e:Event = null):void{ - if (data == null) { - return; - } - chatMsg = data as ChatMessage; - data = null; - chatMsg.translateMessage(); + //private function dataChangeHandler(e:Event = null):void{ + override public function set data(value:Object):void { + //if (data == null) { + // return; + //} + super.data = value; + + //chatMsg = data as ChatMessage; + //data = null; + + if (data == null) return; + + data.translateMessage(); + + /* + This is setting the backgroundColor style. It changes the value correct and the if + statement works, but the style never takes effect. I have no idea what's wrong. + Chad + */ + //LogUtil.debug ("senderId: " + data.senderId); + //LogUtil.debug("backColor " + this.getStyle("backgroundColor") + "alpha " + this.getStyle("backgroundAlpha")); + if (data.senderId == " ") { + this.setStyle("backgroundColor", 0xff0000); + } else { + this.setStyle("backgroundColor", 0x00ff00); + } + + // The visibility check has to go here becasue ORs don't work with databinding + lblTime.visible = (!(data.lastTime == data.time) || !(data.senderId == data.lastSenderId)); + // check the visibility of the name as well because events might fire in different order + lblName.visible = !(data.senderId == data.lastSenderId); + + //remove the header if not needed to save space + hbHeader.includeInLayout = hbHeader.visible = lblName.visible || lblTime.visible; + + validateNow(); } private function onRollOver():void{ @@ -82,16 +107,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. ]]> </mx:Script> - <mx:HBox width="100%"> - <mx:Label id="lblName" text="{chatMsg.name} " visible="{!(chatMsg.senderId == chatMsg.lastSenderId)}" color="gray" width="100%" textAlign="left"/> + <mx:HBox width="100%" id="hbHeader"> + <mx:Label id="lblName" text="{data.name} " visible="true" color="gray" width="100%" textAlign="left"/> <mx:Spacer width="100%"/> - <mx:Text id="lblTime" htmlText="{chatMsg.translateLocale} {rolledOver ? chatMsg.senderTime : chatMsg.time}" textAlign="right" - visible="{!(chatMsg.lastTime == chatMsg.time) || !(chatMsg.senderId == chatMsg.lastSenderId)}" + <mx:Text id="lblTime" htmlText="{data.translateLocale} {rolledOver ? data.senderTime : data.time}" textAlign="right" + visible="true" color="gray" width="100%"/> </mx:HBox> <mx:HBox width="100%"> <mx:Spacer width="5"/> - <mx:Text id="txtMessage" htmlText="{rolledOver ? chatMsg.senderText : chatMsg.translatedText}" link="onLinkClick(event)" color="{chatMsg.senderColor}" + <mx:Text id="txtMessage" htmlText="{rolledOver ? data.senderText : data.translatedText}" link="onLinkClick(event)" color="{data.senderColor}" rollOver="onRollOver()" rollOut="onRollOut()" width="100%" selectable="true"/> </mx:HBox> </mx:VBox>