This is an automated email from the ASF dual-hosted git repository. solomax pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push: new d547350 [OPENMEETINGS-2320] av settings are immediately in effect d547350 is described below commit d5473507d7c27fb3d3009958b28b8e0b3c7832f1 Author: Maxim Solodovnik <solomax...@gmail.com> AuthorDate: Fri Jun 12 11:23:19 2020 +0700 [OPENMEETINGS-2320] av settings are immediately in effect --- .../openmeetings/db/entity/basic/Client.java | 6 +++ .../apache/openmeetings/web/room/RoomPanel.java | 25 ++++++++++++ .../apache/openmeetings/web/room/raw-settings.js | 17 ++++---- .../openmeetings/web/room/raw-video-manager.js | 2 + .../org/apache/openmeetings/web/room/raw-video.js | 15 ++++++- .../openmeetings/web/room/sidebar/RoomSidebar.java | 47 ---------------------- 6 files changed, 54 insertions(+), 58 deletions(-) diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java index 46166aa..cdf463b 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java @@ -31,6 +31,7 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.IDataProviderEntity; @@ -245,6 +246,11 @@ public class Client implements IDataProviderEntity, IWsClient { .findFirst(); } + public Stream<StreamDesc> getCamStreams() { + return streams.values().stream() + .filter(sd -> StreamType.WEBCAM == sd.getType()); + } + public Client restoreActivities(StreamDesc sd) { synchronized (activities) { Set<Activity> aa = new HashSet<>(sd.sactivities); diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java index fba8f99..3245256 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java @@ -19,6 +19,7 @@ package org.apache.openmeetings.web.room; import static java.time.Duration.ZERO; +import static org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed; import static org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_USER_PREFIX; import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF; import static org.apache.openmeetings.web.app.WebSession.getDateFormat; @@ -69,6 +70,7 @@ import org.apache.openmeetings.web.room.wb.AbstractWbPanel; import org.apache.openmeetings.web.room.wb.InterviewWbPanel; import org.apache.openmeetings.web.room.wb.WbAction; import org.apache.openmeetings.web.room.wb.WbPanel; +import org.apache.openmeetings.web.util.ExtendedClientProperties; import org.apache.openmeetings.web.util.TouchPunchResourceReference; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; @@ -231,6 +233,7 @@ public class RoomPanel extends BasePanel { } }; Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false); + private boolean avInited = false; @SpringBean private ClientManager cm; @@ -767,6 +770,28 @@ public class RoomPanel extends BasePanel { wb.processWbAction(a, o.optJSONObject("data"), handler); } else if ("room".equals(type)) { sidebar.roomAction(handler, o); + } else if ("av".equals(type)) { + ExtendedClientProperties cp = WebSession.get().getExtendedProperties(); + Client c = cp.setSettings(o.optJSONObject("settings")).update(getClient()); + if (!avInited) { + avInited = true; + if (Room.Type.CONFERENCE == r.getType()) { + if (!activityAllowed(c, Client.Activity.AUDIO, c.getRoom())) { + c.allow(Room.Right.AUDIO); + } + if (!c.getRoom().isAudioOnly() && !activityAllowed(c, Client.Activity.VIDEO, c.getRoom())) { + c.allow(Room.Right.VIDEO); + } + streamProcessor.toggleActivity(c, c.getRoom().isAudioOnly() + ? Client.Activity.AUDIO + : Client.Activity.AUDIO_VIDEO); + } + } + c.getCamStreams().forEach(sd -> { + sd.setWidth(c.getWidth()); + sd.setHeight(c.getHeight()); + }); + broadcast(c); } } } diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js index 1619564..4ad895d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js @@ -127,14 +127,13 @@ var VideoSettings = (function() { } return s; } - function _save(refr) { - const _s = Settings.save(s); - if (typeof(avSettings) === 'function') { - avSettings(_s); - } - if (refr && typeof(VideoManager) === 'object' && o.uid) { - VideoManager.refresh(o.uid); - } + function _save() { + Settings.save(s); + OmUtil.sendMessage({ + type: 'av' + , area: 'room' + , settings: s + }); } function _clear(_ms) { const ms = _ms || (vid && vid.length === 1 ? vid[0].srcObject : null); @@ -198,7 +197,7 @@ var VideoSettings = (function() { }, MsgBase); }); vs.find('.btn-save').off().click(function() { - _save(true); + _save(); _close(); vs.modal("hide"); }); diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js index bb4edde..2e49eed 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js @@ -150,6 +150,8 @@ var VideoManager = (function() { c.streams.forEach(function(sd) { streamMap[sd.uid] = sd.uid; sd.self = c.self; + sd.cam = c.cam; + sd.mic = c.mic; if (VideoUtil.isSharing(sd) || VideoUtil.isRecording(sd)) { return; } diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js index aa2984e..129928d 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js @@ -370,17 +370,28 @@ var Video = (function() { return v; } function _update(_c) { - const prevA = sd.activities; + const prevA = sd.activities + , prevW = sd.width + , prevH = sd.height + , prevCam = sd.cam + , prevMic = sd.mic; sd.activities = _c.activities.sort(); sd.level = _c.level; sd.user.firstName = _c.user.firstName; sd.user.lastName = _c.user.lastName; sd.user.displayName = _c.user.displayName; + sd.width = _c.width; + sd.height = _c.height; + sd.cam = _c.cam; + sd.mic = _c.mic; const name = sd.user.displayName; if (hasVideo) { v.dialog('option', 'title', name).parent().find('.ui-dialog-titlebar').attr('title', name); } - const same = prevA.length === sd.activities.length && prevA.every(function(value, index) { return value === sd.activities[index]}) + const same = prevA.length === sd.activities.length + && prevA.every(function(value, index) { return value === sd.activities[index]}) + && prevW === sd.width && prevH === sd.height + && prevCam == sd.cam && prevMic === sd.mic; if (sd.self && !same) { _cleanup(); v.remove(); diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java index 76bb8f1..c07ce2e 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java @@ -18,21 +18,16 @@ */ package org.apache.openmeetings.web.room.sidebar; -import static org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed; import static org.apache.openmeetings.web.app.Application.kickUser; -import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction; -import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit; import org.apache.openmeetings.core.remote.StreamProcessor; import org.apache.openmeetings.core.util.WebSocketHelper; import org.apache.openmeetings.db.entity.basic.Client; -import org.apache.openmeetings.db.entity.room.Room; import org.apache.openmeetings.db.entity.room.Room.Right; import org.apache.openmeetings.db.entity.room.Room.RoomElement; import org.apache.openmeetings.db.util.ws.RoomMessage; import org.apache.openmeetings.db.util.ws.TextRoomMessage; import org.apache.openmeetings.web.app.ClientManager; -import org.apache.openmeetings.web.app.WebSession; import org.apache.openmeetings.web.common.NameDialog; import org.apache.openmeetings.web.common.confirmation.ConfirmationDialog; import org.apache.openmeetings.web.room.RoomPanel; @@ -40,17 +35,12 @@ import org.apache.openmeetings.web.room.RoomPanel.Action; import org.apache.openmeetings.web.room.VideoSettings; import org.apache.openmeetings.web.room.activities.ActivitiesPanel; import org.apache.openmeetings.web.room.activities.Activity; -import org.apache.openmeetings.web.util.ExtendedClientProperties; -import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; -import org.apache.wicket.markup.head.IHeaderResponse; -import org.apache.wicket.markup.head.PriorityHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; -import org.apache.wicket.util.string.StringValue; import org.apache.wicket.util.string.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,39 +61,9 @@ public class RoomSidebar extends Panel { private final WebMarkupContainer fileTab = new WebMarkupContainer("file-tab"); private ConfirmationDialog confirmKick; private boolean showFiles; - private boolean avInited = false; private Client kickedClient; private VideoSettings settings = new VideoSettings("settings"); private ActivitiesPanel activities; - private final AbstractDefaultAjaxBehavior avSettings = new AbstractDefaultAjaxBehavior() { - private static final long serialVersionUID = 1L; - - @Override - protected void respond(AjaxRequestTarget target) { - StringValue s = getRequest().getRequestParameters().getParameterValue(PARAM_SETTINGS); - Client c = room.getClient(); - if (!s.isEmpty() && c != null) { - ExtendedClientProperties cp = WebSession.get().getExtendedProperties(); - cp.setSettings(new JSONObject(s.toString())).update(c); - if (!avInited) { - avInited = true; - if (Room.Type.CONFERENCE == room.getRoom().getType()) { - if (!activityAllowed(c, Client.Activity.AUDIO, c.getRoom())) { - c.allow(Room.Right.AUDIO); - } - if (!c.getRoom().isAudioOnly() && !activityAllowed(c, Client.Activity.VIDEO, c.getRoom())) { - c.allow(Room.Right.VIDEO); - } - streamProcessor.toggleActivity(c, c.getRoom().isAudioOnly() - ? Client.Activity.AUDIO - : Client.Activity.AUDIO_VIDEO); - } - } - cm.update(c); - room.broadcast(c); - } - } - }; @SpringBean private ClientManager cm; @@ -131,7 +91,6 @@ public class RoomSidebar extends Panel { add(fileTab.setVisible(!room.isInterview()), roomFiles.setVisible(!room.isInterview())); add(addFolder, settings); - add(avSettings); add(confirmKick = new ConfirmationDialog("confirm-kick", new ResourceModel("603"), new ResourceModel("605")) { private static final long serialVersionUID = 1L; @@ -145,12 +104,6 @@ public class RoomSidebar extends Panel { add(activities = new ActivitiesPanel("activities", room)); } - @Override - public void renderHead(IHeaderResponse response) { - super.renderHead(response); - response.render(new PriorityHeaderItem(getNamedFunction(FUNC_SETTINGS, avSettings, explicit(PARAM_SETTINGS)))); - } - private void updateShowFiles(IPartialPageRequestHandler handler) { if (room.isInterview()) { return;