You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/12/14 09:57:18 UTC

svn commit: r1774157 - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ branches/3.2.x/openmeeting...

Author: solomax
Date: Wed Dec 14 09:57:18 2016
New Revision: 1774157

URL: http://svn.apache.org/viewvc?rev=1774157&view=rev
Log:
[OPENMEETINGS-1454] interview room seems to work

Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainAttributes.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewVideoBox.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewWhiteboard.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/baseVideoObject.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java Wed Dec 14 09:57:18 2016
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.nextBroadCastId;
 import static org.apache.openmeetings.util.LocaleHelper.getCountryName;
 
 import java.util.ArrayList;
@@ -303,7 +304,7 @@ public class MobileService {
 		User u = userDao.get(userId);
 		Client c = scopeAdapter.setUsernameReconnect(SID, userId, u.getLogin(), u.getFirstname(), u.getLastname(), u.getPictureuri());
 		 //TODO check if we need anything here
-		long broadcastId = scopeAdapter.getBroadCastId();
+		long broadcastId = nextBroadCastId();
 		c.setSipTransport(true);
 		c.setRoomId(Long.parseLong(c.getScope()));
 		c.setRoomEnter(new Date());
@@ -333,7 +334,7 @@ public class MobileService {
 		hsm.put("message", new String[]{"avsettings", "0", avMode});
 		Map<String, Object> result = new Hashtable<String, Object>();
 		if (!"n".equals(avMode)) {
-			result.put("broadcastId", scopeAdapter.getBroadCastId());
+			result.put("broadcastId", nextBroadCastId());
 		}
 
 		scopeAdapter.sendMessageToCurrentScope("sendVarsToMessageWithClient", hsm, true, false);

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Wed Dec 14 09:57:18 2016
@@ -990,27 +990,6 @@ public class ScopeApplicationAdapter ext
 	}
 
 	/**
-	 * there will be set an attribute called "broadCastCounter" this is the name
-	 * this user will publish his stream
-	 * 
-	 * @return long broadCastId
-	 */
-	public long getBroadCastId() {
-		try {
-			log.debug("-----------  getBroadCastId");
-			IConnection current = Red5.getConnectionLocal();
-			String streamid = current.getClient().getId();
-			Client client = sessionManager.getClientByStreamId(streamid, null);
-			client.setBroadCastID(nextBroadCastId());
-			sessionManager.updateClientByStreamId(streamid, client, false, null);
-			return client.getBroadCastID();
-		} catch (Exception err) {
-			log.error("[getBroadCastId]", err);
-		}
-		return -1;
-	}
-
-	/**
 	 * this must be set _after_ the Video/Audio-Settings have been chosen (see
 	 * editrecordstream.lzx) but _before_ anything else happens, it cannot be
 	 * applied _after_ the stream has started! 
@@ -1025,32 +1004,29 @@ public class ScopeApplicationAdapter ext
 	 * @param vWidth
 	 * @param vHeight
 	 * 
-	 * @return RoomClient being updated in case of no errors, null otherwise
+	 * @return BroadcastId in case of no errors, -1 otherwise
 	 */
-	public Client setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight) {
+	public long setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight, boolean updateBroadcastId) {
 		try {
 			String streamid = Red5.getConnectionLocal().getClient().getId();
-			log.debug("-----------  setUserAVSettings {} {} {}", new Object[] {streamid, avsettings});
+			log.debug("-----------  setUserAVSettings {} {}", streamid, avsettings);
 			Client currentClient = sessionManager.getClientByStreamId(streamid, null);
 			if (currentClient == null) {
 				log.warn("Failed to find appropriate clients");
-				return null;
+				return -1;
 			}
 			currentClient.setAvsettings(avsettings);
 			currentClient.setVWidth(vWidth);
 			currentClient.setVHeight(vHeight);
+			if (updateBroadcastId) {
+				currentClient.setBroadCastID(nextBroadCastId());
+			}
 			sessionManager.updateAVClientByStreamId(streamid, currentClient, null);
-
-			HashMap<String, Object> hsm = new HashMap<>();
-			hsm.put("client", currentClient);
-			hsm.put("message", new Object[]{"avsettings", 0, avsettings});
-
-			sendMessageToCurrentScope("sendVarsToMessageWithClient", hsm, true);
-			return currentClient;
+			return currentClient.getBroadCastID();
 		} catch (Exception err) {
 			log.error("[setUserAVSettings]", err);
 		}
-		return null;
+		return -1;
 	}
 
 	/*

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx Wed Dec 14 09:57:18 2016
@@ -504,7 +504,6 @@
 							, value.roomId, '', value.formatedDate, value.userpos, value.usercolor, value);
 				}
 			}
-			canvas.setAttribute('numberofpartners',canvas.numberofpartners+1);
 		</method>	
 		
 		<netRemoteCallHib name="getCurrentModeratorList" funcname="getCurrentModeratorList">
@@ -550,25 +549,22 @@
 			}
 			canvas.commonVideoViewContent.startStream(value);
 		</method> 
-		   
+
 		<method name="closeStream" args="value">
 			//The onResult-Handler will be called be the rtmpconnection
-			if ($debug) Debug.write("**** closeStream: ",value);
+			if ($debug) Debug.write("**** closeStream: ", value);
 			if (value == null) {
 				return;
 			}
 			if (value.screenClient) {
-				if ($debug) Debug.write(" ondata closeStream: ",value.streamPublishName);
+				if ($debug) Debug.write(" ondata closeStream: ", value.streamPublishName);
 				canvas.commonVideoViewContent.closeScreenSharing(value);
 			} else {
 				//free the VideoContainer
-				//canvas._videocontainer.closeStreamClient(value.publicSID);
-				canvas.commonVideoViewContent.closeStreamClient(value.publicSID);
-				canvas.setAttribute('numberofpartners',canvas.numberofpartners-1);
+				canvas.commonVideoViewContent.closeStreamclient(value.publicSID);
 			}
-			//TODO:check first current tab
 		</method>
-		
+
 		<!---
 			Event is invoked if a red5 stream sharing is closed
 		 -->
@@ -585,10 +581,10 @@
 			</handler>
 		</netRemoteCallHib>
 
-		<method name="roomDisconnectUser" args="value,id">
-			canvas._videocontainer.disconnectclient(id);
+		<method name="roomDisconnectUser" args="value, id">
+			if ($debug) Debug.write("**** roomDisconnectUser ", id, value);
 			if (canvas.commonVideoViewContent != null) {
-				canvas.commonVideoViewContent.disconnectclient(id);
+				canvas.commonVideoViewContent.removeVideoByUser(id);
 				if (canvas.currentModApply != null) canvas.currentModApply.rejectUser(value);
 				if (value.isRecording) {
 					canvas._mymod.recordingUser = null;
@@ -596,10 +592,12 @@
 				if (value.streamPublishStarted) {
 					canvas._mymod.publishingObj = null;
 				}
-				canvas._mymod.setMessage();
+				if (!!canvas._mymod) {
+					canvas._mymod.setMessage();
+				}
 			}
 		</method>
-		
+
 		<method name="roomDisconnect" args="value">
 		<![CDATA[
 			//The onResult-Handler will be called be the rtmpconnection
@@ -851,7 +849,7 @@
 				canvas.setAttribute("canVideo", client.canVideo);
 				
 				if (client.isBroadcasting) {
-					canvas.commonVideoViewContent.startAvBroadcast();
+					canvas.commonVideoViewContent._startAvBroadcast();
 					canvas.setAttribute("lastBroadCastingUser", client);
 				} else {
 					canvas.commonVideoViewContent.removeVideoByUser(canvas.publicSID);

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainAttributes.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainAttributes.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainAttributes.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainAttributes.lzx Wed Dec 14 09:57:18 2016
@@ -175,10 +175,6 @@ the LAST RoomClient Object that has been
 <attribute name="ismoderator" value="false" type="boolean" />
 <attribute name="isInterview" value="false" type="boolean" />
 <!-- Those values are fixed values of the video positions of the videos from the interview room type -->
-<attribute name="interviewPod1_x" value="320" type="number" />
-<attribute name="interviewPod1_y" value="28" type="number" />
-<attribute name="interviewPod2_x" value="644" type="number" />
-<attribute name="interviewPod2_y" value="28" type="number" />
 
 <attribute name="loadingmessage" value="" type="string" />
 <!--- 
@@ -202,9 +198,6 @@ the LAST RoomClient Object that has been
  -->
 <attribute name="numberofallowedpartners" value="0" type="number" />
 
-<!--- Number of currently connected Users -->
-<attribute name="numberofpartners" value="0" type="number" />
-
 <!--- unique ID of this Stream -->
 <attribute name="streamid" value="0" type="string" />
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx Wed Dec 14 09:57:18 2016
@@ -53,16 +53,16 @@
 			});
 	</method>
 
-	<method name="batchCreateVideo" args="selfStreamId, clients">
+	<method name="batchCreateVideo" args="clients">
 	<![CDATA[
-		if ($debug) Debug.info("batchCreateVideo: ", selfStreamId, clients.length);
+		if ($debug) Debug.info("batchCreateVideo: ", clients.length);
 		for (var i = 0; i < clients.length; ++i) {
 			var c = clients[i];
-			if (c.streamid != selfStreamId) {
+			if (c.streamid != canvas.streamid) {
 				if (c.isBroadcasting) {
-					createVideo(c.publicSID, c.firstname + ' ' + c.lastname, c.broadCastID, c.avsettings, -1, c);
+					createVideo(c);
 				} else {
-					createVideoObject(c.publicSID, false, -1, c);
+					createVideoObject(c.publicSID, false, c.interviewPodId, c);
 				}
 			}
 		}
@@ -75,27 +75,37 @@
 		The method to "play" the stream is invoked later, when the user
 		really starts to stream and not only when he just enters the room.
 	 -->
-	<method name="createVideoObject" args="publicSID,isBroadcasting,interviewPodId,object">
+	<method name="createVideoObject" args="publicSID, isBroadcasting, interviewPodId, object">
 		if($debug) Debug.info("createVideoObject, publicSID: ",publicSID, "isBroadcasting: ", isBroadcasting, "object", object);
 		var vidContainer = getVideoObjectByPublicSID(publicSID);
 		if(vidContainer == null) {
 			vidContainer = isBroadcasting ? this.getNewVideoObject(publicSID) : this.getNewVideoObjectByPos(publicSID);
 			vidContainer.publicSID = publicSID;
 		}
-		if ($debug) Debug.write("Is interview ? ",canvas.isInterview);
-		if (canvas.isInterview) {
-			if ($debug) Debug.write("Is interview ",interviewPodId,"x",canvas["interviewPod"+interviewPodId+"_x"]);
+		if ($debug) Debug.write("Is interview ? ", canvas.isInterview);
+		placeInterviewPod(vidContainer, interviewPodId);
+		vidContainer.clientVars = object;
+		vidContainer.setAttribute('visible', false);
+		return vidContainer;
+	</method>
+
+	<method name="placeInterviewPod" args="vidContainer, interviewPodId">
+	<![CDATA[
+		if ($debug) Debug.write("placeInterviewPod::Is interview ", canvas.isInterview, interviewPodId);
+		if (canvas.isInterview && interviewPodId != null && interviewPodId > 0) {
 			if (interviewPodId != null) {
 				vidContainer.setAttribute("interviewPodId", interviewPodId);
-				vidContainer.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
-				vidContainer.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
+				var cont = canvas._drawarea._videoviewcontent;
+				var box = cont['interviewVideoBox' + interviewPodId];
+				if (!!box) {
+					vidContainer.setAttribute("x", cont.x + box.x);
+					vidContainer.setAttribute("y", box.y);
+				}
 			}
-			vidContainer.setAttribute("width",322);
-			vidContainer.setAttribute("height",281);
+			vidContainer.setAttribute("width", 322);
+			vidContainer.setAttribute("height", 281);
 		}
-		vidContainer.clientVars = object;
-		vidContainer.setAttribute('visible', false);
-		return vidContainer;
+	]]>
 	</method>
 
 	<method name="setPartnerName" args="obj, first, last=null">
@@ -111,49 +121,44 @@
 		Method that creates the video views when user(self) initially entering a room.
 		Creates the video-view AND starts to stream/play the video
 	 -->
-	<method name="createVideo" args="publicSID,displayName,broadcastId,avsettings,interviewPodId,object">
+	<method name="createVideo" args="cl">
 	<![CDATA[
-		if ($debug) Debug.info("createVideo, publicSID: ",publicSID,"broadcastId: ",broadcastId,"AVsettings: ",avsettings);
-		if ($debug) Debug.write(" createVideo ALL vars ",object);
-		var vidContainer = getVideoObjectByPublicSID(publicSID);
-		if(vidContainer == null) {
-			vidContainer = this.getNewVideoObjectByPos(publicSID);
-			vidContainer.clientVars = object;
-			setPartnerName(vidContainer, displayName);
-			if (avsettings=="n"){
-				vidContainer.setVideouserProfilePic(object);
-				vidContainer.setAttribute("visibility","hidden");
-			} else if (avsettings=="a"){
-				vidContainer.setVideouserProfilePic(object);
+		if ($debug) Debug.info("createVideo::: ", cl.publicSID, cl.broadCastID, cl.avsettings, cl.interviewPodId);
+		if ($debug) Debug.write(" createVideo ALL vars ", cl);
+		var vidContainer = getVideoObjectByPublicSID(cl.publicSID);
+		if (vidContainer == null) {
+			vidContainer = getNewVideoObjectByPos(cl.publicSID);
+		}
+		vidContainer.clientVars = cl;
+		setPartnerName(vidContainer, cl.firstname, cl.lastname);
+		switch (cl.avsettings) {
+			case 'a':
+				vidContainer.setVideouserProfilePic(cl);
 				if ($debug) Debug.warn("start play");
-				vidContainer._chatvideoinner._videostream.playStream(broadcastId,-1);
+				vidContainer._chatvideoinner._videostream.playStream(cl.broadCastID, -1);
 				vidContainer.setAttribute("visible", false);
-			} else if (avsettings=="v" || avsettings=="av") {
+				break;
+			case 'v':
+			case 'av':
 				//this means avsettings is either: "v" or "av"
-				vidContainer.setDefaultVideoSize(object.VWidth,object.VHeight);
-				vidContainer._chatvideoinner._videostream.playStream(broadcastId,-1);
-				vidContainer.setAttribute("visibility","visible");
-			} else {
-				//this means user did not select anything yet and streaming has not started
-				vidContainer.setAttribute("visibility","hidden");
-			}
-			vidContainer.setAttribute("interviewPodId", interviewPodId);
-			vidContainer.updateAVSettingsSymbol(object);
-			if (object.micMuted) {
-				vidContainer.setMicMuted(object.micMuted);
-			}
-		}
-
-		if ($debug) Debug.write("Is interview ? ",canvas.isInterview);
-		if (canvas.isInterview && interviewPodId != null && interviewPodId > 0) {
-			if ($debug) Debug.write("Is interview ",interviewPodId,"x",canvas["interviewPod"+interviewPodId+"_x"]);
-			vidContainer.setAttribute("interviewPodId", interviewPodId);
-			vidContainer.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
-			vidContainer.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
-			vidContainer.setAttribute("width",322);
-			vidContainer.setAttribute("height",281);
+				vidContainer.setDefaultVideoSize(cl.VWidth, cl.VHeight);
+				vidContainer._chatvideoinner._videostream.playStream(cl.broadCastID, -1);
+				vidContainer.setAttribute("visible", true);
+				break;
+			case 'n':
+			default:
+				vidContainer.setVideouserProfilePic(cl);
+				vidContainer.setAttribute("visible", false);
+				break;
 		}
-		return;
+		vidContainer.updateAVSettingsSymbol(cl);
+		if (cl.micMuted) {
+			vidContainer.setMicMuted(cl.micMuted);
+		}
+		if ($debug) Debug.write(" createVideo ALL vars ", vidContainer);
+		placeInterviewPod(vidContainer, cl.interviewPodId);
+		enableRecordingButton();
+		return vidContainer;
 	]]>
 	</method>
 	
@@ -197,19 +202,7 @@
 	]]>
 	</method>
 
-	<method name="getVideoObjectByInterviewPodId" args="interviewPodId">
-	<![CDATA[
-		for (var i=0;i<this.subviews.length;i++){
-			if (this.subviews[i].interviewPodId==interviewPodId){
-				return this.subviews[i];
-			}
-		}
-		if ($debug) Debug.warn(" - getVideoObjectByInterviewPodId - DID NOT FIND THE USER BY ",interviewPodId);
-		return null;
-	]]>
-	</method>
-
-	<method name="getVideoObjectCount">
+	<method name="enableRecordingButton">
 	<![CDATA[
 		var count = 0;
 		for (var i = 0; i < this.subviews.length; ++i) {
@@ -217,12 +210,21 @@
 				count++;
 			}
 		}
-		return count;
+		if (canvas.isInterview) {
+			if (count > 0 && !canvas._drawarea._interview._stop.enabled) {
+				canvas._drawarea._interview._start.setAttribute('enabled', true);
+			} else if (count == 0 && canvas._drawarea._interview._start.enabled) {
+				canvas._drawarea._interview._start.setAttribute('enabled', false);
+			}
+		}
 	]]>
 	</method>
 
 	<method name="getVideoObjectFreePos" args="offsetLength,videoWidth,videoHeight">
 	<![CDATA[
+		if (canvas.isInterview) {
+			return [0, 0];
+		}
 		var newx = 20;
 		if (canvas.currentRoomObj.hideWhiteboard) {
 			newx += SIDEPANEL_WIDTH;
@@ -263,21 +265,7 @@
 		if ((newy + videoHeight) >= canvas.height) {
 			newy = 0;
 		}
-
-		var result = [newx, newy];
-		return result;
-	]]>
-	</method>
-
-	<method name="disconnectclient" args="publicSID">
-	<![CDATA[
-		if ($debug) Debug.write("disconnectclient: ", publicSID);
-		var obj = closeStreamclient(publicSID);
-		if (obj == null) {
-			if ($debug) Debug.warn("Could Not find this To disconnect",publicSID);
-		} else {
-			obj.destroy();
-		}
+		return [newx, newy];
 	]]>
 	</method>
 
@@ -314,11 +302,14 @@
 	</method>
 
 	<method name="removeVideoByUser" args="publicSID"><![CDATA[
-		var obj = this.closeStreamclient(publicSID);
-		if(obj != null) {
+		if ($debug) Debug.write("removeVideoByUser: ", publicSID);
+		var obj = closeStreamclient(publicSID);
+		if (obj == null) {
+			if ($debug) Debug.warn("Could Not find this To removeVideoByUser", publicSID);
+		} else {
 			obj.destroy();
+			enableRecordingButton();
 		}
-		return;
 	]]></method>
 
 	<method name="updateMuteStatusVideoView" args="roomClient">
@@ -373,25 +364,7 @@
 			obj = createVideoObject(value.publicSID, true, -1, value);
 			obj.setAttribute('visible', true);
 		} else {
-			obj = getVideoObjectByPublicSID(value.publicSID);
-		}
-		//if ($debug) Debug.write("startStream obj: ",obj);
-		if (obj != null ){
-			obj._chatvideoinner._videostream.playStream(value.broadCastID, -1);
-			obj.setDefaultVideoSize(value.VWidth, value.VHeight);
-			setPartnerName(obj, value.firstname, value.lastname);
-		}
-		//we have to do this again when the stream starts, the initial video 
-		//component does not know the interviewPodId as the user has not selected 
-		//which interview video pod he is going to use
-		var interviewPodId = value.interviewPodId;
-		if (canvas.isInterview && interviewPodId != null && interviewPodId > 0) {
-			if ($debug) Debug.write("Is interview ", interviewPodId, "x", canvas["interviewPod" + interviewPodId + "_x"]);
-			obj.setAttribute("interviewPodId", interviewPodId);
-			obj.setAttribute("x",canvas["interviewPod" + interviewPodId + "_x"]);
-			obj.setAttribute("y",canvas["interviewPod" + interviewPodId + "_y"]);
-			obj.setAttribute("width", 322);
-			obj.setAttribute("height", 281);
+			createVideo(value);
 		}
 	]]>
 	</method>
@@ -760,10 +733,34 @@
 		return val != null ? val : def;
 	</method>
 
-	<netRemoteCallHib name="restartAvBroadcast" funcname="getBroadCastId" remotecontext="$once{ canvas.thishib }">
+	<method name="_startAvBroadcast" args="restart=false">
+		var g = canvas.commonVideoViewContent.loadAVsettings();
+		var settings = getAvSetting('avstored', g, 'av');
+		var vWidth = canvas.isInterview ? 320 : getAvSetting('width', g, 120);
+		var vHeight = canvas.isInterview ? 260 : getAvSetting('height', g, 90);
+		setUserAVSettings.avsetting = settings;
+		setUserAVSettings.vWidth = vWidth;
+		setUserAVSettings.vHeight = vHeight;
+		setUserAVSettings.vHeight = vHeight;
+		setUserAVSettings.updateBroadcastId = restart;
+		setUserAVSettings.doCall();
+	</method>
+
+	<netRemoteCallHib name="setUserAVSettings" funcname="setUserAVSettings" remotecontext="$once{ canvas.thishib }" >
+		<attribute name="avsetting" value="" type="string" />
+		<attribute name="vWidth" value="0" type="number" />
+		<attribute name="vHeight" value="0" type="number" />
+		<attribute name="updateBroadcastId" value="false" type="boolean" />
+		<netparam><method name="getValue">return parent.avsetting;</method></netparam>
+		<netparam><method name="getValue">return parent.vWidth;</method></netparam>
+		<netparam><method name="getValue">return parent.vHeight;</method></netparam>
+		<netparam><method name="getValue">return parent.updateBroadcastId;</method></netparam>
 		<handler name="ondata" args="value">
-			canvas.currentClient.broadCastID = value;
-			parent.startAvBroadcast();
+			if ($debug) Debug.write("setUserAVSettings:: done", value);
+			if (value > -1) {
+				canvas.currentClient.broadCastID = value;
+				parent.startAvBroadcast();
+			}
 		</handler>
 	</netRemoteCallHib>
 
@@ -773,10 +770,12 @@
 		var myvideocontainer = createVideoObject(canvas.publicSID, true, canvas.currentClient.interviewPodId, canvas.currentClient);
 		if ($debug) Debug.write("doStartConference::doninitalize");
 		var settings = getAvSetting('avstored', g, 'av');
+		var vWidth = canvas.isInterview ? 320 : getAvSetting('width', g, 120);
+		var vHeight = canvas.isInterview ? 260 : getAvSetting('height', g, 90);
 		if (!canvas.isInterview) {
-			myvideocontainer.setDefaultVideoSize(getAvSetting('width', g, 120), getAvSetting('height', g, 90));
+			myvideocontainer.setDefaultVideoSize(vWidth, vHeight);
 		}
-		
+
 		var videoview = myvideocontainer._chatvideoinner._videostream;
 		if ($debug) Debug.write("myvideocontainer: ", myvideocontainer);
 		myvideocontainer.setAttribute('isremote', false);
@@ -824,6 +823,7 @@
 				if ($debug) Debug.warn("no valid device Setup chosen");
 				break;
 		}
+		enableRecordingButton();
 	]]>
 	</method>
 </class>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx Wed Dec 14 09:57:18 2016
@@ -109,8 +109,8 @@
 	<method name="batchCreateVideo" args="clients">
 	<![CDATA[
 		if ($debug) Debug.write("interval 0 :: ", clients.length);
-		canvas.commonVideoViewContent.batchCreateVideo(canvas.streamid, clients);
-			
+		canvas.commonVideoViewContent.batchCreateVideo(clients);
+
 		//this content must be inited _after_ setting the default values
 		canvas.thishib.getCurrentModeratorList.doCall();
 		//FIXME Issue-1076
@@ -151,7 +151,7 @@
 		
 		//Do init only in case this stream is NOT the same as we are
 		if (streamid != canvas.streamid) {
-			canvas.commonVideoViewContent.createVideo(object.publicSID, object.firstname+' '+object.lastname, object.broadCastID, object.avsettings, -1, object);
+			canvas.commonVideoViewContent.createVideo(object);
 		}
 	]]>
 	</method>
@@ -166,14 +166,6 @@
 	]]>
 	</method>
 		
-	<!--
-		invoked whenever a User starts to Stream Video in this Room, 
-		interviewPodId has only a meaning in the Room Type Interview
-	 -->		
-	<method name="startStream" args="publicSID,broadcastId,firstname,lastname,interviewPodId,VWidth,VHeight">
-		canvas.commonVideoViewContent.startStream(publicSID,broadcastId,firstname,lastname,interviewPodId,VWidth,VHeight);
-	</method>
-
 	<method name="closeStreamClient" args="publicSID">
 		canvas.commonVideoViewContent.closeStreamClient(publicSID);
 	</method>
@@ -181,18 +173,6 @@
 	<method name="resetAllValues">
 		canvas.commonVideoViewContent.resetAllValues();
 	</method>
-	
-	<method name="removeVideoByUser" args="userObject">
-		canvas.commonVideoViewContent.removeVideoByUser(userObject.publicSID);
-	</method>
-	
-	<!--- 
-		stops the streaming but and destroys the view
-		@param int broadcastId broadcastId
-	 -->
-	<method name="disconnectclient" args="publicSID">
-		canvas.commonVideoViewContent.disconnectclient(publicSID);
-	</method>
 
 	<method name="updateMuteStatusVideoView" args="roomClient">
 		canvas.commonVideoViewContent.updateMuteStatusVideoView(roomClient);

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewVideoBox.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewVideoBox.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewVideoBox.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewVideoBox.lzx Wed Dec 14 09:57:18 2016
@@ -21,14 +21,14 @@
 <library>
 
 <class name="interviewVideoChooseUser" extends="guiPresenter" resizeable="false"
-	width="220" height="100" closable="true" labelid="910" y="10" minimizable="false">
-	
+		width="220" height="100" closable="true" labelid="910" y="10" minimizable="false">
+
 	<attribute name="refObj" value="null" />
-	
+
 	<handler name="oninit">
 		this.getClientListScope.doCall();
 	</handler>
-	
+
 	<netRemoteCallHib name="getClientListScope" funcname="getClientListScope" remotecontext="$once{ canvas.thishib }" >
 		<handler name="ondata" args="value">
 		<![CDATA[
@@ -41,17 +41,17 @@
 		]]>
 		</handler>  
 	</netRemoteCallHib>
-	
+
 	<labelText labelid="911" x="2" y="22"/>
-	
+
 	<resetCombobox name="_users" x="2" y="42" width="$once{ parent.width-4 }"/>
-	
+
 	<simpleLabelButton labelid="61" width="100" x="$once{ parent.width - 105 }" y="$once{ parent.height - 26 }">
 		<handler name="onclick">
 			this.parent.close();
 		</handler>
 	</simpleLabelButton>
-	
+
 	<simpleLabelButton labelid="60" width="100" x="$once{ parent.width - 210 }" y="$once{ parent.height - 26 }">
 		<handler name="onclick">
 			var valueCombobox = parent._users.getValue();
@@ -60,7 +60,6 @@
 			}
 		</handler>
 	</simpleLabelButton>
-	
 </class>
 
 <class name="interviewVideoBox" extends="view" width="322" height="281" bgcolor="0x000000">
@@ -72,47 +71,36 @@
 		</when>
 	</switch>
 	<attribute name="interviewPodId" value="0" type="number" />
-	
-	<method name="startInterView">
-		if ($debug) Debug.write("startInterView :: ");
-		var tx = this.getAttributeRelative("x",canvas);
-		var ty = this.getAttributeRelative("y",canvas);
-		//TODO
-		canvas.commonVideoViewContent.createEditRecordStream(false, true, this.interviewPodId);
-	</method>
 
 	<method name="sendConfirmation" args="publicSID">
 		if ($debug) Debug.write("sendConfirmation :: ", publicSID);
-		
-		ExternalInterface.call("changeRight", canvas.currentRoomObj.audioOnly ? 'audio' : 'video', publicSID);
-		
+		ExternalInterface.call("toggleActivity", canvas.currentRoomObj.audioOnly ? 'broadcastA' : 'broadcastAV', publicSID, this.interviewPodId);
 		return true;
 	</method>
-	
+
 	<netRemoteCallHib name="sendMessageWithClientByPublicSID" funcname="sendMessageWithClientByPublicSID"
-					  remotecontext="$once{ canvas.thishib }" >  
+			remotecontext="$once{ canvas.thishib }" >  
 		<attribute name="messageObject" value="null" />
 		<attribute name="publicSID" value="" type="string" />
 		<netparam><method name="getValue">return parent.messageObject;</method></netparam>
 		<netparam><method name="getValue">return parent.publicSID;</method></netparam>
 		<handler name="ondata" args="value">
-			<![CDATA[
-				if ($debug) Debug.write("+sendMessageWithClientByPublicSID : ",value);
-				
-			]]>
+		<![CDATA[
+			if ($debug) Debug.write("+sendMessageWithClientByPublicSID : ",value);
+		]]>
 		</handler>
 	</netRemoteCallHib>
-	
+
 	<simpleLabelButton labelid="910" height="30" valign="middle" align="center"
-			   visible="${ ((canvas.ismoderator) ? true : ((canvas.isAllowedToDraw) ? true : false )) }">
+			visible="${ ((canvas.ismoderator) ? true : ((canvas.isAllowedToDraw) ? true : false )) }">
 		<handler name="onclick" args="refObj">
 			new lz.interviewVideoChooseUser(canvas,{
-							isInterview:true,
-							x:this.getAttributeRelative("x",canvas)-10,
-							y:this.getAttributeRelative("y",canvas)-20,
-							width:this.width+20,
-							refObj:parent
-						});
+					isInterview:true,
+					x:this.getAttributeRelative("x",canvas)-10,
+					y:this.getAttributeRelative("y",canvas)-20,
+					width:this.width+20,
+					refObj:parent
+				});
 		</handler>
 	</simpleLabelButton>
 </class>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewWhiteboard.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewWhiteboard.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewWhiteboard.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/whiteboard/interviewWhiteboard.lzx Wed Dec 14 09:57:18 2016
@@ -21,57 +21,25 @@
 <library>
 
 <class name="interviewWhiteboard" extends="view" clip="true">
-	<attribute name="checkPodsDelegate" value="null"/>
-	
 	<handler name="oninit">
-	<![CDATA[
-	if ($debug) Debug.write(":: interviewWhiteboard :: oninit :: ", canvas.commonVideoViewContent);
+		if ($debug) Debug.write(":: interviewWhiteboard :: oninit :: ", canvas.commonVideoViewContent);
 		canvas._drawarea = this;
-		if (checkPodsDelegate == null && !_recStarted.visible) {
-			checkPodsDelegate = new LzDelegate(this, "checkPods");
-			lz.Timer.addTimer(checkPodsDelegate, 1000);
-		}
 		this.reloadStatus();
-	]]>
 	</handler>
-	
-	<handler name="ondestroy">
-		stopPodChecks();
-	</handler>
-	
+
 	<handler name="onopenWhiteBoard" >
 		if ($debug) Debug.write("-- onOpenWhiteBoard --");
 	</handler>
-	
-	<method name="newInterviewStarting" args="refObj">
-	<![CDATA[
-		this._videoviewcontent["interviewVideoBox"+refObj.interviewPodId].startInterView();
-	]]>
-	</method>
-	
-	<method name="stopPodChecks">
-		if (checkPodsDelegate != null) {
-			lz.Timer.removeTimer(checkPodsDelegate);
-			checkPodsDelegate = null;
-		}
-	</method>
 
-	<method name="checkPods" args="ignore=null">
-		var count = canvas.commonVideoViewContent.getVideoObjectCount();
-		//if ($debug) Debug.write(":: Pods :: check :: ", count);
-		_interview._start.setAttribute("enabled", count > 0);
-		lz.Timer.resetTimer(checkPodsDelegate, 1000);
-	</method>
-	
 	<method name="reloadStatus">
 		this.getInterviewRecordingStatus.doCall();
 	</method>
-	
+
 	<!--
 	getInterviewRecordingStatus()
 	 -->
 	<netRemoteCallHib name="getInterviewRecordingStatus" funcname="getInterviewRecordingStatus"
-					remotecontext="$once{ canvas.thishib }" >  
+			remotecontext="$once{ canvas.thishib }" >  
 		<handler name="ondata" args="value">
 			<![CDATA[
 				if ($debug) Debug.write("getInterviewRecordingStatus: ",value);
@@ -83,47 +51,43 @@
 			]]>
 		</handler>
 	</netRemoteCallHib>
-	
+
 	<simplelayout axis="y" spacing="2" />
-	
+
 	<view name="_videoviewcontent" x="40" >
 		<simplelayout axis="x" spacing="2" />
 		<interviewVideoBox name="interviewVideoBox1" interviewPodId="1" />
 		<interviewVideoBox name="interviewVideoBox2" x="324" interviewPodId="2" />
 	</view>
-	
+
 	<view name="_interview" align="center" visible="${ canvas.ismoderator }">
 		<!--
 		   public synchronized Boolean startInterviewRecording()
 		 -->
 		<netRemoteCallHib name="startInterviewRecording" funcname="startInterviewRecording" remotecontext="$once{ canvas.thishib }" >
 			<handler name="ondata" args="value">
-				<![CDATA[
-					if ($debug) Debug.write("startInterviewRecording: ",value);
-					if (value) {
-						parent._stop.setAttribute('enabled', true);
-					} else {
-						new lz.labelerrorPopup(canvas,{errorlabelid:915});
-					}
-				]]>
+				if ($debug) Debug.write("startInterviewRecording: ",value);
+				if (value) {
+					parent._stop.setAttribute('enabled', true);
+				} else {
+					new lz.labelerrorPopup(canvas,{errorlabelid:915});
+				}
 			</handler>
 		</netRemoteCallHib>
-		
+
 		<netRemoteCallHib name="stopInterviewRecording" funcname="stopInterviewRecording" remotecontext="$once{ canvas.thishib }" >
 			<handler name="ondata" args="value">
-				<![CDATA[
-					if ($debug) Debug.write("stopInterviewRecording: ",value);
-					 if (value) {
-						parent._stop.setAttribute('enabled', false);
-					} else {
-						new lz.labelerrorPopup(canvas,{errorlabelid:916});
-					}
-				]]>
+				if ($debug) Debug.write("stopInterviewRecording: ",value);
+				if (value) {
+					parent._stop.setAttribute('enabled', false);
+				} else {
+					new lz.labelerrorPopup(canvas,{errorlabelid:916});
+				}
 			</handler>
 		</netRemoteCallHib>
-		
+
 		<simplelayout axis="x" spacing="2" />
-		
+
 		<simpleLabelButton name="_start" labelid="913" height="30" width="200" enabled="false">
 			<handler name="onclick">
 				if ($debug) Debug.write("Start Recording");
@@ -131,7 +95,7 @@
 			</handler>
 			<view x="2" y="4" resource="interview_record_start" />
 		</simpleLabelButton>
-		
+
 		<simpleLabelButton name="_stop" labelid="914" height="30" width="200" enabled="false">
 			<handler name="onclick">
 				if ($debug) Debug.write("Stop Recording");
@@ -139,13 +103,10 @@
 			</handler>
 			<view x="2" y="4" resource="interview_record_stop" />
 		</simpleLabelButton>
-		
 	</view>
-	
+
 	<view name="_recStarted" align="center" visibility="hidden">
 		<labelText labelid="917" />
 	</view>
-
 </class>
-
 </library>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/baseVideoObject.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/baseVideoObject.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/baseVideoObject.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/baseVideoObject.lzx Wed Dec 14 09:57:18 2016
@@ -411,7 +411,7 @@
 				<handler name="onclick">
 					parent.parent.resetValues();
 					if (!parent.parent.isremote) {
-						canvas.commonVideoViewContent.restartAvBroadcast.doCall()
+						canvas.commonVideoViewContent._startAvBroadcast(true)
 					}
 				</handler>
 				<labelTooltip name="_tip" labelid="540" />

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx Wed Dec 14 09:57:18 2016
@@ -56,7 +56,6 @@
 	<attribute name="doDefaultAnimation" value="true" type="boolean" />
 	<attribute name="cam_default_width" value="320" type="number" />
 	<attribute name="cam_default_height" value="260" type="number" />
-	<attribute name="interviewPodId" value="0" type="number" />
 	<attribute name="lastRecorded" value="" type="string" />
 	<attribute name="isRunning" value="false" type="boolean" />
 	<attribute name="recordingsCounter" value="5" type="number" />
@@ -109,13 +108,6 @@
 		}
 		this.executeAttachCamera = true;
 		this.attachCamera();
-		
-		//TODO check this
-		if (canvas.isInterview) {
-			if ($debug) Debug.write("Is interview ", interviewPodId);
-			//this.setAttribute("x",canvas["interviewPod"+interviewPodId+"_x"]);
-			//this.setAttribute("y",canvas["interviewPod"+interviewPodId+"_y"]);
-		}
 	]]>
 	</handler>
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Wed Dec 14 09:57:18 2016
@@ -51,6 +51,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.pages.AccessDeniedPage;
 import org.apache.openmeetings.web.pages.ActivatePage;
 import org.apache.openmeetings.web.pages.HashPage;
@@ -231,16 +232,19 @@ public class Application extends Authent
 			rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
 			rcl.setIsMod(client.hasRight(Right.moderator));
 			rcl.setIsBroadcasting(client.hasRight(Right.audio));
-			rcl.setCanVideo(client.hasRight(Right.video) && client.hasActivity(Activity.broadcastVideo));
+			rcl.setCanVideo(client.hasRight(Right.video) && client.hasActivity(Activity.broadcastV));
 			rcl.setCanDraw(client.hasRight(Right.whiteBoard));
-			if (client.hasActivity(Activity.broadcastAudio) || client.hasActivity(Activity.broadcastVideo)) {
+			if (client.hasActivity(Activity.broadcastA) || client.hasActivity(Activity.broadcastV)) {
+				if (client.getPod() != Pod.none) {
+					rcl.setInterviewPodId(client.getPod() == Pod.left ? 1 : 2);
+				}
 				rcl.setIsBroadcasting(true);
 				rcl.setBroadCastID(ScopeApplicationAdapter.nextBroadCastId());
 				StringBuilder sb = new StringBuilder();
-				if (client.hasActivity(Activity.broadcastAudio)) {
+				if (client.hasActivity(Activity.broadcastA)) {
 					sb.append('a');
 				}
-				if (client.hasActivity(Activity.broadcastVideo)) {
+				if (client.hasActivity(Activity.broadcastV)) {
 					sb.append('v');
 				}
 				rcl.setAvsettings(sb.toString());

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Dec 14 09:57:18 2016
@@ -40,14 +40,18 @@ public class Client implements IDataProv
 	private static final long serialVersionUID = 1L;
 
 	public enum Activity {
-		broadcastAudio //sends Audio to the room
-		, broadcastVideo //sends Video to the room
+		broadcastA //sends Audio to the room
+		, broadcastV //sends Video to the room
+		, broadcastAV //sends Audio+Video to the room
 		, share
 		, record
 		, publish //sends A/V to external server
 		, muted
 		, exclusive
 	}
+	public enum Pod {
+		none, left, right;
+	}
 	private final String sessionId;
 	private int pageId;
 	private final User user;
@@ -56,6 +60,7 @@ public class Client implements IDataProv
 	private final Set<Right> rights = new HashSet<>();
 	private final Set<Activity> activities = new HashSet<>();
 	private final Date connectedSince;
+	private Pod pod;
 
 	public Client(String sessionId, Long userId) {
 		this(sessionId, 0, userId);
@@ -113,8 +118,48 @@ public class Client implements IDataProv
 		return activities;
 	}
 
-	public boolean hasActivity(Activity activity) {
-		return activities.contains(activity);
+	public boolean hasActivity(Activity a) {
+		return activities.contains(a);
+	}
+
+	public void toggle(Activity a) {
+		if (hasActivity(a)) {
+			remove(a);
+		} else {
+			set(a);
+		}
+	}
+
+	public void set(Activity a) {
+		activities.add(a);
+		switch (a) {
+			case broadcastV:
+			case broadcastA:
+				if (hasActivity(Activity.broadcastA) && hasActivity(Activity.broadcastV)) {
+					activities.add(Activity.broadcastAV);
+				}
+				break;
+			case broadcastAV:
+				activities.add(Activity.broadcastA);
+				activities.add(Activity.broadcastV);
+				break;
+			default:
+		}
+	}
+
+	public void remove(Activity a) {
+		activities.remove(a);
+		switch (a) {
+			case broadcastV:
+			case broadcastA:
+				activities.remove(Activity.broadcastAV);
+				break;
+			case broadcastAV:
+				activities.remove(Activity.broadcastA);
+				activities.remove(Activity.broadcastV);
+				break;
+			default:
+		}
 	}
 
 	public Date getConnectedSince() {
@@ -139,6 +184,18 @@ public class Client implements IDataProv
 		return this;
 	}
 
+	public Pod getPod() {
+		return pod;
+	}
+
+	public void setPod(Integer i) {
+		if (i != null && i.intValue() > 0) {
+			this.pod = i.intValue() == 1 ? Pod.left : Pod.right;
+		} else {
+			this.pod = Pod.none;
+		}
+	}
+
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -172,6 +229,6 @@ public class Client implements IDataProv
 	@Override
 	public String toString() {
 		return "Client [uid=" + uid + ", sessionId=" + sessionId + ", pageId=" + pageId + ", userId=" + user.getId() + ", roomId=" + roomId
-				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + "]";
+				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + ", pod = " + pod + "]";
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Dec 14 09:57:18 2016
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomPanel.Action;
@@ -77,11 +78,6 @@ public class RoomSidebar extends Panel {
 	private final ConfirmableAjaxBorder confirmKick;
 	private boolean showFiles;
 	private Client kickedClient;
-	public enum Pod {
-		none
-		, right
-		, left
-	};
 	private final ListView<Client> users = new ListView<Client>("user", new ArrayList<Client>()) {
 		private static final long serialVersionUID = 1L;
 
@@ -172,11 +168,22 @@ public class RoomSidebar extends Panel {
 				if (c == null) {
 					return;
 				}
+				if (!activityAllowed(c, a, room.getRoom()) && room.getClient().hasRight(Right.moderator)) {
+					if (a == Activity.broadcastA || a == Activity.broadcastAV) {
+						c.getRights().add(Room.Right.audio);
+					}
+					if (!room.getRoom().isAudioOnly() && (a == Activity.broadcastV || a == Activity.broadcastAV)) {
+						c.getRights().add(Room.Right.video);
+					}
+				}
 				if (activityAllowed(c, a, room.getRoom())) {
-					if (c.hasActivity(a)) {
-						c.getActivities().remove(a);
+					Pod pod = c.getPod();
+					c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger());
+					if (pod != Pod.none && pod != c.getPod()) {
+						//pod has changed, no need to toggle
+						c.set(a);
 					} else {
-						c.getActivities().add(a);
+						c.toggle(a);
 					}
 					room.broadcast(target, c);
 				}
@@ -190,7 +197,7 @@ public class RoomSidebar extends Panel {
 		super(id);
 		this.room = room;
 		updateShowFiles();
-		
+
 		userTab = new ITab() {
 			private static final long serialVersionUID = 1L;
 
@@ -300,17 +307,20 @@ public class RoomSidebar extends Panel {
 	}
 
 	public static boolean activityAllowed(Client c, Activity a, Room room) {
+		boolean r = false;
 		switch (a) {
-			case broadcastAudio:
-				return c.hasRight(Right.audio);
-			case broadcastVideo:
-				{
-					if (room.isAudioOnly()) {
-						return false;
-					}
-					return c.hasRight(Right.video);
-				}
+			case broadcastA:
+				r = c.hasRight(Right.audio);
+				break;
+			case broadcastV:
+				r = !room.isAudioOnly() && c.hasRight(Right.video);
+				break;
+			case broadcastAV:
+				r = !room.isAudioOnly() && c.hasRight(Right.audio) && c.hasRight(Right.video);
+				break;
+			default:
+				break;
 		}
-		return false;
+		return r;
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -27,7 +27,7 @@ public class CamActivityIcon extends Roo
 	private static final long serialVersionUID = 1L;
 
 	public CamActivityIcon(String id, Client client, RoomPanel room) {
-		super(id, client, Activity.broadcastVideo, room);
+		super(id, client, Activity.broadcastV, room);
 		mainCssClass = "activity cam ";
 	}
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -27,7 +27,7 @@ public class MicActivityIcon extends Roo
 	private static final long serialVersionUID = 1L;
 
 	public MicActivityIcon(String id, Client client, RoomPanel room) {
-		super(id, client, Activity.broadcastAudio, room);
+		super(id, client, Activity.broadcastA, room);
 		mainCssClass = "activity mic ";
 	}
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -20,11 +20,12 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.web.room.sidebar.RoomSidebar.FUNC_TOGGLE_ACTIVITY;
 
+import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.sidebar.RoomSidebar;
-import org.apache.openmeetings.web.room.sidebar.RoomSidebar.Pod;
 import org.apache.openmeetings.web.room.sidebar.icon.ClientIcon;
 
 public abstract class RoomActivityIcon extends ClientIcon {
@@ -44,7 +45,8 @@ public abstract class RoomActivityIcon e
 	}
 
 	protected boolean visible() {
-		return RoomSidebar.activityAllowed(client, activity, room.getRoom());
+		return Room.Type.interview != room.getRoom().getType()
+				&& RoomSidebar.activityAllowed(client, activity, room.getRoom());
 	}
 
 	@Override

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java Wed Dec 14 09:57:18 2016
@@ -23,6 +23,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter.nextBroadCastId;
 import static org.apache.openmeetings.util.LocaleHelper.getCountryName;
 
 import java.util.ArrayList;
@@ -303,7 +304,7 @@ public class MobileService {
 		User u = userDao.get(userId);
 		Client c = scopeAdapter.setUsernameReconnect(SID, userId, u.getLogin(), u.getFirstname(), u.getLastname(), u.getPictureuri());
 		 //TODO check if we need anything here
-		long broadcastId = scopeAdapter.getBroadCastId();
+		long broadcastId = nextBroadCastId();
 		c.setSipTransport(true);
 		c.setRoomId(Long.parseLong(c.getScope()));
 		c.setRoomEnter(new Date());
@@ -333,7 +334,7 @@ public class MobileService {
 		hsm.put("message", new String[]{"avsettings", "0", avMode});
 		Map<String, Object> result = new Hashtable<String, Object>();
 		if (!"n".equals(avMode)) {
-			result.put("broadcastId", scopeAdapter.getBroadCastId());
+			result.put("broadcastId", nextBroadCastId());
 		}
 
 		scopeAdapter.sendMessageToCurrentScope("sendVarsToMessageWithClient", hsm, true, false);

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Wed Dec 14 09:57:18 2016
@@ -990,27 +990,6 @@ public class ScopeApplicationAdapter ext
 	}
 
 	/**
-	 * there will be set an attribute called "broadCastCounter" this is the name
-	 * this user will publish his stream
-	 * 
-	 * @return long broadCastId
-	 */
-	public long getBroadCastId() {
-		try {
-			log.debug("-----------  getBroadCastId");
-			IConnection current = Red5.getConnectionLocal();
-			String streamid = current.getClient().getId();
-			Client client = sessionManager.getClientByStreamId(streamid, null);
-			client.setBroadCastID(nextBroadCastId());
-			sessionManager.updateClientByStreamId(streamid, client, false, null);
-			return client.getBroadCastID();
-		} catch (Exception err) {
-			log.error("[getBroadCastId]", err);
-		}
-		return -1;
-	}
-
-	/**
 	 * this must be set _after_ the Video/Audio-Settings have been chosen (see
 	 * editrecordstream.lzx) but _before_ anything else happens, it cannot be
 	 * applied _after_ the stream has started! 
@@ -1025,32 +1004,29 @@ public class ScopeApplicationAdapter ext
 	 * @param vWidth
 	 * @param vHeight
 	 * 
-	 * @return RoomClient being updated in case of no errors, null otherwise
+	 * @return BroadcastId in case of no errors, -1 otherwise
 	 */
-	public Client setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight) {
+	public long setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight, boolean updateBroadcastId) {
 		try {
 			String streamid = Red5.getConnectionLocal().getClient().getId();
-			log.debug("-----------  setUserAVSettings {} {} {}", new Object[] {streamid, avsettings});
+			log.debug("-----------  setUserAVSettings {} {}", streamid, avsettings);
 			Client currentClient = sessionManager.getClientByStreamId(streamid, null);
 			if (currentClient == null) {
 				log.warn("Failed to find appropriate clients");
-				return null;
+				return -1;
 			}
 			currentClient.setAvsettings(avsettings);
 			currentClient.setVWidth(vWidth);
 			currentClient.setVHeight(vHeight);
+			if (updateBroadcastId) {
+				currentClient.setBroadCastID(nextBroadCastId());
+			}
 			sessionManager.updateAVClientByStreamId(streamid, currentClient, null);
-
-			HashMap<String, Object> hsm = new HashMap<>();
-			hsm.put("client", currentClient);
-			hsm.put("message", new Object[]{"avsettings", 0, avsettings});
-
-			sendMessageToCurrentScope("sendVarsToMessageWithClient", hsm, true);
-			return currentClient;
+			return currentClient.getBroadCastID();
 		} catch (Exception err) {
 			log.error("[setUserAVSettings]", err);
 		}
-		return null;
+		return -1;
 	}
 
 	/*

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Wed Dec 14 09:57:18 2016
@@ -51,6 +51,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.pages.AccessDeniedPage;
 import org.apache.openmeetings.web.pages.ActivatePage;
 import org.apache.openmeetings.web.pages.HashPage;
@@ -231,16 +232,19 @@ public class Application extends Authent
 			rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
 			rcl.setIsMod(client.hasRight(Right.moderator));
 			rcl.setIsBroadcasting(client.hasRight(Right.audio));
-			rcl.setCanVideo(client.hasRight(Right.video) && client.hasActivity(Activity.broadcastVideo));
+			rcl.setCanVideo(client.hasRight(Right.video) && client.hasActivity(Activity.broadcastV));
 			rcl.setCanDraw(client.hasRight(Right.whiteBoard));
-			if (client.hasActivity(Activity.broadcastAudio) || client.hasActivity(Activity.broadcastVideo)) {
+			if (client.hasActivity(Activity.broadcastA) || client.hasActivity(Activity.broadcastV)) {
+				if (client.getPod() != Pod.none) {
+					rcl.setInterviewPodId(client.getPod() == Pod.left ? 1 : 2);
+				}
 				rcl.setIsBroadcasting(true);
 				rcl.setBroadCastID(ScopeApplicationAdapter.nextBroadCastId());
 				StringBuilder sb = new StringBuilder();
-				if (client.hasActivity(Activity.broadcastAudio)) {
+				if (client.hasActivity(Activity.broadcastA)) {
 					sb.append('a');
 				}
-				if (client.hasActivity(Activity.broadcastVideo)) {
+				if (client.hasActivity(Activity.broadcastV)) {
 					sb.append('v');
 				}
 				rcl.setAvsettings(sb.toString());

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Dec 14 09:57:18 2016
@@ -40,14 +40,18 @@ public class Client implements IDataProv
 	private static final long serialVersionUID = 1L;
 
 	public enum Activity {
-		broadcastAudio //sends Audio to the room
-		, broadcastVideo //sends Video to the room
+		broadcastA //sends Audio to the room
+		, broadcastV //sends Video to the room
+		, broadcastAV //sends Audio+Video to the room
 		, share
 		, record
 		, publish //sends A/V to external server
 		, muted
 		, exclusive
 	}
+	public enum Pod {
+		none, left, right;
+	}
 	private final String sessionId;
 	private int pageId;
 	private final User user;
@@ -56,6 +60,7 @@ public class Client implements IDataProv
 	private final Set<Right> rights = new HashSet<>();
 	private final Set<Activity> activities = new HashSet<>();
 	private final Date connectedSince;
+	private Pod pod;
 
 	public Client(String sessionId, Long userId) {
 		this(sessionId, 0, userId);
@@ -113,8 +118,48 @@ public class Client implements IDataProv
 		return activities;
 	}
 
-	public boolean hasActivity(Activity activity) {
-		return activities.contains(activity);
+	public boolean hasActivity(Activity a) {
+		return activities.contains(a);
+	}
+
+	public void toggle(Activity a) {
+		if (hasActivity(a)) {
+			remove(a);
+		} else {
+			set(a);
+		}
+	}
+
+	public void set(Activity a) {
+		activities.add(a);
+		switch (a) {
+			case broadcastV:
+			case broadcastA:
+				if (hasActivity(Activity.broadcastA) && hasActivity(Activity.broadcastV)) {
+					activities.add(Activity.broadcastAV);
+				}
+				break;
+			case broadcastAV:
+				activities.add(Activity.broadcastA);
+				activities.add(Activity.broadcastV);
+				break;
+			default:
+		}
+	}
+
+	public void remove(Activity a) {
+		activities.remove(a);
+		switch (a) {
+			case broadcastV:
+			case broadcastA:
+				activities.remove(Activity.broadcastAV);
+				break;
+			case broadcastAV:
+				activities.remove(Activity.broadcastA);
+				activities.remove(Activity.broadcastV);
+				break;
+			default:
+		}
 	}
 
 	public Date getConnectedSince() {
@@ -139,6 +184,18 @@ public class Client implements IDataProv
 		return this;
 	}
 
+	public Pod getPod() {
+		return pod;
+	}
+
+	public void setPod(Integer i) {
+		if (i != null && i.intValue() > 0) {
+			this.pod = i.intValue() == 1 ? Pod.left : Pod.right;
+		} else {
+			this.pod = Pod.none;
+		}
+	}
+
 	@Override
 	public int hashCode() {
 		final int prime = 31;
@@ -172,6 +229,6 @@ public class Client implements IDataProv
 	@Override
 	public String toString() {
 		return "Client [uid=" + uid + ", sessionId=" + sessionId + ", pageId=" + pageId + ", userId=" + user.getId() + ", roomId=" + roomId
-				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + "]";
+				+ ", rights=" + rights + ", activities=" + activities + ", connectedSince=" + connectedSince + ", pod = " + pod + "]";
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Dec 14 09:57:18 2016
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomPanel.Action;
@@ -77,11 +78,6 @@ public class RoomSidebar extends Panel {
 	private final ConfirmableAjaxBorder confirmKick;
 	private boolean showFiles;
 	private Client kickedClient;
-	public enum Pod {
-		none
-		, right
-		, left
-	};
 	private final ListView<Client> users = new ListView<Client>("user", new ArrayList<Client>()) {
 		private static final long serialVersionUID = 1L;
 
@@ -172,11 +168,22 @@ public class RoomSidebar extends Panel {
 				if (c == null) {
 					return;
 				}
+				if (!activityAllowed(c, a, room.getRoom()) && room.getClient().hasRight(Right.moderator)) {
+					if (a == Activity.broadcastA || a == Activity.broadcastAV) {
+						c.getRights().add(Room.Right.audio);
+					}
+					if (!room.getRoom().isAudioOnly() && (a == Activity.broadcastV || a == Activity.broadcastAV)) {
+						c.getRights().add(Room.Right.video);
+					}
+				}
 				if (activityAllowed(c, a, room.getRoom())) {
-					if (c.hasActivity(a)) {
-						c.getActivities().remove(a);
+					Pod pod = c.getPod();
+					c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger());
+					if (pod != Pod.none && pod != c.getPod()) {
+						//pod has changed, no need to toggle
+						c.set(a);
 					} else {
-						c.getActivities().add(a);
+						c.toggle(a);
 					}
 					room.broadcast(target, c);
 				}
@@ -190,7 +197,7 @@ public class RoomSidebar extends Panel {
 		super(id);
 		this.room = room;
 		updateShowFiles();
-		
+
 		userTab = new ITab() {
 			private static final long serialVersionUID = 1L;
 
@@ -300,17 +307,20 @@ public class RoomSidebar extends Panel {
 	}
 
 	public static boolean activityAllowed(Client c, Activity a, Room room) {
+		boolean r = false;
 		switch (a) {
-			case broadcastAudio:
-				return c.hasRight(Right.audio);
-			case broadcastVideo:
-				{
-					if (room.isAudioOnly()) {
-						return false;
-					}
-					return c.hasRight(Right.video);
-				}
+			case broadcastA:
+				r = c.hasRight(Right.audio);
+				break;
+			case broadcastV:
+				r = !room.isAudioOnly() && c.hasRight(Right.video);
+				break;
+			case broadcastAV:
+				r = !room.isAudioOnly() && c.hasRight(Right.audio) && c.hasRight(Right.video);
+				break;
+			default:
+				break;
 		}
-		return false;
+		return r;
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -27,7 +27,7 @@ public class CamActivityIcon extends Roo
 	private static final long serialVersionUID = 1L;
 
 	public CamActivityIcon(String id, Client client, RoomPanel room) {
-		super(id, client, Activity.broadcastVideo, room);
+		super(id, client, Activity.broadcastV, room);
 		mainCssClass = "activity cam ";
 	}
 

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -27,7 +27,7 @@ public class MicActivityIcon extends Roo
 	private static final long serialVersionUID = 1L;
 
 	public MicActivityIcon(String id, Client client, RoomPanel room) {
-		super(id, client, Activity.broadcastAudio, room);
+		super(id, client, Activity.broadcastA, room);
 		mainCssClass = "activity mic ";
 	}
 

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java?rev=1774157&r1=1774156&r2=1774157&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java Wed Dec 14 09:57:18 2016
@@ -20,11 +20,12 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.web.room.sidebar.RoomSidebar.FUNC_TOGGLE_ACTIVITY;
 
+import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Activity;
+import org.apache.openmeetings.web.app.Client.Pod;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.sidebar.RoomSidebar;
-import org.apache.openmeetings.web.room.sidebar.RoomSidebar.Pod;
 import org.apache.openmeetings.web.room.sidebar.icon.ClientIcon;
 
 public abstract class RoomActivityIcon extends ClientIcon {
@@ -44,7 +45,8 @@ public abstract class RoomActivityIcon e
 	}
 
 	protected boolean visible() {
-		return RoomSidebar.activityAllowed(client, activity, room.getRoom());
+		return Room.Type.interview != room.getRoom().getType()
+				&& RoomSidebar.activityAllowed(client, activity, room.getRoom());
 	}
 
 	@Override