You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/04/25 20:03:59 UTC

svn commit: r1740868 [1/2] - in /openmeetings/application: branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/ branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ branches/3.2.x/openmeetings-w...

Author: solomax
Date: Mon Apr 25 18:03:58 2016
New Revision: 1740868

URL: http://svn.apache.org/viewvc?rev=1740868&view=rev
Log:
[OPENMEETINGS-1120] missing activities are added

Added:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
Modified:
    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/app/Client.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/ActivitiesPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
    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/sidebar/RoomClientPanel.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.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/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.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/app/Client.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/ActivitiesPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
    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/sidebar/RoomClientPanel.html
    openmeetings/application/trunk/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/RoomRightPanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.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/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.java

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -39,7 +39,12 @@ public class RoomMessage implements IWeb
 		, activityRemove
 		, requestRightModerator
 		, requestRightWb
+		, requestRightShare
+		, requestRightRemote
+		, requestRightA
 		, requestRightAv
+		, requestRightMute
+		, requestRightExclusive
 	}
 	private final Date timestamp;
 	private final String uid;

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Mon Apr 25 18:03:58 2016
@@ -45,12 +45,21 @@ public class Client implements IDataProv
 		, mute
 		, exclusive
 	}
+	public enum Activity {
+		broadcast
+		, share
+		, record
+		, publish
+		, muted
+		, exclusive
+	}
 	private final String sessionId;
 	private int pageId;
 	private final Long userId;
 	private Long roomId;
 	private final String uid;
-	private final Set<Right> rights = new HashSet<Right>();
+	private final Set<Right> rights = new HashSet<>();
+	private final Set<Activity> activities = new HashSet<>();
 	private final Date connectedSince;
 
 	public Client(String sessionId, Long userId) {
@@ -98,6 +107,14 @@ public class Client implements IDataProv
 		return rights.contains(Right.superModerator) || rights.contains(Right.moderator) ? true : rights.contains(right);
 	}
 
+	public Set<Activity> getActivities() {
+		return activities;
+	}
+
+	public boolean hasActivity(Activity activity) {
+		return activities.contains(activity);
+	}
+
 	public Date getConnectedSince() {
 		return connectedSince;
 	}

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -40,6 +40,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.RoomMessage.Type;
 import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
@@ -82,6 +83,10 @@ public class RoomPanel extends BasePanel
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomPanel.class, webAppRootKey);
 	private static final String ACCESS_DENIED_ID = "access-denied";
+	public enum Action {
+		kick
+		, refresh
+	}
 	private final Room r;
 	private final WebMarkupContainer room = new WebMarkupContainer("roomContainer");
 	private final AbstractDefaultAjaxBehavior aab = new AbstractDefaultAjaxBehavior() {
@@ -229,10 +234,10 @@ public class RoomPanel extends BasePanel
 						menu.update(handler);
 						break;
 					case recordingStarted:
-					{
-						recordingUser = ((TextRoomMessage)m).getText();
-						menu.update(handler);
-					}
+						{
+							recordingUser = ((TextRoomMessage)m).getText();
+							menu.update(handler);
+						}
 						break;
 					case sharingStoped:
 						//TODO check sharingUser == ((TextRoomMessage)m).getText();
@@ -240,10 +245,10 @@ public class RoomPanel extends BasePanel
 						menu.update(handler);
 						break;
 					case sharingStarted:
-					{
-						sharingUser = ((TextRoomMessage)m).getText();
-						menu.update(handler);
-					}
+						{
+							sharingUser = ((TextRoomMessage)m).getText();
+							menu.update(handler);
+						}
 						break;
 					case rightUpdated:
 						sidebar.updateUsers(handler);
@@ -252,6 +257,7 @@ public class RoomPanel extends BasePanel
 					case roomEnter:
 						sidebar.updateUsers(handler);
 						menu.update(handler);
+						// TODO should this be fixed?
 						//activities.addActivity(m.getUid(), m.getSentUserId(), Activity.Type.roomEnter, handler);
 						break;
 					case roomExit:
@@ -264,28 +270,58 @@ public class RoomPanel extends BasePanel
 						roomClosed.open(handler);
 						break;
 					case requestRightModerator:
-						if (getClient().hasRight(Right.moderator) && !isModerator(m.getUserId(), r.getId())) {
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
 							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightModerator), handler);
 						}
 						break;
+					case requestRightWb:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightWb), handler);
+						}
+						break;
+					case requestRightShare:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightShare), handler);
+						}
+						break;
+					case requestRightRemote:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightRemote), handler);
+						}
+						break;
+					case requestRightA:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightA), handler);
+						}
+						break;
 					case requestRightAv:
-						if (getClient().hasRight(Right.moderator) && !hasRight(m.getUserId(), r.getId(), Right.audio) && !hasRight(m.getUserId(), r.getId(), Right.video)) {
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
 							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightAv), handler);
 						}
 						break;
-					case requestRightWb:
-						if (getClient().hasRight(Right.moderator) && !hasRight(m.getUserId(), r.getId(), Right.whiteBoard)) {
+					case requestRightMute:
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
-							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightWb), handler);
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightMute), handler);
+						}
+						break;
+					case requestRightExclusive:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightExclusive), handler);
 						}
 						break;
 					case activityRemove:
-					{
-						TextRoomMessage tm = (TextRoomMessage)m;
-						activities.remove(tm.getText(), handler);
-					}
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.remove(tm.getText(), handler);
+						}
 						break;
 				}
 			}
@@ -396,8 +432,39 @@ public class RoomPanel extends BasePanel
 		}
 	}
 
-	public void requestRight(AjaxRequestTarget target, RoomMessage.Type right) {
-		RoomPanel.broadcast(new TextRoomMessage(getRoom().getId(), getUserId(), right, getClient().getUid()));
+	public void requestRight(AjaxRequestTarget target, Client.Right right) {
+		RoomMessage.Type reqType = null;
+		switch (right) {
+			case moderator:
+				reqType = Type.requestRightModerator;
+				break;
+			case whiteBoard:
+				reqType = Type.requestRightWb;
+				break;
+			case share:
+				reqType = Type.requestRightWb;
+				break;
+			case audio:
+				reqType = Type.requestRightA;
+				break;
+			case exclusive:
+				reqType = Type.requestRightExclusive;
+				break;
+			case mute:
+				reqType = Type.requestRightMute;
+				break;
+			case remoteControl:
+				reqType = Type.requestRightRemote;
+				break;
+			case video:
+				reqType = Type.requestRightAv;
+				break;
+			default:
+				break;
+		}
+		if (reqType != null) {
+			RoomPanel.broadcast(new TextRoomMessage(getRoom().getId(), getUserId(), reqType, getClient().getUid()));
+		}
 	}
 	
 	public void allowRight(AjaxRequestTarget target, Client client, Right... rights) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java Mon Apr 25 18:03:58 2016
@@ -61,7 +61,7 @@ import org.slf4j.Logger;
 public class ActivitiesPanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(ActivitiesPanel.class, webAppRootKey);
-	private static final String PARAM_UID = "uid";
+	private static final String PARAM_ID = "id";
 	private static final String ACTION = "action";
 	private static final String PARAM_ROOM_ID = "roomid";
 	private enum Action {
@@ -82,35 +82,35 @@ public class ActivitiesPanel extends Bas
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
-				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+				String id = getRequest().getRequestParameters().getParameterValue(PARAM_ID).toString(); 
 				long roomId = getRequest().getRequestParameters().getParameterValue(PARAM_ROOM_ID).toLong();
 				assert(room.getRoom().getId().equals(roomId));
 				Action action = Action.valueOf(getRequest().getRequestParameters().getParameterValue(ACTION).toString());
-				Activity a = activities.get(uid);
+				Activity a = activities.get(id);
 				if (a != null) {
 					switch (action) {
 						case close:
-							remove(uid, target);
+							remove(id, target);
 							break;
 						case decline:
 							if (room.getClient().hasRight(Client.Right.moderator)) {
-								broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+								broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 							}
 							break;
 						case accept:
-							Client client = getOnlineClient(uid);
+							Client client = getOnlineClient(a.getUid());
 							if (room.getClient().hasRight(Client.Right.moderator) && client != null && roomId == client.getRoomId()) {
 								switch (a.getType()) {
 									case reqRightModerator:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.moderator);
 										break;
 									case reqRightAv:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.audio, Right.video);
 										break;
 									case reqRightWb:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.whiteBoard);
 										break;
 									default:
@@ -130,7 +130,7 @@ public class ActivitiesPanel extends Bas
 		@Override
 		public void renderHead(Component component, IHeaderResponse response) {
 			super.renderHead(component, response);
-			response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("activityAction", this, explicit(PARAM_ROOM_ID), explicit(ACTION), explicit(PARAM_UID)), "activityAction")));
+			response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("activityAction", this, explicit(PARAM_ROOM_ID), explicit(ACTION), explicit(PARAM_ID)), "activityAction")));
 		}
 	};
 	private ListView<Activity> lv = new ListView<Activity>("activities", new ArrayList<Activity>()) {
@@ -141,67 +141,90 @@ public class ActivitiesPanel extends Bas
 			Activity a = item.getModelObject();
 			String text = "";
 			Long roomId = room.getRoom().getId();
-			Component accept = new WebMarkupContainer("accept").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.accept.name(), a.getUid()))).setVisible(false);
-			Component decline = new WebMarkupContainer("decline").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.decline.name(), a.getUid()))).setVisible(false);
+			Component accept = new WebMarkupContainer("accept").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.accept.name(), a.getId())));
+			Component decline = new WebMarkupContainer("decline").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.decline.name(), a.getId())));
+			switch (a.getType()) {
+				case reqRightModerator:
+				case reqRightWb:
+				case reqRightShare:
+				case reqRightRemote:
+				case reqRightA:
+				case reqRightAv:
+				case reqRightMute:
+				case reqRightExclusive:
+					if (room.getClient().hasRight(Client.Right.moderator)) {
+						accept.setVisible(true);
+						decline.setVisible(true);
+						break;
+					}
+				case roomEnter:
+				case roomExit:
+					accept.setVisible(false);
+					decline.setVisible(false);
+					break;
+			}
+			User u = getBean(UserDao.class).get(a.getSender());
+			String name = getUserId().equals(a.getSender()) ? getString("1362") : String.format("%s %s", u.getFirstname(), u.getLastname());
 			switch (a.getType()) {
 				case roomEnter:
 					text = ""; // TODO should this be fixed?
 					item.setVisible(false);
 					break;
 				case roomExit:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("1367"), df.get().format(a.getCreated()));
-				}
+					text = String.format("%s %s [%s]", name, getString("1367"), df.get().format(a.getCreated()));
 					break;
 				case reqRightModerator:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("room.action.request.right.moderator"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
-				//ask question 693
+					text = String.format("%s %s [%s]", name, getString("room.action.request.right.moderator"), df.get().format(a.getCreated()));
+					break;
+				case reqRightWb:
+					text = String.format("%s %s [%s]", name, getString("694"), df.get().format(a.getCreated()));
+					break;
+				case reqRightShare:
+					text = String.format("%s %s [%s]", name, getString("1070"), df.get().format(a.getCreated()));
+					break;
+				case reqRightRemote:
+					text = String.format("%s %s [%s]", name, getString("1082"), df.get().format(a.getCreated()));
+					break;
+				case reqRightA:
+					text = String.format("%s %s [%s]", name, getString("1603"), df.get().format(a.getCreated()));
 					break;
 				case reqRightAv:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("695"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
+					text = String.format("%s %s [%s]", name, getString("695"), df.get().format(a.getCreated()));
 					break;
-				case reqRightWb:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("694"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
+				case reqRightMute:
+					text = String.format("%s %s [%s]", name, getString("1399"), df.get().format(a.getCreated()));//TODO un-mute 1398
+					break;
+				case reqRightExclusive:
+					text = String.format("%s %s [%s]", name, getString("1427"), df.get().format(a.getCreated()));
 					break;
 			}
-			item.add(new WebMarkupContainer("close").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.close.name(), a.getUid()))));
+			item.add(new WebMarkupContainer("close").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.close.name(), a.getId()))));
 			item.add(accept, decline, new Label("text", text));
 			item.add(AttributeAppender.append("class", getClass(a)));
 		}
 		
 		private String getClass(Activity a) {
+			String cls = "ui-state-default";
 			switch (a.getType()) {
 				case reqRightModerator:
-					return "ui-state-highlight";
-				case reqRightAv:
-					return "ui-state-highlight";
 				case reqRightWb:
-					return "ui-state-highlight";
+				case reqRightShare:
+				case reqRightRemote:
+				case reqRightA:
+				case reqRightAv:
+				case reqRightMute:
+				case reqRightExclusive:
+					cls = "ui-state-highlight";
+					break;
 				case roomEnter:
 				case roomExit:
 			}
-			return "ui-state-default";
+			return cls;
 		}
 	};
 
 	public void add(Activity a, IPartialPageRequestHandler handler) {
-		activities.put(a.getUid(), a);
+		activities.put(a.getId(), a);
 		update(handler);
 		handler.appendJavaScript("hightlightActivities();");
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java Mon Apr 25 18:03:58 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings.web.room
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.UUID;
 
 public class Activity implements Serializable {
 	private static final long serialVersionUID = 1L;
@@ -27,21 +28,32 @@ public class Activity implements Seriali
 		roomEnter
 		, roomExit
 		, reqRightModerator
-		, reqRightAv
 		, reqRightWb
+		, reqRightShare
+		, reqRightRemote
+		, reqRightA
+		, reqRightAv
+		, reqRightMute
+		, reqRightExclusive
 	}
+	private final String id;
 	private final String uid;
 	private final Long sender;
 	private final Date created;
 	private final Type type;
 	
 	public Activity(String uid, Long sender, Type type) {
+		this.id = UUID.randomUUID().toString();
 		this.uid = uid;
 		this.sender = sender;
 		this.type = type;
 		this.created = new Date();
 	}
 
+	public String getId() {
+		return id;
+	}
+	
 	public String getUid() {
 		return uid;
 	}

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -85,7 +85,7 @@ public class RoomMenuPanel extends Panel
 		}
 		@Override
 		public void onClick(AjaxRequestTarget target) {
-			room.requestRight(target, RoomMessage.Type.requestRightModerator);
+			room.requestRight(target, Client.Right.moderator);
 		}
 	};
 	private final RoomPanel room;

Modified: 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=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html Mon Apr 25 18:03:58 2016
@@ -21,12 +21,12 @@
 <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>
+	<span wicket:id="refresh"></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 wicket:id="rights"></span>
-		<span class="ui-icon align-left clickable kick" wicket:message="title:1213"></span>
+		<span wicket:id="kick"></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>

Modified: 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=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java Mon Apr 25 18:03:58 2016
@@ -27,6 +27,8 @@ import org.apache.openmeetings.db.entity
 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.openmeetings.web.room.sidebar.icon.KickRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.RefreshIcon;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -42,10 +44,12 @@ public class RoomClientPanel extends Pan
 		Client c = item.getModelObject();
 		item.setMarkupId(String.format("user%s", c.getUid()));
 		User u = getBean(UserDao.class).get(c.getUserId());
+		add(new RefreshIcon("refresh", c, room));
 		add(new Label("name", u.getFirstname() + " " + u.getLastname()));
 		add(AttributeAppender.append("data-userid", c.getUserId()));
 		WebMarkupContainer actions = new WebMarkupContainer("actions");
 		actions.add(new RoomRightPanel("rights", c, room));
+		actions.add(new KickRightIcon("kick", c, room));
 		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));

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html Mon Apr 25 18:03:58 2016
@@ -26,7 +26,7 @@
 	<span wicket:id="right-remote-control"></span>
 	<span wicket:id="right-audio"></span>
 	<span wicket:id="right-video"></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 wicket:id="right-mute"></span>
+	<span wicket:id="right-exclsv"></span>
 </wicket:panel>
 </html>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java Mon Apr 25 18:03:58 2016
@@ -21,7 +21,9 @@ package org.apache.openmeetings.web.room
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.sidebar.icon.AudioRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.ExclusiveRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.ModeratorRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.MuteRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.RemoteControlRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.ScreenShareRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.VideoRightIcon;
@@ -37,6 +39,8 @@ public class RoomRightPanel extends Pane
 	private final RemoteControlRightIcon rightRemote;
 	private final AudioRightIcon rightAudio;
 	private final VideoRightIcon rightVideo;
+	private final MuteRightIcon rightMute;
+	private final ExclusiveRightIcon rightExclsv;
 
 	public RoomRightPanel(String id, Client client, RoomPanel room) {
 		super(id);
@@ -47,6 +51,8 @@ public class RoomRightPanel extends Pane
 		add(rightRemote = new RemoteControlRightIcon("right-remote-control", client, room));
 		add(rightAudio = new AudioRightIcon("right-audio", client, room));
 		add(rightVideo = new VideoRightIcon("right-video", client, room));
+		add(rightMute = new MuteRightIcon("right-mute", client, room));
+		add(rightExclsv = new ExclusiveRightIcon("right-exclsv", client, room));
 	}
 
 	@Override
@@ -62,5 +68,7 @@ public class RoomRightPanel extends Pane
 		rightRemote.update(handler);
 		rightAudio.update(handler);
 		rightVideo.update(handler);
+		rightMute.update(handler);
+		rightExclsv.update(handler);
 	}
 }

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -23,9 +23,7 @@
 	<div class="tabs" wicket:id="tabs"></div>
 	
 	<wicket:fragment wicket:id="user-panel">
-		<div class="user header">
-			<span wicket:id="rights"></span>
-		</div>
+		<div wicket:id="rights" class="user header"></div>
 		<div class="user list">
 			<div wicket:id="user" class="user ui-corner-all ui-widget-content">
 				<div wicket:id="user"></div>

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -28,7 +28,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Right;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -56,6 +55,8 @@ public class RoomSidebar extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomSidebar.class, webAppRootKey);
 	public static final String FUNC_CHANGE_RIGHT = "changeRight";
+	public static final String FUNC_ACTION = "roomAction";
+	public static final String PARAM_ACTION = "action";
 	public static final String PARAM_RIGHT = "right";
 	public static final String PARAM_UID = "uid";
 	private final RoomPanel room;
@@ -74,6 +75,13 @@ public class RoomSidebar extends Panel {
 			item.add(new RoomClientPanel("user", item, room));
 		}
 	};
+	private final AbstractDefaultAjaxBehavior action = new AbstractDefaultAjaxBehavior() {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void respond(AjaxRequestTarget target) {
+		}
+	};
 	private final AbstractDefaultAjaxBehavior requestRight = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
@@ -104,7 +112,7 @@ public class RoomSidebar extends Panel {
 						}
 					}
 				} else {
-					room.requestRight(target, RoomMessage.Type.requestRightModerator);
+					room.requestRight(target, right);
 				}
 			} catch (Exception e) {
 				log.error("Unexpected exception while processing activity action", e);
@@ -157,13 +165,14 @@ public class RoomSidebar extends Panel {
 		roomFiles = new RoomFilePanel("tree", room);
 		selfRights = new RoomRightPanel("rights", room.getClient(), room);
 		add(upload = new UploadDialog("upload", room, roomFiles));
-		add(requestRight);
+		add(requestRight, action);
 	}
 	
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
 		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction(FUNC_CHANGE_RIGHT, requestRight, explicit(PARAM_RIGHT), explicit(PARAM_UID)), FUNC_CHANGE_RIGHT)));
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction(FUNC_ACTION, action, explicit(PARAM_ACTION), explicit(PARAM_UID)), FUNC_ACTION)));
 	}
 	
 	private ListView<Client> updateUsers() {
@@ -199,6 +208,7 @@ public class RoomSidebar extends Panel {
 	public void updateUsers(IPartialPageRequestHandler handler) {
 		updateShowFiles();
 		updateUsers();
+		selfRights.setVisible(room.getRoom().isAllowUserQuestions() || room.getClient().hasRight(Right.moderator));
 		selfRights.update(handler);
 		handler.add(tabs);
 	}

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.icon;
+
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.room.RoomPanel;
+
+public class ExclusiveRightIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public ExclusiveRightIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.exclusive, room);
+		mainCssClass = "exclsv-audio ";
+	}
+
+	@Override
+	protected String getTitle() {
+		//TODO this need to be fixed
+		String title = self ? "1432" : "1423";
+		/*
+		if (client.hasRight(right)) {
+			title = self ? "1403" : "612";
+		} else {
+			title = self ? "686" : "694";
+		}
+		*/
+		return getString(title);
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,57 @@
+/*
+ * 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.icon;
+
+import static org.apache.openmeetings.web.room.sidebar.RoomSidebar.FUNC_ACTION;
+
+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.openmeetings.web.room.RoomPanel.Action;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+
+public class KickRightIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public KickRightIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.moderator, room);
+		mainCssClass = "kick ";
+	}
+
+	@Override
+	protected String getTitle() {
+		return getString("1213");
+	}
+	
+	@Override
+	protected boolean isClickable() {
+		return !self && room.getClient().hasRight(right) && !client.hasRight(Right.superModerator);
+	}
+	
+	@Override
+	protected String getScript() {
+		return String.format("%s('%s', '%s');", FUNC_ACTION, Action.kick.name(), client.getUid());
+	}
+	
+	@Override
+	public void update(IPartialPageRequestHandler handler) {
+		super.update(handler);
+		setVisible(isClickable());
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/MuteRightIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.icon;
+
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.room.RoomPanel;
+
+public class MuteRightIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public MuteRightIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.mute, room);
+		mainCssClass = "global-mute ";
+	}
+
+	@Override
+	protected String getTitle() {
+		//TODO this need to be fixed
+		String title = self ? "1403" : "1384";
+		/*
+		if (client.hasRight(right)) {
+			title = self ? "1403" : "612";
+		} else {
+			title = self ? "686" : "694";
+		}
+		*/
+		return getString(title);
+	}
+}

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,62 @@
+/*
+ * 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.icon;
+
+import static org.apache.openmeetings.web.room.sidebar.RoomSidebar.FUNC_ACTION;
+
+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.openmeetings.web.room.RoomPanel.Action;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+
+public class RefreshIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public RefreshIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.audio, room);
+		mainCssClass = "restart ";
+	}
+
+	@Override
+	protected String getTitle() {
+		return getString("610");
+	}
+	
+	@Override
+	protected String getAlign() {
+		return ALIGN_RIGHT;
+	}
+	
+	@Override
+	protected boolean isClickable() {
+		return false;//TODO broadcasting return self || room.getClient().hasRight(right) && !client.hasRight(Right.superModerator);
+	}
+	
+	@Override
+	protected String getScript() {
+		return String.format("%s('%s', '%s');", FUNC_ACTION, Action.refresh.name(), client.getUid());
+	}
+	
+	@Override
+	public void update(IPartialPageRequestHandler handler) {
+		super.update(handler);
+		setVisible(isClickable());
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RoomRightIcon.java Mon Apr 25 18:03:58 2016
@@ -29,9 +29,11 @@ import org.apache.wicket.markup.html.Web
 
 public abstract class RoomRightIcon extends WebMarkupContainer {
 	private static final long serialVersionUID = 1L;
-	private static final String CLS_CLICKABLE = "clickable ";
 	private static final String CLS_GRANTED = "granted ";
-	private static final String ICON_CLASS = "ui-icon align-left ";
+	private static final String ICON_CLASS = "ui-icon ";
+	protected static final String ALIGN_LEFT = "align-left ";
+	protected static final String ALIGN_RIGHT = "align-right ";
+	protected static final String CLS_CLICKABLE = "clickable ";
 	protected final RoomPanel room;
 	protected final Right right;
 	protected final boolean self;
@@ -55,24 +57,32 @@ public abstract class RoomRightIcon exte
 	
 	protected abstract String getTitle();
 	
+	protected String getAlign() {
+		return ALIGN_LEFT;
+	}
+	
 	protected boolean isClickable() {
-		return !self && room.getClient().hasRight(Right.moderator);
+		return self || (!self && room.getClient().hasRight(Right.moderator));
 	}
 	
 	protected boolean hasRight() {
 		return client.hasRight(right);
 	}
+
+	protected String getScript() {
+		return String.format("%s('%s', '%s');", FUNC_CHANGE_RIGHT, right.name(), client.getUid());
+	}
 	
 	public void update(IPartialPageRequestHandler handler) {
 		StringBuilder cls = new StringBuilder(ICON_CLASS);
-		cls.append(mainCssClass);
+		cls.append(getAlign()).append(mainCssClass);
 		if (hasRight()) {
 			cls.append(CLS_GRANTED);
 		}
 		if (isClickable()) {
 			//request/remove
 			cls.append(CLS_CLICKABLE);
-			add(AttributeAppender.replace("onclick", String.format("%s('%s', '%s');", FUNC_CHANGE_RIGHT, right.name(), client.getUid())));
+			add(AttributeAppender.replace("onclick", getScript()));
 		}
 		add(AttributeAppender.replace("title", getTitle()));
 		add(AttributeAppender.replace("class", cls));

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -39,7 +39,12 @@ public class RoomMessage implements IWeb
 		, activityRemove
 		, requestRightModerator
 		, requestRightWb
+		, requestRightShare
+		, requestRightRemote
+		, requestRightA
 		, requestRightAv
+		, requestRightMute
+		, requestRightExclusive
 	}
 	private final Date timestamp;
 	private final String uid;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Mon Apr 25 18:03:58 2016
@@ -45,12 +45,21 @@ public class Client implements IDataProv
 		, mute
 		, exclusive
 	}
+	public enum Activity {
+		broadcast
+		, share
+		, record
+		, publish
+		, muted
+		, exclusive
+	}
 	private final String sessionId;
 	private int pageId;
 	private final Long userId;
 	private Long roomId;
 	private final String uid;
-	private final Set<Right> rights = new HashSet<Right>();
+	private final Set<Right> rights = new HashSet<>();
+	private final Set<Activity> activities = new HashSet<>();
 	private final Date connectedSince;
 
 	public Client(String sessionId, Long userId) {
@@ -98,6 +107,14 @@ public class Client implements IDataProv
 		return rights.contains(Right.superModerator) || rights.contains(Right.moderator) ? true : rights.contains(right);
 	}
 
+	public Set<Activity> getActivities() {
+		return activities;
+	}
+
+	public boolean hasActivity(Activity activity) {
+		return activities.contains(activity);
+	}
+
 	public Date getConnectedSince() {
 		return connectedSince;
 	}

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -40,6 +40,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.RoomMessage.Type;
 import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.Client;
@@ -87,6 +88,10 @@ public class RoomPanel extends BasePanel
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomPanel.class, webAppRootKey);
 	private static final String ACCESS_DENIED_ID = "access-denied";
+	public enum Action {
+		kick
+		, refresh
+	}
 	private final Room r;
 	private final WebMarkupContainer room = new WebMarkupContainer("roomContainer");
 	private final AbstractDefaultAjaxBehavior aab = new AbstractDefaultAjaxBehavior() {
@@ -248,10 +253,10 @@ public class RoomPanel extends BasePanel
 						menu.update(handler);
 						break;
 					case recordingStarted:
-					{
-						recordingUser = ((TextRoomMessage)m).getText();
-						menu.update(handler);
-					}
+						{
+							recordingUser = ((TextRoomMessage)m).getText();
+							menu.update(handler);
+						}
 						break;
 					case sharingStoped:
 						//TODO check sharingUser == ((TextRoomMessage)m).getText();
@@ -259,10 +264,10 @@ public class RoomPanel extends BasePanel
 						menu.update(handler);
 						break;
 					case sharingStarted:
-					{
-						sharingUser = ((TextRoomMessage)m).getText();
-						menu.update(handler);
-					}
+						{
+							sharingUser = ((TextRoomMessage)m).getText();
+							menu.update(handler);
+						}
 						break;
 					case rightUpdated:
 						sidebar.updateUsers(handler);
@@ -271,6 +276,7 @@ public class RoomPanel extends BasePanel
 					case roomEnter:
 						sidebar.updateUsers(handler);
 						menu.update(handler);
+						// TODO should this be fixed?
 						//activities.addActivity(m.getUid(), m.getSentUserId(), Activity.Type.roomEnter, handler);
 						break;
 					case roomExit:
@@ -283,28 +289,58 @@ public class RoomPanel extends BasePanel
 						roomClosed.open(handler);
 						break;
 					case requestRightModerator:
-						if (getClient().hasRight(Right.moderator) && !isModerator(m.getUserId(), r.getId())) {
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
 							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightModerator), handler);
 						}
 						break;
+					case requestRightWb:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightWb), handler);
+						}
+						break;
+					case requestRightShare:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightShare), handler);
+						}
+						break;
+					case requestRightRemote:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightRemote), handler);
+						}
+						break;
+					case requestRightA:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightA), handler);
+						}
+						break;
 					case requestRightAv:
-						if (getClient().hasRight(Right.moderator) && !hasRight(m.getUserId(), r.getId(), Right.audio) && !hasRight(m.getUserId(), r.getId(), Right.video)) {
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
 							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightAv), handler);
 						}
 						break;
-					case requestRightWb:
-						if (getClient().hasRight(Right.moderator) && !hasRight(m.getUserId(), r.getId(), Right.whiteBoard)) {
+					case requestRightMute:
+						{
 							TextRoomMessage tm = (TextRoomMessage)m;
-							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightWb), handler);
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightMute), handler);
+						}
+						break;
+					case requestRightExclusive:
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.add(new Activity(tm.getText(), m.getUserId(), Activity.Type.reqRightExclusive), handler);
 						}
 						break;
 					case activityRemove:
-					{
-						TextRoomMessage tm = (TextRoomMessage)m;
-						activities.remove(tm.getText(), handler);
-					}
+						{
+							TextRoomMessage tm = (TextRoomMessage)m;
+							activities.remove(tm.getText(), handler);
+						}
 						break;
 				}
 			}
@@ -427,8 +463,39 @@ public class RoomPanel extends BasePanel
 		}
 	}
 
-	public void requestRight(AjaxRequestTarget target, RoomMessage.Type right) {
-		RoomPanel.broadcast(new TextRoomMessage(getRoom().getId(), getUserId(), right, getClient().getUid()));
+	public void requestRight(AjaxRequestTarget target, Client.Right right) {
+		RoomMessage.Type reqType = null;
+		switch (right) {
+			case moderator:
+				reqType = Type.requestRightModerator;
+				break;
+			case whiteBoard:
+				reqType = Type.requestRightWb;
+				break;
+			case share:
+				reqType = Type.requestRightWb;
+				break;
+			case audio:
+				reqType = Type.requestRightA;
+				break;
+			case exclusive:
+				reqType = Type.requestRightExclusive;
+				break;
+			case mute:
+				reqType = Type.requestRightMute;
+				break;
+			case remoteControl:
+				reqType = Type.requestRightRemote;
+				break;
+			case video:
+				reqType = Type.requestRightAv;
+				break;
+			default:
+				break;
+		}
+		if (reqType != null) {
+			RoomPanel.broadcast(new TextRoomMessage(getRoom().getId(), getUserId(), reqType, getClient().getUid()));
+		}
 	}
 	
 	public void allowRight(AjaxRequestTarget target, Client client, Right... rights) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java Mon Apr 25 18:03:58 2016
@@ -61,7 +61,7 @@ import org.slf4j.Logger;
 public class ActivitiesPanel extends BasePanel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(ActivitiesPanel.class, webAppRootKey);
-	private static final String PARAM_UID = "uid";
+	private static final String PARAM_ID = "id";
 	private static final String ACTION = "action";
 	private static final String PARAM_ROOM_ID = "roomid";
 	private enum Action {
@@ -82,35 +82,35 @@ public class ActivitiesPanel extends Bas
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
-				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+				String id = getRequest().getRequestParameters().getParameterValue(PARAM_ID).toString(); 
 				long roomId = getRequest().getRequestParameters().getParameterValue(PARAM_ROOM_ID).toLong();
 				assert(room.getRoom().getId().equals(roomId));
 				Action action = Action.valueOf(getRequest().getRequestParameters().getParameterValue(ACTION).toString());
-				Activity a = activities.get(uid);
+				Activity a = activities.get(id);
 				if (a != null) {
 					switch (action) {
 						case close:
-							remove(uid, target);
+							remove(id, target);
 							break;
 						case decline:
 							if (room.getClient().hasRight(Client.Right.moderator)) {
-								broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+								broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 							}
 							break;
 						case accept:
-							Client client = getOnlineClient(uid);
+							Client client = getOnlineClient(a.getUid());
 							if (room.getClient().hasRight(Client.Right.moderator) && client != null && roomId == client.getRoomId()) {
 								switch (a.getType()) {
 									case reqRightModerator:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.moderator);
 										break;
 									case reqRightAv:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.audio, Right.video);
 										break;
 									case reqRightWb:
-										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, uid));
+										broadcast(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
 										room.allowRight(target, client, Right.whiteBoard);
 										break;
 									default:
@@ -130,7 +130,7 @@ public class ActivitiesPanel extends Bas
 		@Override
 		public void renderHead(Component component, IHeaderResponse response) {
 			super.renderHead(component, response);
-			response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("activityAction", this, explicit(PARAM_ROOM_ID), explicit(ACTION), explicit(PARAM_UID)), "activityAction")));
+			response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction("activityAction", this, explicit(PARAM_ROOM_ID), explicit(ACTION), explicit(PARAM_ID)), "activityAction")));
 		}
 	};
 	private ListView<Activity> lv = new ListView<Activity>("activities", new ArrayList<Activity>()) {
@@ -141,67 +141,90 @@ public class ActivitiesPanel extends Bas
 			Activity a = item.getModelObject();
 			String text = "";
 			Long roomId = room.getRoom().getId();
-			Component accept = new WebMarkupContainer("accept").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.accept.name(), a.getUid()))).setVisible(false);
-			Component decline = new WebMarkupContainer("decline").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.decline.name(), a.getUid()))).setVisible(false);
+			Component accept = new WebMarkupContainer("accept").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.accept.name(), a.getId())));
+			Component decline = new WebMarkupContainer("decline").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.decline.name(), a.getId())));
+			switch (a.getType()) {
+				case reqRightModerator:
+				case reqRightWb:
+				case reqRightShare:
+				case reqRightRemote:
+				case reqRightA:
+				case reqRightAv:
+				case reqRightMute:
+				case reqRightExclusive:
+					if (room.getClient().hasRight(Client.Right.moderator)) {
+						accept.setVisible(true);
+						decline.setVisible(true);
+						break;
+					}
+				case roomEnter:
+				case roomExit:
+					accept.setVisible(false);
+					decline.setVisible(false);
+					break;
+			}
+			User u = getBean(UserDao.class).get(a.getSender());
+			String name = getUserId().equals(a.getSender()) ? getString("1362") : String.format("%s %s", u.getFirstname(), u.getLastname());
 			switch (a.getType()) {
 				case roomEnter:
 					text = ""; // TODO should this be fixed?
 					item.setVisible(false);
 					break;
 				case roomExit:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("1367"), df.get().format(a.getCreated()));
-				}
+					text = String.format("%s %s [%s]", name, getString("1367"), df.get().format(a.getCreated()));
 					break;
 				case reqRightModerator:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("room.action.request.right.moderator"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
-				//ask question 693
+					text = String.format("%s %s [%s]", name, getString("room.action.request.right.moderator"), df.get().format(a.getCreated()));
+					break;
+				case reqRightWb:
+					text = String.format("%s %s [%s]", name, getString("694"), df.get().format(a.getCreated()));
+					break;
+				case reqRightShare:
+					text = String.format("%s %s [%s]", name, getString("1070"), df.get().format(a.getCreated()));
+					break;
+				case reqRightRemote:
+					text = String.format("%s %s [%s]", name, getString("1082"), df.get().format(a.getCreated()));
+					break;
+				case reqRightA:
+					text = String.format("%s %s [%s]", name, getString("1603"), df.get().format(a.getCreated()));
 					break;
 				case reqRightAv:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("695"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
+					text = String.format("%s %s [%s]", name, getString("695"), df.get().format(a.getCreated()));
 					break;
-				case reqRightWb:
-				{
-					User u = getBean(UserDao.class).get(a.getSender());
-					text = String.format("%s %s %s [%s]", u.getFirstname(), u.getLastname(), getString("694"), df.get().format(a.getCreated()));
-					accept.setVisible(true);
-					decline.setVisible(true);
-				}
+				case reqRightMute:
+					text = String.format("%s %s [%s]", name, getString("1399"), df.get().format(a.getCreated()));//TODO un-mute 1398
+					break;
+				case reqRightExclusive:
+					text = String.format("%s %s [%s]", name, getString("1427"), df.get().format(a.getCreated()));
 					break;
 			}
-			item.add(new WebMarkupContainer("close").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.close.name(), a.getUid()))));
+			item.add(new WebMarkupContainer("close").add(new AttributeAppender("onclick", String.format("activityAction(%s, '%s', '%s');", roomId, Action.close.name(), a.getId()))));
 			item.add(accept, decline, new Label("text", text));
 			item.add(AttributeAppender.append("class", getClass(a)));
 		}
 		
 		private String getClass(Activity a) {
+			String cls = "ui-state-default";
 			switch (a.getType()) {
 				case reqRightModerator:
-					return "ui-state-highlight";
-				case reqRightAv:
-					return "ui-state-highlight";
 				case reqRightWb:
-					return "ui-state-highlight";
+				case reqRightShare:
+				case reqRightRemote:
+				case reqRightA:
+				case reqRightAv:
+				case reqRightMute:
+				case reqRightExclusive:
+					cls = "ui-state-highlight";
+					break;
 				case roomEnter:
 				case roomExit:
 			}
-			return "ui-state-default";
+			return cls;
 		}
 	};
 
 	public void add(Activity a, IPartialPageRequestHandler handler) {
-		activities.put(a.getUid(), a);
+		activities.put(a.getId(), a);
 		update(handler);
 		handler.appendJavaScript("hightlightActivities();");
 	}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java Mon Apr 25 18:03:58 2016
@@ -20,6 +20,7 @@ package org.apache.openmeetings.web.room
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.UUID;
 
 public class Activity implements Serializable {
 	private static final long serialVersionUID = 1L;
@@ -27,21 +28,32 @@ public class Activity implements Seriali
 		roomEnter
 		, roomExit
 		, reqRightModerator
-		, reqRightAv
 		, reqRightWb
+		, reqRightShare
+		, reqRightRemote
+		, reqRightA
+		, reqRightAv
+		, reqRightMute
+		, reqRightExclusive
 	}
+	private final String id;
 	private final String uid;
 	private final Long sender;
 	private final Date created;
 	private final Type type;
 	
 	public Activity(String uid, Long sender, Type type) {
+		this.id = UUID.randomUUID().toString();
 		this.uid = uid;
 		this.sender = sender;
 		this.type = type;
 		this.created = new Date();
 	}
 
+	public String getId() {
+		return id;
+	}
+	
 	public String getUid() {
 		return uid;
 	}

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=1740868&r1=1740867&r2=1740868&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 Mon Apr 25 18:03:58 2016
@@ -85,7 +85,7 @@ public class RoomMenuPanel extends Panel
 		}
 		@Override
 		public void onClick(AjaxRequestTarget target) {
-			room.requestRight(target, RoomMessage.Type.requestRightModerator);
+			room.requestRight(target, Client.Right.moderator);
 		}
 	};
 	private final RoomPanel room;

Modified: 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=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.html Mon Apr 25 18:03:58 2016
@@ -21,12 +21,12 @@
 <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>
+	<span wicket:id="refresh"></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 wicket:id="rights"></span>
-		<span class="ui-icon align-left clickable kick" wicket:message="title:1213"></span>
+		<span wicket:id="kick"></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>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomClientPanel.java Mon Apr 25 18:03:58 2016
@@ -27,6 +27,8 @@ import org.apache.openmeetings.db.entity
 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.openmeetings.web.room.sidebar.icon.KickRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.RefreshIcon;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -42,10 +44,12 @@ public class RoomClientPanel extends Pan
 		Client c = item.getModelObject();
 		item.setMarkupId(String.format("user%s", c.getUid()));
 		User u = getBean(UserDao.class).get(c.getUserId());
+		add(new RefreshIcon("refresh", c, room));
 		add(new Label("name", u.getFirstname() + " " + u.getLastname()));
 		add(AttributeAppender.append("data-userid", c.getUserId()));
 		WebMarkupContainer actions = new WebMarkupContainer("actions");
 		actions.add(new RoomRightPanel("rights", c, room));
+		actions.add(new KickRightIcon("kick", c, room));
 		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));

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.html Mon Apr 25 18:03:58 2016
@@ -26,7 +26,7 @@
 	<span wicket:id="right-remote-control"></span>
 	<span wicket:id="right-audio"></span>
 	<span wicket:id="right-video"></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 wicket:id="right-mute"></span>
+	<span wicket:id="right-exclsv"></span>
 </wicket:panel>
 </html>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomRightPanel.java Mon Apr 25 18:03:58 2016
@@ -21,7 +21,9 @@ package org.apache.openmeetings.web.room
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.sidebar.icon.AudioRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.ExclusiveRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.ModeratorRightIcon;
+import org.apache.openmeetings.web.room.sidebar.icon.MuteRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.RemoteControlRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.ScreenShareRightIcon;
 import org.apache.openmeetings.web.room.sidebar.icon.VideoRightIcon;
@@ -37,6 +39,8 @@ public class RoomRightPanel extends Pane
 	private final RemoteControlRightIcon rightRemote;
 	private final AudioRightIcon rightAudio;
 	private final VideoRightIcon rightVideo;
+	private final MuteRightIcon rightMute;
+	private final ExclusiveRightIcon rightExclsv;
 
 	public RoomRightPanel(String id, Client client, RoomPanel room) {
 		super(id);
@@ -47,6 +51,8 @@ public class RoomRightPanel extends Pane
 		add(rightRemote = new RemoteControlRightIcon("right-remote-control", client, room));
 		add(rightAudio = new AudioRightIcon("right-audio", client, room));
 		add(rightVideo = new VideoRightIcon("right-video", client, room));
+		add(rightMute = new MuteRightIcon("right-mute", client, room));
+		add(rightExclsv = new ExclusiveRightIcon("right-exclsv", client, room));
 	}
 
 	@Override
@@ -62,5 +68,7 @@ public class RoomRightPanel extends Pane
 		rightRemote.update(handler);
 		rightAudio.update(handler);
 		rightVideo.update(handler);
+		rightMute.update(handler);
+		rightExclsv.update(handler);
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html Mon Apr 25 18:03:58 2016
@@ -23,9 +23,7 @@
 	<div class="tabs" wicket:id="tabs"></div>
 	
 	<wicket:fragment wicket:id="user-panel">
-		<div class="user header">
-			<span wicket:id="rights"></span>
-		</div>
+		<div wicket:id="rights" class="user header"></div>
 		<div class="user list">
 			<div wicket:id="user" class="user ui-corner-all ui-widget-content">
 				<div wicket:id="user"></div>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1740868&r1=1740867&r2=1740868&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Mon Apr 25 18:03:58 2016
@@ -28,7 +28,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.web.app.Client;
 import org.apache.openmeetings.web.app.Client.Right;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -56,6 +55,8 @@ public class RoomSidebar extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(RoomSidebar.class, webAppRootKey);
 	public static final String FUNC_CHANGE_RIGHT = "changeRight";
+	public static final String FUNC_ACTION = "roomAction";
+	public static final String PARAM_ACTION = "action";
 	public static final String PARAM_RIGHT = "right";
 	public static final String PARAM_UID = "uid";
 	private final RoomPanel room;
@@ -74,6 +75,13 @@ public class RoomSidebar extends Panel {
 			item.add(new RoomClientPanel("user", item, room));
 		}
 	};
+	private final AbstractDefaultAjaxBehavior action = new AbstractDefaultAjaxBehavior() {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void respond(AjaxRequestTarget target) {
+		}
+	};
 	private final AbstractDefaultAjaxBehavior requestRight = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
@@ -104,7 +112,7 @@ public class RoomSidebar extends Panel {
 						}
 					}
 				} else {
-					room.requestRight(target, RoomMessage.Type.requestRightModerator);
+					room.requestRight(target, right);
 				}
 			} catch (Exception e) {
 				log.error("Unexpected exception while processing activity action", e);
@@ -157,13 +165,14 @@ public class RoomSidebar extends Panel {
 		roomFiles = new RoomFilePanel("tree", room);
 		selfRights = new RoomRightPanel("rights", room.getClient(), room);
 		add(upload = new UploadDialog("upload", room, roomFiles));
-		add(requestRight);
+		add(requestRight, action);
 	}
 	
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
 		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction(FUNC_CHANGE_RIGHT, requestRight, explicit(PARAM_RIGHT), explicit(PARAM_UID)), FUNC_CHANGE_RIGHT)));
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forScript(getNamedFunction(FUNC_ACTION, action, explicit(PARAM_ACTION), explicit(PARAM_UID)), FUNC_ACTION)));
 	}
 	
 	private ListView<Client> updateUsers() {
@@ -199,6 +208,7 @@ public class RoomSidebar extends Panel {
 	public void updateUsers(IPartialPageRequestHandler handler) {
 		updateShowFiles();
 		updateUsers();
+		selfRights.setVisible(room.getRoom().isAllowUserQuestions() || room.getClient().hasRight(Right.moderator));
 		selfRights.update(handler);
 		handler.add(tabs);
 	}

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ExclusiveRightIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.icon;
+
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.Client.Right;
+import org.apache.openmeetings.web.room.RoomPanel;
+
+public class ExclusiveRightIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public ExclusiveRightIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.exclusive, room);
+		mainCssClass = "exclsv-audio ";
+	}
+
+	@Override
+	protected String getTitle() {
+		//TODO this need to be fixed
+		String title = self ? "1432" : "1423";
+		/*
+		if (client.hasRight(right)) {
+			title = self ? "1403" : "612";
+		} else {
+			title = self ? "686" : "694";
+		}
+		*/
+		return getString(title);
+	}
+}

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java?rev=1740868&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/KickRightIcon.java Mon Apr 25 18:03:58 2016
@@ -0,0 +1,57 @@
+/*
+ * 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.icon;
+
+import static org.apache.openmeetings.web.room.sidebar.RoomSidebar.FUNC_ACTION;
+
+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.openmeetings.web.room.RoomPanel.Action;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+
+public class KickRightIcon extends RoomRightIcon {
+	private static final long serialVersionUID = 1L;
+	
+	public KickRightIcon(String id, Client client, RoomPanel room) {
+		super(id, client, Right.moderator, room);
+		mainCssClass = "kick ";
+	}
+
+	@Override
+	protected String getTitle() {
+		return getString("1213");
+	}
+	
+	@Override
+	protected boolean isClickable() {
+		return !self && room.getClient().hasRight(right) && !client.hasRight(Right.superModerator);
+	}
+	
+	@Override
+	protected String getScript() {
+		return String.format("%s('%s', '%s');", FUNC_ACTION, Action.kick.name(), client.getUid());
+	}
+	
+	@Override
+	public void update(IPartialPageRequestHandler handler) {
+		super.update(handler);
+		setVisible(isClickable());
+	}
+}