diff --git a/src/Main-app.xml b/src/Main-app.xml index 421acad..3ee0dff 100644 --- a/src/Main-app.xml +++ b/src/Main-app.xml @@ -15,7 +15,7 @@ - org.bigbluebutton.bbb-air-client + BigBlueButtonMobile BigBlueButton diff --git a/src/org/bigbluebutton/AppConfig.as b/src/org/bigbluebutton/AppConfig.as index 8fcf638..c5347ef 100644 --- a/src/org/bigbluebutton/AppConfig.as +++ b/src/org/bigbluebutton/AppConfig.as @@ -8,6 +8,8 @@ package org.bigbluebutton import org.bigbluebutton.command.DisconnectUserSignal; import org.bigbluebutton.command.LoadSlideCommand; import org.bigbluebutton.command.LoadSlideSignal; + import org.bigbluebutton.command.ReconnectIOSVideoCommand; + import org.bigbluebutton.command.ReconnectIOSVideoSignal; import org.bigbluebutton.command.ShareCameraCommand; import org.bigbluebutton.command.ShareCameraSignal; import org.bigbluebutton.command.ShareMicrophoneCommand; @@ -21,13 +23,13 @@ package org.bigbluebutton import org.bigbluebutton.core.IChatMessageService; import org.bigbluebutton.core.IDeskshareConnection; import org.bigbluebutton.core.ILoginService; - import org.bigbluebutton.core.IUsersService; - import org.bigbluebutton.core.UsersService; import org.bigbluebutton.core.IPresentationService; - import org.bigbluebutton.core.IVoiceConnection; + import org.bigbluebutton.core.IUsersService; import org.bigbluebutton.core.IVideoConnection; + import org.bigbluebutton.core.IVoiceConnection; import org.bigbluebutton.core.LoginService; import org.bigbluebutton.core.PresentationService; + import org.bigbluebutton.core.UsersService; import org.bigbluebutton.core.VideoConnection; import org.bigbluebutton.core.VoiceConnection; import org.bigbluebutton.model.ConferenceParameters; @@ -38,8 +40,6 @@ package org.bigbluebutton import org.bigbluebutton.model.UserUISession; import org.bigbluebutton.model.chat.ChatMessagesSession; import org.bigbluebutton.model.chat.IChatMessagesSession; - - import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap; import robotlegs.bender.framework.api.IConfig; @@ -79,6 +79,7 @@ package org.bigbluebutton signalCommandMap.map(LoadSlideSignal).toCommand(LoadSlideCommand); signalCommandMap.map(CameraQualitySignal).toCommand(CameraQualityCommand); signalCommandMap.map(DisconnectUserSignal).toCommand(DisconnectUserCommand); + signalCommandMap.map(ReconnectIOSVideoSignal).toCommand(ReconnectIOSVideoCommand); } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/command/ConnectCommand.as b/src/org/bigbluebutton/command/ConnectCommand.as index a446b32..46f7706 100644 --- a/src/org/bigbluebutton/command/ConnectCommand.as +++ b/src/org/bigbluebutton/command/ConnectCommand.as @@ -90,14 +90,22 @@ package org.bigbluebutton.command presentationService.setupMessageSenderReceiver(); // set up and connect the remaining connections - videoConnection.uri = userSession.config.getConfigFor("VideoConfModule").@uri + "/" + conferenceParameters.room; + videoConnection.uri = userSession.config.getConfigFor("VideoConfModule").@uri; + videoConnection.iosUri = userSession.config.getConfigFor("VideoConfModule").@iosUri; //TODO see if videoConnection.successConnected is dispatched when it's connected properly videoConnection.successConnected.add(successVideoConnected); videoConnection.unsuccessConnected.add(unsuccessVideoConnected); + videoConnection.successIOSConnected.add(successIOSVideoConnected); + videoConnection.unsuccessIOSConnected.add(unsuccessIOSVideoConnected); videoConnection.connect(); + if (userSession.clientIsIOS) + { + videoConnection.connectIOS(); + } + userSession.videoConnection = videoConnection; voiceConnection.uri = userSession.config.getConfigFor("PhoneModule").@uri; @@ -108,13 +116,13 @@ package org.bigbluebutton.command deskshareConnection.connect(); userSession.deskshareConnection = deskshareConnection; - + // Query the server for chat, users, and presentation info chatService.sendWelcomeMessage(); chatService.getPublicChatMessages(); presentationService.getPresentationInfo(); - + userSession.userList.allUsersAddedSignal.add(successUsersAdded); usersService.queryForParticipants(); usersService.queryForRecordingStatus(); @@ -162,5 +170,19 @@ package org.bigbluebutton.command videoConnection.unsuccessConnected.remove(unsuccessVideoConnected); videoConnection.successConnected.remove(successVideoConnected); } + + private function successIOSVideoConnected():void { + Log.getLogger("org.bigbluebutton").info(String(this) + ":successIOSVideoConnected()"); + + videoConnection.successConnected.remove(successIOSVideoConnected); + videoConnection.unsuccessConnected.remove(unsuccessIOSVideoConnected); + } + + private function unsuccessIOSVideoConnected(reason:String):void { + Log.getLogger("org.bigbluebutton").info(String(this) + ":unsuccessIOSVideoConnected()"); + + videoConnection.unsuccessConnected.remove(unsuccessIOSVideoConnected); + videoConnection.successConnected.remove(successIOSVideoConnected); + } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/command/DisconnectUserCommand.as b/src/org/bigbluebutton/command/DisconnectUserCommand.as index f006da2..83c8181 100644 --- a/src/org/bigbluebutton/command/DisconnectUserCommand.as +++ b/src/org/bigbluebutton/command/DisconnectUserCommand.as @@ -28,6 +28,11 @@ package org.bigbluebutton.command userSession.mainConnection.connection.close(); userSession.videoConnection.connection.close(); userSession.voiceConnection.connection.close(); + + if(userSession.videoConnection.iosConnection) + { + userSession.videoConnection.iosConnection.close(); + } } } } \ No newline at end of file diff --git a/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as b/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as new file mode 100644 index 0000000..fad0d1a --- /dev/null +++ b/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as @@ -0,0 +1,17 @@ +package org.bigbluebutton.command +{ + import org.bigbluebutton.model.IUserSession; + + import robotlegs.bender.bundles.mvcs.Command; + + public class ReconnectIOSVideoCommand extends Command + { + [Inject] + public var userSession:IUserSession; + + public override function execute():void + { + userSession.videoConnection.connectIOS(); + } + } +} \ No newline at end of file diff --git a/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as b/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as new file mode 100644 index 0000000..618a39e --- /dev/null +++ b/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as @@ -0,0 +1,12 @@ +package org.bigbluebutton.command +{ + import org.osflash.signals.Signal; + + public class ReconnectIOSVideoSignal extends Signal + { + public function ReconnectIOSVideoSignal() + { + super(); + } + } +} \ No newline at end of file diff --git a/src/org/bigbluebutton/command/ShareCameraCommand.as b/src/org/bigbluebutton/command/ShareCameraCommand.as index a86feea..bf4705a 100644 --- a/src/org/bigbluebutton/command/ShareCameraCommand.as +++ b/src/org/bigbluebutton/command/ShareCameraCommand.as @@ -31,6 +31,9 @@ package org.bigbluebutton.command [Inject] public var usersService: IUsersService; + [Inject] + public var conferenceParameters:IConferenceParameters; + override public function execute():void { if (enabled) { userSession.videoConnection.cameraPosition = position; @@ -40,12 +43,12 @@ package org.bigbluebutton.command } } - private function buildStreamName(camWidth:int, camHeight:int, userId:String):String { + private function buildStreamName(camWidth:int, camHeight:int, userId:String, roomId:String):String { var d:Date = new Date(); var curTime:Number = d.getTime(); var uid:String = userSession.userId; var res:String = camWidth + "x" + camHeight; - return res.concat("-" + uid) + "-" + curTime; + return res.concat("-" + uid) + "-" + roomId + "-" + curTime; } private function setupCamera(position:String):Camera @@ -107,7 +110,7 @@ package org.bigbluebutton.command if(userSession.videoConnection.camera) { - var streamName:String = buildStreamName(userSession.videoConnection.camera.width, userSession.videoConnection.camera.height, userId); + var streamName:String = buildStreamName(userSession.videoConnection.camera.width, userSession.videoConnection.camera.height, userId, conferenceParameters.room); usersService.addStream(userId, streamName); userSession.videoConnection.startPublishing(userSession.videoConnection.camera, streamName); diff --git a/src/org/bigbluebutton/core/BaseConnection.as b/src/org/bigbluebutton/core/BaseConnection.as index 524afdf..10eea20 100644 --- a/src/org/bigbluebutton/core/BaseConnection.as +++ b/src/org/bigbluebutton/core/BaseConnection.as @@ -20,7 +20,7 @@ package org.bigbluebutton.core { [Inject] public var disconnectUserSignal:DisconnectUserSignal; - + public static const NAME:String = "BaseConnection"; protected var _successConnected:ISignal = new Signal(); @@ -29,7 +29,7 @@ package org.bigbluebutton.core protected var _netConnection:NetConnection; protected var _uri:String; protected var _onUserCommand:Boolean; - + public function BaseConnection() { Log.getLogger("org.bigbluebutton").info(String(this)); } @@ -48,19 +48,19 @@ package org.bigbluebutton.core { return _unsuccessConnected; } - + public function get successConnected():ISignal { return _successConnected; } - + public function get connection():NetConnection { return _netConnection; } public function connect(uri:String, ...parameters):void { _uri = uri; - + // The connect call needs to be done properly. At the moment lock settings // are not implemented in the mobile client, so parameters[7] and parameters[8] // are "faked" in order to connect (without them, I couldn't get the connect @@ -110,7 +110,10 @@ package org.bigbluebutton.core case "NetConnection.Connect.Closed": trace(NAME + ": Connection closed. Uri: " + _uri); - sendConnectionFailedEvent(ConnectionFailedEvent.CONNECTION_CLOSED); + if (!_uri.indexOf("iosvideo") == -1) + { + sendConnectionFailedEvent(ConnectionFailedEvent.CONNECTION_CLOSED); + } break; case "NetConnection.Connect.InvalidApp": @@ -138,7 +141,7 @@ package org.bigbluebutton.core break; } } - + protected function sendConnectionSuccessEvent():void { successConnected.dispatch(); diff --git a/src/org/bigbluebutton/core/IVideoConnection.as b/src/org/bigbluebutton/core/IVideoConnection.as index 053a6ec..4211852 100644 --- a/src/org/bigbluebutton/core/IVideoConnection.as +++ b/src/org/bigbluebutton/core/IVideoConnection.as @@ -9,16 +9,27 @@ package org.bigbluebutton.core { function get unsuccessConnected():ISignal function get successConnected():ISignal + function get unsuccessIOSConnected():ISignal + function get successIOSConnected():ISignal + function get successIOSVideoReconnected():ISignal function set uri(uri:String):void function get uri():String + function set iosUri(uri:String):void + function get iosUri():String function get connection():NetConnection + function get iosConnection():NetConnection + function get iosBaseConnection():IBaseConnection function get cameraPosition():String; function set cameraPosition(position:String):void function get camera():Camera; function set camera(value:Camera):void function get selectedCameraQuality():int; function set selectedCameraQuality(value:int):void + function get streamViewCounter():int + function increaseStreamViewCounter():void + function resetStreamViewCounter():void function connect():void + function connectIOS():void function startPublishing(camera:Camera, streamName:String):void function stopPublishing():void function selectCameraQuality(value:int):void diff --git a/src/org/bigbluebutton/core/VideoConnection.as b/src/org/bigbluebutton/core/VideoConnection.as index d060863..6cf2439 100644 --- a/src/org/bigbluebutton/core/VideoConnection.as +++ b/src/org/bigbluebutton/core/VideoConnection.as @@ -10,31 +10,53 @@ package org.bigbluebutton.core import mx.utils.ObjectUtil; + import org.bigbluebutton.command.ReconnectIOSVideoSignal; + import org.bigbluebutton.model.IUserSession; import org.osflash.signals.ISignal; import org.osflash.signals.Signal; import org.osmf.logging.Log; + import robotlegs.bender.framework.api.IInjector; + public class VideoConnection extends DefaultConnectionCallback implements IVideoConnection { [Inject] public var baseConnection:IBaseConnection; + [Inject] + public var injector:IInjector; + + [Inject] + public var userSession:IUserSession; + + [Inject] + public var reconnectIOSVideoSignal:ReconnectIOSVideoSignal; + + private var _iosBaseConnection:IBaseConnection; private var _ns:NetStream; private var _cameraPosition:String; protected var _successConnected:ISignal = new Signal(); protected var _unsuccessConnected:ISignal = new Signal(); + protected var _successIOSConnected:ISignal = new Signal(); + protected var _unsuccessIOSConnected:ISignal = new Signal(); + protected var _successIOSReconnected:ISignal = new Signal(); protected var _applicationURI:String; + protected var _iosApplicationURI:String; private var _camera:Camera; private var _selectedCameraQuality:int; + private var _streamViewCounter:int; public static var CAMERA_QUALITY_LOW:int = 0; public static var CAMERA_QUALITY_MEDIUM:int = 1; public static var CAMERA_QUALITY_HIGH:int = 2; - + public static var MAX_STREAM_VIEWS:int = 4; + + public static const IOS_NAME:String = "IOSVideoConnection"; + public function VideoConnection() { Log.getLogger("org.bigbluebutton").info(String(this)); @@ -48,6 +70,24 @@ package org.bigbluebutton.core baseConnection.unsuccessConnected.add(onConnectionUnsuccess); } + public function initIOSConnection():void + { + _iosBaseConnection.init(this); + _iosBaseConnection.successConnected.add(onIOSConnectionSuccess); + _iosBaseConnection.unsuccessConnected.add(onIOSConnectionUnsuccess); + _iosBaseConnection.connection.addEventListener(NetStatusEvent.NET_STATUS, netStatus); + } + + private function onIOSConnectionUnsuccess(reason:String):void + { + unsuccessIOSConnected.dispatch(reason); + } + + private function onIOSConnectionSuccess():void + { + successIOSConnected.dispatch(); + } + private function onConnectionUnsuccess(reason:String):void { unsuccessConnected.dispatch(reason); @@ -69,6 +109,15 @@ package org.bigbluebutton.core return _successConnected; } + public function get unsuccessIOSConnected():ISignal + { + return _unsuccessIOSConnected; + } + public function get successIOSConnected():ISignal + { + return _successIOSConnected; + } + public function set uri(uri:String):void { _applicationURI = uri; } @@ -77,14 +126,66 @@ package org.bigbluebutton.core return _applicationURI; } + public function set iosUri(uri:String):void { + _iosApplicationURI = uri; + } + + public function get iosUri():String { + return _iosApplicationURI; + } + public function get connection():NetConnection { return baseConnection.connection; } + public function get iosConnection():NetConnection + { + return _iosBaseConnection.connection; + } + + public function get iosBaseConnection():IBaseConnection + { + return _iosBaseConnection; + } + public function connect():void { baseConnection.connect(uri); } + public function connectIOS():void + { + _iosBaseConnection = injector.getInstance(IBaseConnection); + initIOSConnection(); + _iosBaseConnection.connect(iosUri); + } + + protected function netStatus(event:NetStatusEvent):void + { + var info : Object = event.info; + var statusCode : String = info.code; + + switch (statusCode) { + case "NetConnection.Connect.Success": + trace(IOS_NAME + ": Connection succeeded. Uri: " + uri); + sendIOSVideoReconnectionSuccessEvent(); + break; + case "NetConnection.Connect.Closed": + trace(IOS_NAME + ": Connection closed. Uri: " + uri); + reconnectIOSVideoSignal.dispatch(); + break; + } + } + + protected function sendIOSVideoReconnectionSuccessEvent():void + { + successIOSVideoReconnected.dispatch(); + } + + public function get successIOSVideoReconnected():ISignal + { + return _successIOSReconnected; + } + public function get cameraPosition():String { return _cameraPosition; @@ -115,6 +216,21 @@ package org.bigbluebutton.core _selectedCameraQuality = value; } + public function get streamViewCounter():int + { + return _streamViewCounter; + } + + public function increaseStreamViewCounter():void + { + _streamViewCounter++; + } + + public function resetStreamViewCounter():void + { + _streamViewCounter = 0; + } + /** * Set video quality based on the user selection **/ diff --git a/src/org/bigbluebutton/model/IUserSession.as b/src/org/bigbluebutton/model/IUserSession.as index 75fdba7..40c3d3e 100644 --- a/src/org/bigbluebutton/model/IUserSession.as +++ b/src/org/bigbluebutton/model/IUserSession.as @@ -22,6 +22,7 @@ package org.bigbluebutton.model function set config(value:Config):void; function get userId():String; function set userId(value:String):void; + function get clientIsIOS():Boolean; function get userList():UserList; function get voiceConnection():IVoiceConnection; function set voiceConnection(value:IVoiceConnection):void; diff --git a/src/org/bigbluebutton/model/UserSession.as b/src/org/bigbluebutton/model/UserSession.as index 322a5fa..ab962a8 100644 --- a/src/org/bigbluebutton/model/UserSession.as +++ b/src/org/bigbluebutton/model/UserSession.as @@ -1,6 +1,7 @@ package org.bigbluebutton.model { import flash.net.NetConnection; + import flash.system.Capabilities; import mx.collections.ArrayList; @@ -28,6 +29,7 @@ package org.bigbluebutton.model protected var _userList:UserList; protected var _presentationList:PresentationList; protected var _recording:Boolean; + protected var _clientIsIOS:Boolean; protected var _guestSignal:ISignal = new Signal(); protected var _successJoiningMeetingSignal:ISignal = new Signal(); @@ -110,11 +112,17 @@ package org.bigbluebutton.model { _deskshareConnection = value; } + + public function get clientIsIOS():Boolean + { + return _clientIsIOS; + } public function UserSession() { _userList = new UserList(); _presentationList = new PresentationList(); + _clientIsIOS = (Capabilities.manufacturer.indexOf("iOS") != -1); } public function get presentationList():PresentationList diff --git a/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as b/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as index 9ec160d..00cbaa3 100644 --- a/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as +++ b/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as @@ -43,10 +43,15 @@ package org.bigbluebutton.view.navigation.pages.common this.streamName = streamName; this.connection = connection; + initNetStream(connection); + } + + public function initNetStream(connection:NetConnection):void + { ns = new NetStream(connection); ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError); - ns.client = this; + ns.client = {}; ns.bufferTime = 0; ns.receiveVideo(true); ns.receiveAudio(false); @@ -108,7 +113,7 @@ package org.bigbluebutton.view.navigation.pages.common { video.height = screenWidth; video.width = ((originalVideoWidth * video.height)/originalVideoHeight); - + if (screenWidth < video.width) { video.width = screenHeight; @@ -164,7 +169,7 @@ package org.bigbluebutton.view.navigation.pages.common this.stage.addChild(video); } - private function onNetStatus(e:NetStatusEvent):void{ + protected function onNetStatus(e:NetStatusEvent):void{ switch(e.info.code){ case "NetStream.Publish.Start": trace("NetStream.Publish.Start for broadcast stream " + streamName); @@ -184,7 +189,7 @@ package org.bigbluebutton.view.navigation.pages.common } } - private function onAsyncError(e:AsyncErrorEvent):void{ + protected function onAsyncError(e:AsyncErrorEvent):void{ trace("VideoWindow::asyncerror " + e.toString()); } diff --git a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as index b6c0fea..ab38a07 100644 --- a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as +++ b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as @@ -1,19 +1,17 @@ package org.bigbluebutton.view.navigation.pages.videochat { - import flash.display.DisplayObject; - import mx.collections.ArrayCollection; import mx.core.FlexGlobals; import mx.resources.ResourceManager; import mx.utils.ObjectUtil; + import org.bigbluebutton.command.ReconnectIOSVideoSignal; + import org.bigbluebutton.core.VideoConnection; import org.bigbluebutton.model.IUserSession; import org.bigbluebutton.model.IUserUISession; import org.bigbluebutton.model.User; import org.bigbluebutton.model.UserList; - import org.bigbluebutton.model.UserSession; import org.bigbluebutton.view.navigation.pages.PagesENUM; - import org.mockito.integrations.currentMockito; import org.osmf.logging.Log; import robotlegs.bender.bundles.mvcs.Mediator; @@ -31,8 +29,13 @@ package org.bigbluebutton.view.navigation.pages.videochat [Inject] public var userUISession: IUserUISession; + [Inject] + public var reconnectIOSVideoSignal:ReconnectIOSVideoSignal; + protected var dataProvider:ArrayCollection; + private var currentUser:User; + override public function initialize():void { Log.getLogger("org.bigbluebutton").info(String(this)); @@ -43,6 +46,8 @@ package org.bigbluebutton.view.navigation.pages.videochat userUISession.pageTransitionStartSignal.add(onPageTransitionStart); view.streamlist.addEventListener(IndexChangeEvent.CHANGE, onSelectStream); + userSession.videoConnection.successIOSVideoReconnected.add(onVideoReconnected); + checkVideo(); FlexGlobals.topLevelApplication.pageName.text = ResourceManager.getInstance().getString('resources', 'video.title'); dataProvider = new ArrayCollection(); @@ -96,14 +101,16 @@ package org.bigbluebutton.view.navigation.pages.videochat { if (event.newIndex >= 0) { - var user:User = dataProvider.getItemAt(event.newIndex) as User; - if(user.hasStream) + currentUser = dataProvider.getItemAt(event.newIndex) as User; + + if(currentUser.hasStream) { if(view && view.getDisplayedUserID() != null) { stopStream(view.getDisplayedUserID()); } - startStream(user.name, user.streamName); + + startStream(currentUser.name, currentUser.streamName); } } } @@ -116,6 +123,8 @@ package org.bigbluebutton.view.navigation.pages.videochat userUISession.pageTransitionStartSignal.remove(onPageTransitionStart); + userSession.videoConnection.successIOSVideoReconnected.remove(onVideoReconnected); + view.dispose(); view = null; @@ -202,7 +211,30 @@ package org.bigbluebutton.view.navigation.pages.videochat var length:Number = Number(String(resolution.dimensions[1])); if (view) { - view.startStream(userSession.videoConnection.connection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width); + // iOS client uses nginx-rtmp module to view transcoded video stream. + // Everytime after client viewed 4 streams - NetConnection.Connect.Closed will be raised in VideoConnection and + // we need to restart NetConnection in order to play the stream. However magic number 4 will raise NetConnection.Connect.Closed only + // in non-ios devies and in ios devices NetConnection will stop functionality and keep silence, so we need to manully count the number + // of streams viewed on ios and restart the NetConnection after the fourth time. + if (userSession.clientIsIOS) + { + userSession.videoConnection.increaseStreamViewCounter(); + + if (userSession.videoConnection.streamViewCounter > VideoConnection.MAX_STREAM_VIEWS) + { + userSession.videoConnection.resetStreamViewCounter(); + trace("Maximum number of 4 stream views on ios device reached, restarting the ios NetConnection."); + reconnectIOSVideoSignal.dispatch(); + } + else + { + view.startStream(userSession.videoConnection.iosConnection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width); + } + } + else + { + view.startStream(userSession.videoConnection.connection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width); + } } } } @@ -230,7 +262,7 @@ package org.bigbluebutton.view.navigation.pages.videochat var userWithCamera:User = getUserWithCamera(); var newUser:User; - + if (changedUser) { // Priority state machine @@ -238,28 +270,33 @@ package org.bigbluebutton.view.navigation.pages.videochat if (selectedUser && selectedUser.hasStream && changedUser.userID == selectedUser.userID) { if (view) view.stopStream(); + currentUser = changedUser; startStream(changedUser.name, changedUser.streamName); } else if (changedUser.presenter && changedUser.hasStream) { if (view) view.stopStream(); + currentUser = changedUser; startStream(changedUser.name, changedUser.streamName); } else if (currentUserID && changedUser.userID == currentUserID) { if (view) view.stopStream(); + currentUser = changedUser; startStream(changedUser.name, changedUser.streamName); } else if (userWithCamera) { if (userWithCamera.userID == changedUser.userID) { - if (view) view.stopStream(); + if (view) view.stopStream(); + currentUser = changedUser; startStream(changedUser.name, changedUser.streamName); } else if (!changedUser.hasStream && userWithCamera.me) { - if (view) view.stopStream(); + if (view) view.stopStream(); + currentUser = userWithCamera; startStream(userWithCamera.name, userWithCamera.streamName); } } @@ -296,19 +333,28 @@ package org.bigbluebutton.view.navigation.pages.videochat { return; } - + if (newUser) { if (view) view.stopStream(); + currentUser = newUser; startStream(newUser.name, newUser.streamName); view.noVideoMessage.visible = false; } } } + private function onVideoReconnected():void + { + if (view && currentUser) + { + startStream(currentUser.name, currentUser.streamName); + } + } + protected function getVideoResolution(stream:String):Object { - var pattern:RegExp = new RegExp("(\\d+x\\d+)-([A-Za-z0-9]+)-\\d+", ""); + var pattern:RegExp = new RegExp("(\\d+x\\d+)-([A-Za-z0-9]+)-([a-z0-9]+-\\d+)-\\d+", ""); if (pattern.test(stream)) { trace("The stream name is well formatted [" + stream + "]");