Author: solomax
Date: Thu Apr 21 08:21:20 2016
New Revision: 1740251

URL: http://svn.apache.org/viewvc?rev=1740251&view=rev
Log:
[OPENMEETINGS-1045] start/stop sharing is being tracked

Added:
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
Removed:
    
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/plugins/
Modified:
    
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.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/main.lzx
    
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
    
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/webapp/css/room.css
    
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
    
openmeetings/application/trunk/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 Thu Apr 21 08:21:20 2016
@@ -41,6 +41,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.CalendarPatterns;
+import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.util.message.RoomMessage;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.Red5;
@@ -94,7 +96,7 @@ public class RecordingService implements
                try {
                        log.debug("##REC:: recordMeetingStream ::");
 
-                       Long room_id = client.getRoomId();
+                       Long roomId = client.getRoomId();
 
                        Date now = new Date();
 
@@ -114,7 +116,7 @@ public class RecordingService implements
                        recording.setComment(comment);
                        recording.setInterview(isInterview);
 
-                       recording.setRoomId(room_id);
+                       recording.setRoomId(roomId);
                        recording.setRecordStart(now);
 
                        recording.setWidth(client.getVWidth());
@@ -139,7 +141,7 @@ public class RecordingService implements
                                                Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
 
                                                // Send every user a 
notification that the recording did start
-                                               ((IServiceCapableConnection) 
conn).invoke("startedRecording", new Object[] { client }, this);
+                                               
scopeApplicationAdapter.broadcastRoom(new TextRoomMessage(roomId, ownerId, 
RoomMessage.Type.recordingStarted, client.getPublicSID()));
 
                                                // If its the recording client 
we need another type of Meta Data
                                                if (rcl.isScreenClient()) {
@@ -304,9 +306,10 @@ public class RecordingService implements
                }
        }
 
-       public Long stopRecordAndSave(IScope scope, Client currentClient, Long 
storedRecordingId) {
+       public Long stopRecordAndSave(IScope scope, Client client, Long 
storedRecordingId) {
                try {
-                       log.debug("stopRecordAndSave " + 
currentClient.getUsername() + "," + currentClient.getUserip());
+                       log.debug("stopRecordAndSave " + client.getUsername() + 
"," + client.getUserip());
+                       scopeApplicationAdapter.broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.recordingStoped, client.getPublicSID()));
 
                        // get all stream and stop recording them
                        for (IConnection conn : scope.getClientConnections()) {
@@ -338,7 +341,7 @@ public class RecordingService implements
                                }
                        }
                        // Store to database
-                       Long recordingId = currentClient.getRecordingId();
+                       Long recordingId = client.getRecordingId();
 
                        // In the Case of an Interview the stopping client does 
not mean
                        // that its actually the recording client
@@ -350,10 +353,10 @@ public class RecordingService implements
                                recordingDao.updateEndTime(recordingId, new 
Date());
 
                                // Reset values
-                               currentClient.setRecordingId(null);
-                               currentClient.setIsRecording(false);
+                               client.setRecordingId(null);
+                               client.setIsRecording(false);
 
-                               
sessionManager.updateClientByStreamId(currentClient.getStreamid(), 
currentClient, false, null);
+                               
sessionManager.updateClientByStreamId(client.getStreamid(), client, false, 
null);
                                log.debug("recordingConverterTask ", 
recordingConverterTask);
 
                                Recording recording = 
recordingDao.get(recordingId);

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=1740251&r1=1740250&r2=1740251&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
 Thu Apr 21 08:21:20 2016
@@ -62,6 +62,12 @@ import org.apache.openmeetings.util.Init
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.util.Version;
+import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
+import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.adapter.ApplicationAdapter;
 import org.red5.server.api.IClient;
@@ -232,6 +238,7 @@ public class ScopeApplicationAdapter ext
                                        client.setStartStreaming(false);
                                        //Send message to all users
                                        
sendMessageToCurrentScope("stopScreenSharingMessage", client, false);
+                                       broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStoped, client.getStreamPublishName()));
                                        
                                        returnMap.put("result", 
"stopSharingOnly");
                                }
@@ -241,8 +248,6 @@ public class ScopeApplicationAdapter ext
                                        client.setIsRecording(false);
                                        
                                        returnMap.put("result", 
"stopRecordingOnly");
-                                       //Send message to all users
-                                       
sendMessageToCurrentScope("stopRecordingMessage", client, false);
 
                                        
recordingService.stopRecordAndSave(current.getScope(), client, null);
                                }
@@ -351,6 +356,7 @@ public class ScopeApplicationAdapter ext
                                                
                                                //Send message to all users
                                                
sendMessageToCurrentScope("newScreenSharing", client, false);
+                                               broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStarted, client.getStreamPublishName()));
                                        } else {
                                                log.warn("Streaming is already 
started for the client id=" + client.getId() + ". Second request is ignored.");
                                        }
@@ -503,50 +509,55 @@ public class ScopeApplicationAdapter ext
         * This function is kind of private/protected as the client won't be 
able 
         * to call it with proper values.
         * 
-        * @param currentClient
-        * @param currentScope
+        * @param client
+        * @param scope
         */
-       public void roomLeaveByScope(Client currentClient, IScope currentScope, 
boolean removeUserFromSessionList) {
+       public void roomLeaveByScope(Client client, IScope scope, boolean 
removeUserFromSessionList) {
                try {
-                       log.debug("currentClient " + currentClient);
-                       Long roomId = currentClient.getRoomId();
+                       log.debug("currentClient " + client);
+                       Long roomId = client.getRoomId();
+                       
+                       if (client.isScreenClient() && 
client.isStartStreaming()) {
+                               //TODO check others/find better way
+                               broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStoped, client.getStreamPublishName()));
+                       }
 
                        // Log the User
                        conferenceLogDao.add(ConferenceLog.Type.roomLeave,
-                                       currentClient.getUserId(), 
currentClient.getStreamid(),
-                                       roomId, currentClient.getUserip(), "");
+                                       client.getUserId(), 
client.getStreamid(),
+                                       roomId, client.getUserip(), "");
 
                        // Remove User from Sync List's
                        if (roomId != null) {
-                               
whiteBoardService.removeUserFromAllLists(currentScope, currentClient);
+                               whiteBoardService.removeUserFromAllLists(scope, 
client);
                        }
 
-                       log.debug("removing Username " + 
currentClient.getUsername() + " "
-                                       + currentClient.getConnectedSince() + " 
streamid: "
-                                       + currentClient.getStreamid());
+                       log.debug("removing Username " + client.getUsername() + 
" "
+                                       + client.getConnectedSince() + " 
streamid: "
+                                       + client.getStreamid());
 
                        // stop and save any recordings
-                       if (currentClient.getIsRecording()) {
+                       if (client.getIsRecording()) {
                                log.debug("*** roomLeave Current Client is 
Recording - stop that");
-                               if (currentClient.getInterviewPodId() != null) {
+                               if (client.getInterviewPodId() != null) {
                                        //interview, TODO need better check
-                                       _stopInterviewRecording(currentClient, 
currentScope);
+                                       _stopInterviewRecording(client, scope);
                                } else {
-                                       
recordingService.stopRecordAndSave(currentScope, currentClient, null);
+                                       
recordingService.stopRecordAndSave(scope, client, null);
 
                                        // set to true and overwrite the 
default one cause otherwise no
                                        // notification is send
-                                       currentClient.setIsRecording(true);
+                                       client.setIsRecording(true);
                                }
                        }
 
                        // Notify all clients of the same currentScope (room) 
with domain
                        // and room except the current disconnected cause it 
could throw an exception
-                       log.debug("currentScope " + currentScope);
+                       log.debug("currentScope " + scope);
 
-                       if (currentScope != null && 
currentScope.getClientConnections() != null) {
+                       if (scope != null && scope.getClientConnections() != 
null) {
                                // Notify Users of the current Scope
-                               for (IConnection cons : 
currentScope.getClientConnections()) {
+                               for (IConnection cons : 
scope.getClientConnections()) {
                                        if (cons != null && cons instanceof 
IServiceCapableConnection) {
                                                log.debug("sending 
roomDisconnect to {}  client id {}", cons, cons.getClient().getId());
 
@@ -559,16 +570,16 @@ public class ScopeApplicationAdapter ext
                                                }
                                                
                                                //Do not send back to sender, 
but actually all other clients should receive this message swagner 01.10.2009
-                                               if 
(!currentClient.getStreamid().equals(rcl.getStreamid())) {
+                                               if 
(!client.getStreamid().equals(rcl.getStreamid())) {
                                                        // add Notification if 
another user isrecording
-                                                       
log.debug("###########[roomLeave]");
+                                                       
log.debug("###########[roomLeaveByScope]");
                                                        if 
(rcl.getIsRecording()) {
                                                                log.debug("*** 
roomLeave Any Client is Recording - stop that");
-                                                               
recordingService.stopRecordingShowForClient(cons, currentClient);
+                                                               
recordingService.stopRecordingShowForClient(cons, client);
                                                        }
                                                        
                                                        boolean isScreen = 
rcl.isScreenClient();
-                                                       if (isScreen && 
currentClient.getPublicSID().equals(rcl.getStreamPublishName())) {
+                                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
                                                                //going to 
terminate screen sharing started by this client
                                                                
((IServiceCapableConnection) cons).invoke("stopStream", new Object[] { },this);
                                                                continue;
@@ -578,7 +589,7 @@ public class ScopeApplicationAdapter ext
                                                        }
                                                        
                                                        // Send to all 
connected users
-                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
currentClient },this);
+                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
client },this);
                                                        log.debug("sending 
roomDisconnect to " + cons);
                                                }
                                        }
@@ -586,7 +597,7 @@ public class ScopeApplicationAdapter ext
                        }
 
                        if (removeUserFromSessionList) {
-                               
sessionManager.removeClient(currentClient.getStreamid(), null);
+                               
sessionManager.removeClient(client.getStreamid(), null);
                        }
                } catch (Exception err) {
                        log.error("[roomLeaveByScope]", err);
@@ -2043,7 +2054,6 @@ public class ScopeApplicationAdapter ext
                        interviewStatus.put("action", "stop");
 
                        sendMessageToCurrentScope("interviewStatus", 
interviewStatus, true);
-                       sendMessageToCurrentScope("stopRecordingMessage", 
currentClient, true);
                        return true;
 
                } catch (Exception err) {
@@ -2200,4 +2210,16 @@ public class ScopeApplicationAdapter ext
 
                sendMessageToCurrentScope("addNewUser", currentClient, false);
        }
+       
+       public void broadcastRoom(RoomMessage msg) {
+               log.debug("Sending WebSocket message: {} {}", msg.getType(), 
msg instanceof TextRoomMessage ? ((TextRoomMessage)msg).getText() : "");
+               Application app = 
Application.get(OpenmeetingsVariables.wicketApplicationName);
+               WebSocketSettings settings = WebSocketSettings.Holder.get(app);
+               IWebSocketConnectionRegistry registry = 
settings.getConnectionRegistry();
+               for (IWebSocketConnection wc : registry.getConnections(app)) {
+                       if (wc != null && wc.isOpen()) {
+                               wc.sendMessage(msg);
+                       }
+               }
+       }
 }

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=1740251&r1=1740250&r2=1740251&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
 Thu Apr 21 08:21:20 2016
@@ -179,7 +179,6 @@
                client.sendSyncCompleteFlag = this.sendSyncCompleteFlag;
                client.sendObjectSyncFlag = this.sendObjectSyncFlag;
                client.sendObjectSyncCompleteFlag = 
this.sendObjectSyncCompleteFlag;
-               client.startedRecording = this.startedRecording;
                client.loadWmlToWhiteboardById = this.loadWmlToWhiteboardById;
                client.newMessageByRoomAndDomain = 
this.newMessageByRoomAndDomain;
                client.interviewStatus = this.interviewStatus;
@@ -190,7 +189,6 @@
                client.setNewModeratorByList = this.setNewModeratorByList;
                client.newScreenSharing = this.newScreenSharing;
                client.stopScreenSharingMessage = this.stopScreenSharingMessage;
-               client.stopRecordingMessage = this.stopRecordingMessage;
                client.stopPublishingMessage = this.stopPublishingMessage;
                client.newRed5ScreenCursor = this.newRed5ScreenCursor;
                client.nickNameSet = this.nickNameSet;
@@ -783,12 +781,6 @@
                ]]>
                </method>
                
-               <method name="stopRecordingMessage" args="value">
-                       //The onResult-Handler will be called be the 
rtmpconnection
-                       canvas._mymod.recordingUser = null;
-                       canvas._mymod.setMessage();                             
 
-               </method>
-               
                <method name="stopPublishingMessage" args="value">
                        //The onResult-Handler will be called be the 
rtmpconnection
                        canvas._mymod.publishingObj = null;
@@ -1331,12 +1323,6 @@
                ]]>
                </method>          
                
-       <method name="startedRecording" args="value">
-               if ($debug) Debug.write("startedRecording: ",value);
-               canvas._mymod.recordingUser = value;
-               canvas._mymod.setMessage();
-       </method>
-       
        <netRemoteCallHib name="checkLzRecording" 
funcname="recordingservice.checkLzRecording" >          
                <handler name="ondata" args="value">
                        if ($debug) Debug.write("checkLzRecording: ",value);

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
 Thu Apr 21 08:21:20 2016
@@ -43,7 +43,6 @@
        <include href="base/" /><!-- attributes,methods,datasets,are moved into 
/base -->
        <include href="resources/" /> 
        <include href="modules/" />
-       <include href="plugins/" />  
        <include href="testVideoObject.lzx" />
        <include href="video/" />
        <include href="screensharing/" />

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 Thu Apr 21 08:21:20 2016
@@ -31,9 +31,15 @@ public class RoomMessage implements IWeb
                , roomExit
                , roomClosed
                , pollCreated
+               , recordingStarted
+               , recordingStoped
+               , sharingStarted
+               , sharingStoped
                , rightUpdated
                , activityRemove
                , requestRightModerator
+               , requestRightWb
+               , requestRightAv
        }
        private final Date timestamp;
        private final String uid;

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
 Thu Apr 21 08:21:20 2016
@@ -38,5 +38,5 @@ public abstract class OmButton extends B
                });
        }
        
-       protected abstract void onClick(AjaxRequestTarget target); 
+       public abstract void onClick(AjaxRequestTarget target); 
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 Thu Apr 21 08:21:20 2016
@@ -106,10 +106,17 @@ public class RoomPanel extends BasePanel
        private RoomMenuPanel menu;
        private RoomSidebar sidebar;
        private ActivitiesPanel activities;
+       private String sharingUser = null;
+       private String recordingUser = null;
+       private String publishingUser = null; //TODO add
        
        public RoomPanel(String id, Room r) {
                super(id);
                this.r = r;
+               //TODO check here and set 
+               //private String recordingUser = null;
+               //private String sharingUser = null;
+               //private String publishingUser = null;
        }
 
        @Override
@@ -214,6 +221,29 @@ public class RoomPanel extends BasePanel
                                                if (getUserId() != 
m.getUserId()) {
                                                        
menu.pollCreated(handler);
                                                }
+                                               break;
+                                       case recordingStoped:
+                                               //TODO check recordingUser == 
((TextRoomMessage)m).getText();
+                                               recordingUser = null;
+                                               menu.update(handler);
+                                               break;
+                                       case recordingStarted:
+                                       {
+                                               recordingUser = 
((TextRoomMessage)m).getText();
+                                               menu.update(handler);
+                                       }
+                                               break;
+                                       case sharingStoped:
+                                               //TODO check sharingUser == 
((TextRoomMessage)m).getText();
+                                               sharingUser = null;
+                                               menu.update(handler);
+                                               break;
+                                       case sharingStarted:
+                                       {
+                                               sharingUser = 
((TextRoomMessage)m).getText();
+                                               menu.update(handler);
+                                       }
+                                               break;
                                        case rightUpdated:
                                                sidebar.updateUsers(handler);
                                                menu.update(handler);
@@ -233,7 +263,7 @@ public class RoomPanel extends BasePanel
                                                roomClosed.open(handler);
                                                break;
                                        case requestRightModerator:
-                                               if (isModerator(getUserId(), 
r.getId())) {
+                                               if (isModerator(getUserId(), 
r.getId()) && !isModerator(m.getUserId(), r.getId())) {
                                                        TextRoomMessage tm = 
(TextRoomMessage)m;
                                                        activities.add(new 
Activity(tm.getText(), m.getUserId(), Activity.Type.requestRightModerator), 
handler);
                                                }
@@ -244,6 +274,12 @@ public class RoomPanel extends BasePanel
                                                activities.remove(tm.getText(), 
handler);
                                        }
                                                break;
+                                       case requestRightAv:
+                                               break;
+                                       case requestRightWb:
+                                               break;
+                                       default:
+                                               break;
                                }
                        }
                }
@@ -364,4 +400,16 @@ public class RoomPanel extends BasePanel
        public ActivitiesPanel getActivities() {
                return activities;
        }
+       
+       public String getSharingUser() {
+               return sharingUser;
+       }
+
+       public String getRecordingUser() {
+               return recordingUser;
+       }
+
+       public String getPublishingUser() {
+               return publishingUser;
+       }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 Thu Apr 21 08:21:20 2016
@@ -21,7 +21,7 @@ function activitiesClosed(activities) {
        return activities.height() < 24;
 }
 function openActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (activitiesClosed(activities)) {
                $('.control.block .ui-icon', 
activities).removeClass('ui-icon-carat-1-n').addClass('ui-icon-carat-1-s');
                $('.control.block', 
activities).removeClass('ui-state-highlight');
@@ -29,21 +29,21 @@ function openActivities() {
        }
 }
 function closeActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (!activitiesClosed(activities)) {
                $('.control.block .ui-icon', 
activities).removeClass('ui-icon-carat-1-s').addClass('ui-icon-carat-1-n');
                activities.animate({height: closedHeight}, 1000);
        }
 }
 function toggleActivities() {
-       if (activitiesClosed($('#activitiesPanel'))) {
+       if (activitiesClosed($('#activities'))) {
                openActivities();
        } else {
                closeActivities();
        }
 }
 function hightlightActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (activitiesClosed(activities)) {
                $('.control.block', activities).addClass('ui-state-highlight');
        }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
 Thu Apr 21 08:21:20 2016
@@ -24,7 +24,6 @@
        <div class="room menu right">
                <span wicket:id="ask" class="icon ask"></span>
                <span wicket:id="share" class="icon share"></span>
-               <span wicket:id="recording" class="room recording"></span>
                <span wicket:id="roomName" class="room name"></span>
                <span wicket:id="demo" class="ui-state-error room demo"></span>
        </div>

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 Thu Apr 21 08:21:20 2016
@@ -25,11 +25,14 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.room.PollDao;
+import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
@@ -67,6 +70,13 @@ public class RoomMenuPanel extends Panel
        private final PollResultsDialog pollResults;
        private final MenuPanel menuPanel;
        private final StartSharingButton shareBtn;
+       private final Label roomName;
+       private static ThreadLocal<DateFormat> df = new 
ThreadLocal<DateFormat>() {
+               @Override
+               protected DateFormat initialValue() {
+                       return new SimpleDateFormat("dd.MM.yyyy HH:mm");
+               };
+       };
        private final OmButton askBtn = new OmButton("ask") {
                private static final long serialVersionUID = 1L;
                {
@@ -74,7 +84,7 @@ public class RoomMenuPanel extends Panel
                        setVisible(false);
                }
                @Override
-               protected void onClick(AjaxRequestTarget target) {
+               public void onClick(AjaxRequestTarget target) {
                        RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightModerator, room.getClient().getUid()));
                }
        };
@@ -106,9 +116,30 @@ public class RoomMenuPanel extends Panel
                        shareBtn.onClick(target);
                }
        };
-       private final RoomMenuItem applyModerMenuItem = new 
RoomMenuItem(Application.getString(784), Application.getString(1481), false);
-       private final RoomMenuItem applyWbMenuItem = new 
RoomMenuItem(Application.getString(785), Application.getString(1492), false);
-       private final RoomMenuItem applyAvMenuItem = new 
RoomMenuItem(Application.getString(786), Application.getString(1482), false);
+       private final RoomMenuItem applyModerMenuItem = new 
RoomMenuItem(Application.getString(784), Application.getString(1481), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       askBtn.onClick(target);
+               }
+       };
+       private final RoomMenuItem applyWbMenuItem = new 
RoomMenuItem(Application.getString(785), Application.getString(1492), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightWb, room.getClient().getUid()));
+               }
+       };
+       private final RoomMenuItem applyAvMenuItem = new 
RoomMenuItem(Application.getString(786), Application.getString(1482), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightAv, room.getClient().getUid()));
+               }
+       };
        private final RoomMenuItem pollCreateMenuItem = new 
RoomMenuItem(Application.getString(24), Application.getString(1483), false) {
                private static final long serialVersionUID = 1L;
 
@@ -146,8 +177,7 @@ public class RoomMenuPanel extends Panel
                setVisible(!r.isHidden(RoomElement.TopBar));
                add((menuPanel = new MenuPanel("menu", 
getMenu())).setVisible(isVisible()));
                add(askBtn);
-               add(new Label("roomName", r.getName()));
-               add(new Label("recording", "Recording 
started").setVisible(false)); //FIXME add/remove
+               add((roomName = new Label("roomName", 
r.getName())).setOutputMarkupId(true));
                add(shareBtn = new StartSharingButton("share", 
room.getClient()));
                add(invite = new InvitationDialog("invite", 
room.getRoom().getId()));
                add(createPoll = new CreatePollDialog("createPoll", 
room.getRoom().getId()));
@@ -207,7 +237,7 @@ public class RoomMenuPanel extends Panel
                actionsMenu.getItems().add(pollResultMenuItem); //FIXME 
enable/disable
                actionsMenu.getItems().add(pollVoteMenuItem); //FIXME 
enable/disable
                actionsMenu.getItems().add(sipDialerMenuItem);
-               actionsMenu.getItems().add(new 
RoomMenuItem(Application.getString(1126), Application.getString(1490)));
+               //TODO seems need to be removed actionsMenu.getItems().add(new 
RoomMenuItem(Application.getString(1126), Application.getString(1490)));
                menu.add(actionsMenu);
                return menu;
        }
@@ -226,7 +256,8 @@ public class RoomMenuPanel extends Panel
                boolean moder = 
room.getClient().hasRight(Client.Right.moderator);
                inviteMenuItem.setEnabled(notExternalUser && moder);
                //TODO add check "sharing started"
-               boolean shareVisible = Room.Type.interview != r.getType() && 
!r.isHidden(RoomElement.ScreenSharing) && r.isAllowRecording() && moder;
+               boolean shareVisible = Room.Type.interview != r.getType() && 
!r.isHidden(RoomElement.ScreenSharing)
+                               && r.isAllowRecording() && 
room.getClient().hasRight(Client.Right.share) && room.getSharingUser() == null;
                shareMenuItem.setEnabled(shareVisible);
                //FIXME TODO apply* should be enabled if moder is in room
                applyModerMenuItem.setEnabled(!moder);
@@ -238,6 +269,26 @@ public class RoomMenuPanel extends Panel
                //TODO sip menus
                menuPanel.update(handler);
                //FIXME TODO askBtn should be visible if moder is in room
+               StringBuilder roomClass = new StringBuilder("room name");
+               StringBuilder roomTitle = new StringBuilder();
+               if (room.getRecordingUser() != null) {
+                       org.apache.openmeetings.db.entity.room.Client recUser = 
getBean(ISessionManager.class).getClientByPublicSID(room.getRecordingUser(), 
null); //TODO check server
+                       if (recUser != null) {
+                               roomTitle.append(String.format("%s %s %s %s 
%s", getString("419")
+                                               , recUser.getUsername(), 
recUser.getFirstname(), recUser.getLastname(), 
df.get().format(recUser.getConnectedSince())));
+                               roomClass.append(" screen");
+                       }
+                       org.apache.openmeetings.db.entity.room.Client pubUser = 
getBean(ISessionManager.class).getClientByPublicSID(room.getPublishingUser(), 
null); //TODO check server
+                       if (pubUser != null) {
+                               if (recUser != null) {
+                                       roomTitle.append('\n');
+                               }
+                               roomTitle.append(String.format("%s %s %s %s 
%s", getString("1504")
+                                               , recUser.getUsername(), 
pubUser.getFirstname(), pubUser.getLastname(), "URL")); //TODO add URL
+                               roomClass.append(" screen");
+                       }
+               }
+               handler.add(roomName.add(AttributeAppender.replace("class", 
roomClass), AttributeAppender.replace("title", roomTitle)));
                handler.add(askBtn.setVisible(!moder && 
r.isAllowUserQuestions()));
                handler.add(shareBtn.setVisible(shareVisible));
        }
@@ -245,6 +296,7 @@ public class RoomMenuPanel extends Panel
        public void pollCreated(IPartialPageRequestHandler handler) {
                vote.updateModel(handler);
                vote.open(handler);
+               update(handler);
        }
        
        public void exit(IPartialPageRequestHandler handler) {

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 Thu Apr 21 08:21:20 2016
@@ -84,7 +84,7 @@ public class StartSharingButton extends
        }
        
        @Override
-       protected void onClick(AjaxRequestTarget target) {
+       public void onClick(AjaxRequestTarget target) {
                //TODO deny download in case other screen sharing is in progress
                String app = "";
                try (InputStream jnlp = 
getClass().getClassLoader().getResourceAsStream("APPLICATION.jnlp")) {

Added: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html?rev=1740251&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
 (added)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
 Thu Apr 21 08:21:20 2016
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <span wicket:id="status" class="ui-icon align-right"></span>
+       <span class="ui-icon align-right clickable restart" 
wicket:message="title:610"></span>
+       <div wicket:id="name" class="user name"></div>
+       <span class="ui-icon align-right clickable audio-activity" 
wicket:message="title:372"></span>
+       <div wicket:id="actions" class="user actions">
+               <span class="ui-icon align-left clickable moderator-right" 
wicket:message="title:676"></span>
+               <span class="ui-icon align-left clickable wb-right" 
wicket:message="title:611"></span>
+               <span class="ui-icon align-left clickable screen-share-right" 
wicket:message="title:1067"></span>
+               <span class="ui-icon align-left clickable remote-control-right" 
wicket:message="title:1078"></span>
+               <span class="ui-icon align-left clickable audio-right" 
wicket:message="title:1604"></span>
+               <span class="ui-icon align-left clickable camera-right" 
wicket:message="title:683"></span>
+               <span class="ui-icon align-left clickable global-mute" 
wicket:message="title:1384"></span>
+               <span class="ui-icon align-left clickable exclsv-audio" 
wicket:message="title:1424"></span>
+               <span class="ui-icon align-left clickable kick" 
wicket:message="title:1213"></span>
+               <span wicket:id="privateChat" class="ui-icon align-right 
clickable private-chat" wicket:message="title:1493" 
onclick="startPrivateChat($(this));"></span>
+               <div class="clear"></div>
+       </div>
+</wicket:panel>
+</html>

Added: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java?rev=1740251&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
 (added)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
 Thu Apr 21 08:21:20 2016
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.room.sidebar;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.room.Room.RoomElement;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.panel.Panel;
+
+public class RoomClientPanel extends Panel {
+       private static final long serialVersionUID = 1L;
+
+       public RoomClientPanel(String id, ListItem<Client> item, final 
RoomPanel room) {
+               super(id);
+               setRenderBodyOnly(true);
+               Client c = item.getModelObject();
+               item.setMarkupId(String.format("user%s", c.getUid()));
+               String status = null, statusTitle = null;
+               if (c.hasRight(Right.moderator)) {
+                       status = "status-mod";
+                       statusTitle = "679";
+               } else if (c.hasRight(Right.whiteBoard)) {
+                       status = "status-wb";
+                       statusTitle = "678";
+               } else {
+                       status = "status-user";
+                       statusTitle = "677";
+               }
+               add(new 
WebMarkupContainer("status").add(AttributeAppender.append("class", status), 
AttributeAppender.replace("title", getString(statusTitle))));
+               User u = getBean(UserDao.class).get(c.getUserId());
+               add(new Label("name", u.getFirstname() + " " + 
u.getLastname()));
+               add(AttributeAppender.append("data-userid", c.getUserId()));
+               WebMarkupContainer actions = new WebMarkupContainer("actions");
+               actions.add(new 
WebMarkupContainer("privateChat").setVisible(!room.getRoom().isHidden(RoomElement.Chat)
 && !getUserId().equals(c.getUserId())));
+               if (room.getClient() != null) {
+                       
actions.setVisible(room.getClient().hasRight(Right.moderator));
+                       if (c.getUid().equals(room.getClient().getUid())) {
+                               item.add(AttributeAppender.append("class", 
"current"));
+                       }
+               } else {
+                       actions.setVisible(false);
+               }
+               add(actions);
+       }
+}

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
 Thu Apr 21 08:21:20 2016
@@ -25,23 +25,7 @@
        <wicket:fragment wicket:id="user-panel">
                <div class="user list">
                        <div wicket:id="user" class="user ui-corner-all 
ui-widget-content">
-                               <span wicket:id="status" class="ui-icon 
align-right"></span>
-                               <span class="ui-icon align-right clickable 
restart" wicket:message="title:610"></span>
-                               <div wicket:id="name" class="user name"></div>
-                               <span class="ui-icon align-right clickable 
audio-activity" wicket:message="title:372"></span>
-                               <div wicket:id="actions" class="user actions">
-                                       <span class="ui-icon align-left 
clickable moderator-right" wicket:message="title:676"></span>
-                                       <span class="ui-icon align-left 
clickable wb-right" wicket:message="title:611"></span>
-                                       <span class="ui-icon align-left 
clickable screen-share-right" wicket:message="title:1067"></span>
-                                       <span class="ui-icon align-left 
clickable remote-control-right" wicket:message="title:1078"></span>
-                                       <span class="ui-icon align-left 
clickable audio-right" wicket:message="title:1604"></span>
-                                       <span class="ui-icon align-left 
clickable camera-right" wicket:message="title:683"></span>
-                                       <span class="ui-icon align-left 
clickable global-mute" wicket:message="title:1384"></span>
-                                       <span class="ui-icon align-left 
clickable exclsv-audio" wicket:message="title:1424"></span>
-                                       <span class="ui-icon align-left 
clickable kick" wicket:message="title:1213"></span>
-                                       <span wicket:id="privateChat" 
class="ui-icon align-right clickable private-chat" wicket:message="title:1493" 
onclick="startPrivateChat($(this));"></span>
-                                       <div class="clear"></div>
-                               </div>
+                               <div wicket:id="user"></div>
                        </div>
                </div>
        </wicket:fragment>

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=1740251&r1=1740250&r2=1740251&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
 Thu Apr 21 08:21:20 2016
@@ -18,26 +18,18 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
-import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.getRoomUsers;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Right;
 import org.apache.openmeetings.web.room.RoomPanel;
-import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Fragment;
@@ -56,38 +48,12 @@ public class RoomSidebar extends Panel {
        private final UploadDialog upload;
        private final RoomFilePanel roomFiles;
        private boolean showFiles;
-       private final ListView<RoomClient> users = new 
ListView<RoomClient>("user", new ArrayList<RoomClient>()) {
+       private final ListView<Client> users = new ListView<Client>("user", new 
ArrayList<Client>()) {
                private static final long serialVersionUID = 1L;
 
                @Override
-               protected void populateItem(ListItem<RoomClient> item) {
-                       RoomClient rc = item.getModelObject();
-                       item.setMarkupId(String.format("user%s", 
rc.c.getUid()));
-                       String status = null, statusTitle = null;
-                       if (rc.c.hasRight(Right.moderator)) {
-                               status = "status-mod";
-                               statusTitle = "679";
-                       } else if (rc.c.hasRight(Right.whiteBoard)) {
-                               status = "status-wb";
-                               statusTitle = "678";
-                       } else {
-                               status = "status-user";
-                               statusTitle = "677";
-                       }
-                       item.add(new 
WebMarkupContainer("status").add(AttributeAppender.append("class", status), 
AttributeAppender.replace("title", getString(statusTitle))));
-                       item.add(new Label("name", rc.u.getFirstname() + " " + 
rc.u.getLastname()));
-                       item.add(AttributeAppender.append("data-userid", 
rc.u.getId()));
-                       WebMarkupContainer actions = new 
WebMarkupContainer("actions");
-                       actions.add(new 
WebMarkupContainer("privateChat").setVisible(!room.getRoom().isHidden(RoomElement.Chat)
 && !getUserId().equals(rc.u.getId())));
-                       if (room.getClient() != null) {
-                               
actions.setVisible(room.getClient().hasRight(Right.moderator));
-                               if 
(rc.c.getUid().equals(room.getClient().getUid())) {
-                                       
item.add(AttributeAppender.append("class", "current"));
-                               }
-                       } else {
-                               actions.setVisible(false);
-                       }
-                       item.add(actions);
+               protected void populateItem(ListItem<Client> item) {
+                       item.add(new RoomClientPanel("user", item, room));
                }
        };
        
@@ -137,12 +103,19 @@ public class RoomSidebar extends Panel {
                add(upload = new UploadDialog("upload", room, roomFiles));
        }
        
+       private ListView<Client> updateUsers() {
+               //TODO do we need sort??
+               users.getList().clear();
+               users.getList().addAll(getRoomUsers(room.getRoom().getId()));
+               return users;
+       }
+       
        public class UserFragment extends Fragment {
                private static final long serialVersionUID = 1L;
 
                public UserFragment(String id, String markupId) {
                        super(id, markupId, RoomSidebar.this);
-                       add(users.setList(getUsers()));
+                       add(updateUsers());
                }
        }
        
@@ -155,32 +128,13 @@ public class RoomSidebar extends Panel {
                }
        }
 
-       private List<RoomClient> getUsers() {
-               List<RoomClient> list = new ArrayList<>();
-               for (Client cl : getRoomUsers(room.getRoom().getId())) {
-                       list.add(new RoomClient(cl));
-               }
-               return list;
-       }
-       
-       static class RoomClient implements Serializable {
-               private static final long serialVersionUID = 1L;
-               private final Client c;
-               private final User u;
-               
-               RoomClient(Client c) {
-                       this.c = c;
-                       this.u = getBean(UserDao.class).get(c.getUserId());
-               }
-       }
-       
        private void updateShowFiles() {
                showFiles = !room.getRoom().isHidden(RoomElement.Files) && 
room.getClient().hasRight(Right.whiteBoard);
        }
        
        public void updateUsers(IPartialPageRequestHandler handler) {
                updateShowFiles();
-               users.setList(getUsers());
+               updateUsers();
                handler.add(tabs);
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 Thu Apr 21 08:21:20 2016
@@ -52,11 +52,11 @@
 .room.menu.right .room.name {
        font-weight: bold;
 }
-.room.menu.right .room.demo {
-}
-.room.menu.right .room.recording {
+.room.menu.right .room.name.screen {
        color: red;
 }
+.room.menu.right .room.demo {
+}
 .room.menu.right .icon {
        width: 30px;
        height: 30px;
@@ -171,6 +171,7 @@
 }
 .room.sidebar.left .user.list .user.current {
        font-weight: bold;
+       background: #00FF00;
 }
 .ui-dialog.video, .ui-dialog.video .ui-dialog-titlebar, .ui-dialog.video 
.video.ui-dialog-content {
        padding: 0;

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
 Thu Apr 21 08:21:20 2016
@@ -38,6 +38,7 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
+import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.room.IInvitationManager;
 import org.apache.openmeetings.db.dao.room.InvitationDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
@@ -54,13 +55,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Invitation.MessageType;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
-import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.webservice.error.ServiceException;
-import org.apache.wicket.Application;
-import org.apache.wicket.protocol.ws.WebSocketSettings;
-import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
-import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -92,6 +88,8 @@ public class RoomWebService {
        private ISessionManager sessionManager;
        @Autowired
        private RoomDao roomDao;
+       @Autowired
+       private ScopeApplicationAdapter appAdapter;
 
        /**
         * Returns an Object of Type RoomsList which contains a list of
@@ -318,15 +316,7 @@ public class RoomWebService {
 
                                roomDao.update(room, userId);
 
-                               Application app = 
Application.get(OpenmeetingsVariables.wicketApplicationName);
-                               WebSocketSettings settings = 
WebSocketSettings.Holder.get(app);
-                               IWebSocketConnectionRegistry registry = 
settings.getConnectionRegistry();
-                               RoomMessage cm = new RoomMessage(room.getId(),  
userId,  RoomMessage.Type.roomClosed);
-                               for (IWebSocketConnection wc : 
registry.getConnections(app)) {
-                                       if (wc != null && wc.isOpen()) {
-                                               wc.sendMessage(cm);
-                                       }
-                               }
+                               appAdapter.broadcastRoom(new 
RoomMessage(room.getId(),  userId,  RoomMessage.Type.roomClosed));
 
                                return new ServiceResult(1L, "Closed", 
Type.SUCCESS);
                        } else {

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
 Thu Apr 21 08:21:20 2016
@@ -41,6 +41,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.CalendarPatterns;
+import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.util.message.RoomMessage;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.Red5;
@@ -94,7 +96,7 @@ public class RecordingService implements
                try {
                        log.debug("##REC:: recordMeetingStream ::");
 
-                       Long room_id = client.getRoomId();
+                       Long roomId = client.getRoomId();
 
                        Date now = new Date();
 
@@ -114,7 +116,7 @@ public class RecordingService implements
                        recording.setComment(comment);
                        recording.setInterview(isInterview);
 
-                       recording.setRoomId(room_id);
+                       recording.setRoomId(roomId);
                        recording.setRecordStart(now);
 
                        recording.setWidth(client.getVWidth());
@@ -139,7 +141,7 @@ public class RecordingService implements
                                                Client rcl = 
sessionManager.getClientByStreamId(conn.getClient().getId(), null);
 
                                                // Send every user a 
notification that the recording did start
-                                               ((IServiceCapableConnection) 
conn).invoke("startedRecording", new Object[] { client }, this);
+                                               
scopeApplicationAdapter.broadcastRoom(new TextRoomMessage(roomId, ownerId, 
RoomMessage.Type.recordingStarted, client.getPublicSID()));
 
                                                // If its the recording client 
we need another type of Meta Data
                                                if (rcl.isScreenClient()) {
@@ -304,9 +306,10 @@ public class RecordingService implements
                }
        }
 
-       public Long stopRecordAndSave(IScope scope, Client currentClient, Long 
storedRecordingId) {
+       public Long stopRecordAndSave(IScope scope, Client client, Long 
storedRecordingId) {
                try {
-                       log.debug("stopRecordAndSave " + 
currentClient.getUsername() + "," + currentClient.getUserip());
+                       log.debug("stopRecordAndSave " + client.getUsername() + 
"," + client.getUserip());
+                       scopeApplicationAdapter.broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.recordingStoped, client.getPublicSID()));
 
                        // get all stream and stop recording them
                        for (IConnection conn : scope.getClientConnections()) {
@@ -338,7 +341,7 @@ public class RecordingService implements
                                }
                        }
                        // Store to database
-                       Long recordingId = currentClient.getRecordingId();
+                       Long recordingId = client.getRecordingId();
 
                        // In the Case of an Interview the stopping client does 
not mean
                        // that its actually the recording client
@@ -350,10 +353,10 @@ public class RecordingService implements
                                recordingDao.updateEndTime(recordingId, new 
Date());
 
                                // Reset values
-                               currentClient.setRecordingId(null);
-                               currentClient.setIsRecording(false);
+                               client.setRecordingId(null);
+                               client.setIsRecording(false);
 
-                               
sessionManager.updateClientByStreamId(currentClient.getStreamid(), 
currentClient, false, null);
+                               
sessionManager.updateClientByStreamId(client.getStreamid(), client, false, 
null);
                                log.debug("recordingConverterTask ", 
recordingConverterTask);
 
                                Recording recording = 
recordingDao.get(recordingId);

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=1740251&r1=1740250&r2=1740251&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
 Thu Apr 21 08:21:20 2016
@@ -62,6 +62,12 @@ import org.apache.openmeetings.util.Init
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.util.Version;
+import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.wicket.Application;
+import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
+import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.adapter.ApplicationAdapter;
 import org.red5.server.api.IClient;
@@ -232,6 +238,7 @@ public class ScopeApplicationAdapter ext
                                        client.setStartStreaming(false);
                                        //Send message to all users
                                        
sendMessageToCurrentScope("stopScreenSharingMessage", client, false);
+                                       broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStoped, client.getStreamPublishName()));
                                        
                                        returnMap.put("result", 
"stopSharingOnly");
                                }
@@ -241,8 +248,6 @@ public class ScopeApplicationAdapter ext
                                        client.setIsRecording(false);
                                        
                                        returnMap.put("result", 
"stopRecordingOnly");
-                                       //Send message to all users
-                                       
sendMessageToCurrentScope("stopRecordingMessage", client, false);
 
                                        
recordingService.stopRecordAndSave(current.getScope(), client, null);
                                }
@@ -351,6 +356,7 @@ public class ScopeApplicationAdapter ext
                                                
                                                //Send message to all users
                                                
sendMessageToCurrentScope("newScreenSharing", client, false);
+                                               broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStarted, client.getStreamPublishName()));
                                        } else {
                                                log.warn("Streaming is already 
started for the client id=" + client.getId() + ". Second request is ignored.");
                                        }
@@ -503,50 +509,55 @@ public class ScopeApplicationAdapter ext
         * This function is kind of private/protected as the client won't be 
able 
         * to call it with proper values.
         * 
-        * @param currentClient
-        * @param currentScope
+        * @param client
+        * @param scope
         */
-       public void roomLeaveByScope(Client currentClient, IScope currentScope, 
boolean removeUserFromSessionList) {
+       public void roomLeaveByScope(Client client, IScope scope, boolean 
removeUserFromSessionList) {
                try {
-                       log.debug("currentClient " + currentClient);
-                       Long roomId = currentClient.getRoomId();
+                       log.debug("currentClient " + client);
+                       Long roomId = client.getRoomId();
+                       
+                       if (client.isScreenClient() && 
client.isStartStreaming()) {
+                               //TODO check others/find better way
+                               broadcastRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStoped, client.getStreamPublishName()));
+                       }
 
                        // Log the User
                        conferenceLogDao.add(ConferenceLog.Type.roomLeave,
-                                       currentClient.getUserId(), 
currentClient.getStreamid(),
-                                       roomId, currentClient.getUserip(), "");
+                                       client.getUserId(), 
client.getStreamid(),
+                                       roomId, client.getUserip(), "");
 
                        // Remove User from Sync List's
                        if (roomId != null) {
-                               
whiteBoardService.removeUserFromAllLists(currentScope, currentClient);
+                               whiteBoardService.removeUserFromAllLists(scope, 
client);
                        }
 
-                       log.debug("removing Username " + 
currentClient.getUsername() + " "
-                                       + currentClient.getConnectedSince() + " 
streamid: "
-                                       + currentClient.getStreamid());
+                       log.debug("removing Username " + client.getUsername() + 
" "
+                                       + client.getConnectedSince() + " 
streamid: "
+                                       + client.getStreamid());
 
                        // stop and save any recordings
-                       if (currentClient.getIsRecording()) {
+                       if (client.getIsRecording()) {
                                log.debug("*** roomLeave Current Client is 
Recording - stop that");
-                               if (currentClient.getInterviewPodId() != null) {
+                               if (client.getInterviewPodId() != null) {
                                        //interview, TODO need better check
-                                       _stopInterviewRecording(currentClient, 
currentScope);
+                                       _stopInterviewRecording(client, scope);
                                } else {
-                                       
recordingService.stopRecordAndSave(currentScope, currentClient, null);
+                                       
recordingService.stopRecordAndSave(scope, client, null);
 
                                        // set to true and overwrite the 
default one cause otherwise no
                                        // notification is send
-                                       currentClient.setIsRecording(true);
+                                       client.setIsRecording(true);
                                }
                        }
 
                        // Notify all clients of the same currentScope (room) 
with domain
                        // and room except the current disconnected cause it 
could throw an exception
-                       log.debug("currentScope " + currentScope);
+                       log.debug("currentScope " + scope);
 
-                       if (currentScope != null && 
currentScope.getClientConnections() != null) {
+                       if (scope != null && scope.getClientConnections() != 
null) {
                                // Notify Users of the current Scope
-                               for (IConnection cons : 
currentScope.getClientConnections()) {
+                               for (IConnection cons : 
scope.getClientConnections()) {
                                        if (cons != null && cons instanceof 
IServiceCapableConnection) {
                                                log.debug("sending 
roomDisconnect to {}  client id {}", cons, cons.getClient().getId());
 
@@ -559,16 +570,16 @@ public class ScopeApplicationAdapter ext
                                                }
                                                
                                                //Do not send back to sender, 
but actually all other clients should receive this message swagner 01.10.2009
-                                               if 
(!currentClient.getStreamid().equals(rcl.getStreamid())) {
+                                               if 
(!client.getStreamid().equals(rcl.getStreamid())) {
                                                        // add Notification if 
another user isrecording
-                                                       
log.debug("###########[roomLeave]");
+                                                       
log.debug("###########[roomLeaveByScope]");
                                                        if 
(rcl.getIsRecording()) {
                                                                log.debug("*** 
roomLeave Any Client is Recording - stop that");
-                                                               
recordingService.stopRecordingShowForClient(cons, currentClient);
+                                                               
recordingService.stopRecordingShowForClient(cons, client);
                                                        }
                                                        
                                                        boolean isScreen = 
rcl.isScreenClient();
-                                                       if (isScreen && 
currentClient.getPublicSID().equals(rcl.getStreamPublishName())) {
+                                                       if (isScreen && 
client.getPublicSID().equals(rcl.getStreamPublishName())) {
                                                                //going to 
terminate screen sharing started by this client
                                                                
((IServiceCapableConnection) cons).invoke("stopStream", new Object[] { },this);
                                                                continue;
@@ -578,7 +589,7 @@ public class ScopeApplicationAdapter ext
                                                        }
                                                        
                                                        // Send to all 
connected users
-                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
currentClient },this);
+                                                       
((IServiceCapableConnection) cons).invoke("roomDisconnect", new Object[] { 
client },this);
                                                        log.debug("sending 
roomDisconnect to " + cons);
                                                }
                                        }
@@ -586,7 +597,7 @@ public class ScopeApplicationAdapter ext
                        }
 
                        if (removeUserFromSessionList) {
-                               
sessionManager.removeClient(currentClient.getStreamid(), null);
+                               
sessionManager.removeClient(client.getStreamid(), null);
                        }
                } catch (Exception err) {
                        log.error("[roomLeaveByScope]", err);
@@ -2043,7 +2054,6 @@ public class ScopeApplicationAdapter ext
                        interviewStatus.put("action", "stop");
 
                        sendMessageToCurrentScope("interviewStatus", 
interviewStatus, true);
-                       sendMessageToCurrentScope("stopRecordingMessage", 
currentClient, true);
                        return true;
 
                } catch (Exception err) {
@@ -2200,4 +2210,16 @@ public class ScopeApplicationAdapter ext
 
                sendMessageToCurrentScope("addNewUser", currentClient, false);
        }
+       
+       public void broadcastRoom(RoomMessage msg) {
+               log.debug("Sending WebSocket message: {} {}", msg.getType(), 
msg instanceof TextRoomMessage ? ((TextRoomMessage)msg).getText() : "");
+               Application app = 
Application.get(OpenmeetingsVariables.wicketApplicationName);
+               WebSocketSettings settings = WebSocketSettings.Holder.get(app);
+               IWebSocketConnectionRegistry registry = 
settings.getConnectionRegistry();
+               for (IWebSocketConnection wc : registry.getConnections(app)) {
+                       if (wc != null && wc.isOpen()) {
+                               wc.sendMessage(msg);
+                       }
+               }
+       }
 }

Modified: 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
 Thu Apr 21 08:21:20 2016
@@ -31,9 +31,15 @@ public class RoomMessage implements IWeb
                , roomExit
                , roomClosed
                , pollCreated
+               , recordingStarted
+               , recordingStoped
+               , sharingStarted
+               , sharingStoped
                , rightUpdated
                , activityRemove
                , requestRightModerator
+               , requestRightWb
+               , requestRightAv
        }
        private final Date timestamp;
        private final String uid;

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmButton.java
 Thu Apr 21 08:21:20 2016
@@ -38,5 +38,5 @@ public abstract class OmButton extends B
                });
        }
        
-       protected abstract void onClick(AjaxRequestTarget target); 
+       public abstract void onClick(AjaxRequestTarget target); 
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 Thu Apr 21 08:21:20 2016
@@ -123,10 +123,17 @@ public class RoomPanel extends BasePanel
        private RoomMenuPanel menu;
        private RoomSidebar sidebar;
        private ActivitiesPanel activities;
+       private String sharingUser = null;
+       private String recordingUser = null;
+       private String publishingUser = null; //TODO add
        
        public RoomPanel(String id, Room r) {
                super(id);
                this.r = r;
+               //TODO check here and set 
+               //private String recordingUser = null;
+               //private String sharingUser = null;
+               //private String publishingUser = null;
        }
 
        @Override
@@ -233,6 +240,29 @@ public class RoomPanel extends BasePanel
                                                if (getUserId() != 
m.getUserId()) {
                                                        
menu.pollCreated(handler);
                                                }
+                                               break;
+                                       case recordingStoped:
+                                               //TODO check recordingUser == 
((TextRoomMessage)m).getText();
+                                               recordingUser = null;
+                                               menu.update(handler);
+                                               break;
+                                       case recordingStarted:
+                                       {
+                                               recordingUser = 
((TextRoomMessage)m).getText();
+                                               menu.update(handler);
+                                       }
+                                               break;
+                                       case sharingStoped:
+                                               //TODO check sharingUser == 
((TextRoomMessage)m).getText();
+                                               sharingUser = null;
+                                               menu.update(handler);
+                                               break;
+                                       case sharingStarted:
+                                       {
+                                               sharingUser = 
((TextRoomMessage)m).getText();
+                                               menu.update(handler);
+                                       }
+                                               break;
                                        case rightUpdated:
                                                sidebar.updateUsers(handler);
                                                menu.update(handler);
@@ -252,7 +282,7 @@ public class RoomPanel extends BasePanel
                                                roomClosed.open(handler);
                                                break;
                                        case requestRightModerator:
-                                               if (isModerator(getUserId(), 
r.getId())) {
+                                               if (isModerator(getUserId(), 
r.getId()) && !isModerator(m.getUserId(), r.getId())) {
                                                        TextRoomMessage tm = 
(TextRoomMessage)m;
                                                        activities.add(new 
Activity(tm.getText(), m.getUserId(), Activity.Type.requestRightModerator), 
handler);
                                                }
@@ -263,6 +293,12 @@ public class RoomPanel extends BasePanel
                                                activities.remove(tm.getText(), 
handler);
                                        }
                                                break;
+                                       case requestRightAv:
+                                               break;
+                                       case requestRightWb:
+                                               break;
+                                       default:
+                                               break;
                                }
                        }
                }
@@ -395,4 +431,16 @@ public class RoomPanel extends BasePanel
        public ActivitiesPanel getActivities() {
                return activities;
        }
+       
+       public String getSharingUser() {
+               return sharingUser;
+       }
+
+       public String getRecordingUser() {
+               return recordingUser;
+       }
+
+       public String getPublishingUser() {
+               return publishingUser;
+       }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 Thu Apr 21 08:21:20 2016
@@ -21,7 +21,7 @@ function activitiesClosed(activities) {
        return activities.height() < 24;
 }
 function openActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (activitiesClosed(activities)) {
                $('.control.block .ui-icon', 
activities).removeClass('ui-icon-carat-1-n').addClass('ui-icon-carat-1-s');
                $('.control.block', 
activities).removeClass('ui-state-highlight');
@@ -29,21 +29,21 @@ function openActivities() {
        }
 }
 function closeActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (!activitiesClosed(activities)) {
                $('.control.block .ui-icon', 
activities).removeClass('ui-icon-carat-1-s').addClass('ui-icon-carat-1-n');
                activities.animate({height: closedHeight}, 1000);
        }
 }
 function toggleActivities() {
-       if (activitiesClosed($('#activitiesPanel'))) {
+       if (activitiesClosed($('#activities'))) {
                openActivities();
        } else {
                closeActivities();
        }
 }
 function hightlightActivities() {
-       var activities = $('#activitiesPanel');
+       var activities = $('#activities');
        if (activitiesClosed(activities)) {
                $('.control.block', activities).addClass('ui-state-highlight');
        }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
 Thu Apr 21 08:21:20 2016
@@ -24,7 +24,6 @@
        <div class="room menu right">
                <span wicket:id="ask" class="icon ask"></span>
                <span wicket:id="share" class="icon share"></span>
-               <span wicket:id="recording" class="room recording"></span>
                <span wicket:id="roomName" class="room name"></span>
                <span wicket:id="demo" class="ui-state-error room demo"></span>
        </div>

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
 Thu Apr 21 08:21:20 2016
@@ -25,11 +25,14 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.room.PollDao;
+import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
@@ -67,6 +70,13 @@ public class RoomMenuPanel extends Panel
        private final PollResultsDialog pollResults;
        private final MenuPanel menuPanel;
        private final StartSharingButton shareBtn;
+       private final Label roomName;
+       private static ThreadLocal<DateFormat> df = new 
ThreadLocal<DateFormat>() {
+               @Override
+               protected DateFormat initialValue() {
+                       return new SimpleDateFormat("dd.MM.yyyy HH:mm");
+               };
+       };
        private final OmButton askBtn = new OmButton("ask") {
                private static final long serialVersionUID = 1L;
                {
@@ -74,7 +84,7 @@ public class RoomMenuPanel extends Panel
                        setVisible(false);
                }
                @Override
-               protected void onClick(AjaxRequestTarget target) {
+               public void onClick(AjaxRequestTarget target) {
                        RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightModerator, room.getClient().getUid()));
                }
        };
@@ -106,9 +116,30 @@ public class RoomMenuPanel extends Panel
                        shareBtn.onClick(target);
                }
        };
-       private final RoomMenuItem applyModerMenuItem = new 
RoomMenuItem(Application.getString(784), Application.getString(1481), false);
-       private final RoomMenuItem applyWbMenuItem = new 
RoomMenuItem(Application.getString(785), Application.getString(1492), false);
-       private final RoomMenuItem applyAvMenuItem = new 
RoomMenuItem(Application.getString(786), Application.getString(1482), false);
+       private final RoomMenuItem applyModerMenuItem = new 
RoomMenuItem(Application.getString(784), Application.getString(1481), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       askBtn.onClick(target);
+               }
+       };
+       private final RoomMenuItem applyWbMenuItem = new 
RoomMenuItem(Application.getString(785), Application.getString(1492), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightWb, room.getClient().getUid()));
+               }
+       };
+       private final RoomMenuItem applyAvMenuItem = new 
RoomMenuItem(Application.getString(786), Application.getString(1482), false) {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public void onClick(AjaxRequestTarget target) {
+                       RoomPanel.broadcast(new 
TextRoomMessage(room.getRoom().getId(), getUserId(), 
RoomMessage.Type.requestRightAv, room.getClient().getUid()));
+               }
+       };
        private final RoomMenuItem pollCreateMenuItem = new 
RoomMenuItem(Application.getString(24), Application.getString(1483), false) {
                private static final long serialVersionUID = 1L;
 
@@ -146,8 +177,7 @@ public class RoomMenuPanel extends Panel
                setVisible(!r.isHidden(RoomElement.TopBar));
                add((menuPanel = new MenuPanel("menu", 
getMenu())).setVisible(isVisible()));
                add(askBtn);
-               add(new Label("roomName", r.getName()));
-               add(new Label("recording", "Recording 
started").setVisible(false)); //FIXME add/remove
+               add((roomName = new Label("roomName", 
r.getName())).setOutputMarkupId(true));
                add(shareBtn = new StartSharingButton("share", 
room.getClient()));
                add(invite = new InvitationDialog("invite", 
room.getRoom().getId()));
                add(createPoll = new CreatePollDialog("createPoll", 
room.getRoom().getId()));
@@ -207,7 +237,7 @@ public class RoomMenuPanel extends Panel
                actionsMenu.getItems().add(pollResultMenuItem); //FIXME 
enable/disable
                actionsMenu.getItems().add(pollVoteMenuItem); //FIXME 
enable/disable
                actionsMenu.getItems().add(sipDialerMenuItem);
-               actionsMenu.getItems().add(new 
RoomMenuItem(Application.getString(1126), Application.getString(1490)));
+               //TODO seems need to be removed actionsMenu.getItems().add(new 
RoomMenuItem(Application.getString(1126), Application.getString(1490)));
                menu.add(actionsMenu);
                return menu;
        }
@@ -226,7 +256,8 @@ public class RoomMenuPanel extends Panel
                boolean moder = 
room.getClient().hasRight(Client.Right.moderator);
                inviteMenuItem.setEnabled(notExternalUser && moder);
                //TODO add check "sharing started"
-               boolean shareVisible = Room.Type.interview != r.getType() && 
!r.isHidden(RoomElement.ScreenSharing) && r.isAllowRecording() && moder;
+               boolean shareVisible = Room.Type.interview != r.getType() && 
!r.isHidden(RoomElement.ScreenSharing)
+                               && r.isAllowRecording() && 
room.getClient().hasRight(Client.Right.share) && room.getSharingUser() == null;
                shareMenuItem.setEnabled(shareVisible);
                //FIXME TODO apply* should be enabled if moder is in room
                applyModerMenuItem.setEnabled(!moder);
@@ -238,6 +269,26 @@ public class RoomMenuPanel extends Panel
                //TODO sip menus
                menuPanel.update(handler);
                //FIXME TODO askBtn should be visible if moder is in room
+               StringBuilder roomClass = new StringBuilder("room name");
+               StringBuilder roomTitle = new StringBuilder();
+               if (room.getRecordingUser() != null) {
+                       org.apache.openmeetings.db.entity.room.Client recUser = 
getBean(ISessionManager.class).getClientByPublicSID(room.getRecordingUser(), 
null); //TODO check server
+                       if (recUser != null) {
+                               roomTitle.append(String.format("%s %s %s %s 
%s", getString("419")
+                                               , recUser.getUsername(), 
recUser.getFirstname(), recUser.getLastname(), 
df.get().format(recUser.getConnectedSince())));
+                               roomClass.append(" screen");
+                       }
+                       org.apache.openmeetings.db.entity.room.Client pubUser = 
getBean(ISessionManager.class).getClientByPublicSID(room.getPublishingUser(), 
null); //TODO check server
+                       if (pubUser != null) {
+                               if (recUser != null) {
+                                       roomTitle.append('\n');
+                               }
+                               roomTitle.append(String.format("%s %s %s %s 
%s", getString("1504")
+                                               , recUser.getUsername(), 
pubUser.getFirstname(), pubUser.getLastname(), "URL")); //TODO add URL
+                               roomClass.append(" screen");
+                       }
+               }
+               handler.add(roomName.add(AttributeAppender.replace("class", 
roomClass), AttributeAppender.replace("title", roomTitle)));
                handler.add(askBtn.setVisible(!moder && 
r.isAllowUserQuestions()));
                handler.add(shareBtn.setVisible(shareVisible));
        }
@@ -245,6 +296,7 @@ public class RoomMenuPanel extends Panel
        public void pollCreated(IPartialPageRequestHandler handler) {
                vote.updateModel(handler);
                vote.open(handler);
+               update(handler);
        }
        
        public void exit(IPartialPageRequestHandler handler) {

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java?rev=1740251&r1=1740250&r2=1740251&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 Thu Apr 21 08:21:20 2016
@@ -84,7 +84,7 @@ public class StartSharingButton extends
        }
        
        @Override
-       protected void onClick(AjaxRequestTarget target) {
+       public void onClick(AjaxRequestTarget target) {
                //TODO deny download in case other screen sharing is in progress
                String app = "";
                try (InputStream jnlp = 
getClass().getClassLoader().getResourceAsStream("APPLICATION.jnlp")) {

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html?rev=1740251&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html
 Thu Apr 21 08:21:20 2016
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+      http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <span wicket:id="status" class="ui-icon align-right"></span>
+       <span class="ui-icon align-right clickable restart" 
wicket:message="title:610"></span>
+       <div wicket:id="name" class="user name"></div>
+       <span class="ui-icon align-right clickable audio-activity" 
wicket:message="title:372"></span>
+       <div wicket:id="actions" class="user actions">
+               <span class="ui-icon align-left clickable moderator-right" 
wicket:message="title:676"></span>
+               <span class="ui-icon align-left clickable wb-right" 
wicket:message="title:611"></span>
+               <span class="ui-icon align-left clickable screen-share-right" 
wicket:message="title:1067"></span>
+               <span class="ui-icon align-left clickable remote-control-right" 
wicket:message="title:1078"></span>
+               <span class="ui-icon align-left clickable audio-right" 
wicket:message="title:1604"></span>
+               <span class="ui-icon align-left clickable camera-right" 
wicket:message="title:683"></span>
+               <span class="ui-icon align-left clickable global-mute" 
wicket:message="title:1384"></span>
+               <span class="ui-icon align-left clickable exclsv-audio" 
wicket:message="title:1424"></span>
+               <span class="ui-icon align-left clickable kick" 
wicket:message="title:1213"></span>
+               <span wicket:id="privateChat" class="ui-icon align-right 
clickable private-chat" wicket:message="title:1493" 
onclick="startPrivateChat($(this));"></span>
+               <div class="clear"></div>
+       </div>
+</wicket:panel>
+</html>


Reply via email to