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 d1e3cd4  [OPENMEETINGS-1352] initial JS sharing dialog
d1e3cd4 is described below

commit d1e3cd4dbf539dd5f9f0df65858fc1cb0f7390aa
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Thu Oct 25 23:26:45 2018 +0700

    [OPENMEETINGS-1352] initial JS sharing dialog
---
 .../org/apache/openmeetings/core/remote/KRoom.java |  7 +++--
 .../openmeetings/core/remote/KurentoHandler.java   | 26 +++++++++++++----
 .../apache/openmeetings/web/room/RoomPanel.html    | 33 ++++++++++++++++++++++
 .../apache/openmeetings/web/room/RoomPanel.java    |  4 +--
 .../openmeetings/web/room/menu/ActionsSubMenu.java |  2 +-
 .../openmeetings/web/room/menu/RoomMenuPanel.html  |  2 +-
 .../web/room/menu/StartSharingButton.java          | 18 ++----------
 .../org/apache/openmeetings/web/room/raw-room.js   | 33 +++++++++++++++++++++-
 .../org/apache/openmeetings/web/room/raw-video.js  |  5 +++-
 openmeetings-web/src/main/webapp/css/raw-room.css  |  7 +++++
 10 files changed, 107 insertions(+), 30 deletions(-)

diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 7164f62..9fd35d7 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -177,14 +177,17 @@ public class KRoom {
                return sharingStarted.get();
        }
 
-       public void startSharing(KurentoHandler h, IClientManager cm, Client c) 
{
+       public void startSharing(KurentoHandler h, IClientManager cm, Client c, 
JSONObject msg) {
                if (sharingStarted.compareAndSet(false, true)) {
                        StreamDesc sd = c.addStream(StreamType.SCREEN);
+                       
sd.setWidth(msg.getInt("width")).setHeight(msg.getInt("height"));
                        cm.update(c);
                        log.debug("User {}: has started broadcast", 
sd.getUid());
                        h.sendClient(sd.getSid(), newKurentoMsg()
                                        .put("id", "broadcast")
-                                       .put("stream", sd.toJson())
+                                       .put("stream", sd.toJson()
+                                                       .put("shareType", 
msg.getString("shareType"))
+                                                       .put("fps", 
msg.getString("fps")))
                                        .put("iceServers", h.getTurnServers()));
                }
        }
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index a0a94a3..6e0355d 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -52,6 +52,7 @@ import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.apache.openmeetings.db.entity.record.Recording;
 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.manager.IClientManager;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
@@ -275,6 +276,11 @@ public class KurentoHandler {
                                                sender.addListener(this, 
c.getSid(), c.getUid(), msg.getString("sdpOffer"));
                                        }
                                        break;
+                               case "wannaShare":
+                                       if (screenShareAllowed(c)) {
+                                               startSharing(c, msg);
+                                       }
+                                       break;
                        }
                }
        }
@@ -299,7 +305,7 @@ public class KurentoHandler {
                if (room.isSharing()) {
                        List<StreamDesc> streams = 
cm.listByRoom(roomId).parallelStream()
                                        .flatMap(c -> c.getStreams().stream())
-                                       .filter(sd -> StreamType.SCREEN != 
sd.getType()).collect(Collectors.toList());
+                                       .filter(sd -> StreamType.SCREEN == 
sd.getType()).collect(Collectors.toList());
                        if (streams.isEmpty()) {
                                log.info("No more screen streams in the room, 
stopping sharing");
                                room.stopSharing();
@@ -335,10 +341,12 @@ public class KurentoHandler {
                                boolean changed = false;
                                for (StreamDesc sd : c.getStreams()) {
                                        KStream s = getByUid(sd.getUid());
-                                       if (s != null) {
+                                       if (StreamType.WEBCAM == sd.getType()) {
+                                               if (s != null) {
+                                                       s.stopBroadcast(this);
+                                               }
                                                c.removeStream(sd.getUid());
                                                changed = true;
-                                               s.stopBroadcast(this);
                                        }
                                }
                                if (changed) {
@@ -408,8 +416,16 @@ public class KurentoHandler {
                return getRoom(roomId).getRecordingUser();
        }
 
-       public void startSharing(Client c) {
-               getRoom(c.getRoomId()).startSharing(this, cm, c);
+       public boolean screenShareAllowed(Client c) {
+               Room r = c.getRoom();
+               return r != null && Room.Type.interview != r.getType()
+                               && !r.isHidden(RoomElement.ScreenSharing)
+                               && r.isAllowRecording() && 
c.hasRight(Right.share)
+                               && !isSharing(r.getId());
+       }
+
+       private void startSharing(Client c, JSONObject msg) {
+               getRoom(c.getRoomId()).startSharing(this, cm, c, msg);
        }
 
        public boolean isSharing(Long roomId) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
index 188dec7..a153ecc 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
@@ -86,6 +86,39 @@
                                <span class="badge">0</span>
                        </div>
                </div>
+               <div id="sharer" wicket:message="title:730">
+                       <div>
+                               <span class="label"><wicket:message 
key="734"/></span>
+                               <select name="type" class="type">
+                                       <option value="screen">Screen</option>
+                                       <option value="window">Window</option>
+                                       <option 
value="application">Application</option>
+                               </select>
+                       </div>
+                       <div>
+                               <span class="label"><wicket:message 
key="740"/></span>
+                               <input class="width" type="number" value="800"/>
+                       </div>
+                       <div>
+                               <span class="label"><wicket:message 
key="741"/></span>
+                               <input class="height" type="number" 
value="600"/>
+                       </div>
+                       <div>
+                               <span class="label"><wicket:message 
key="1089"/></span>
+                               <select name="fps" class="fps">
+                                       <option value="2">2 FPS</option>
+                                       <option value="5">5 FPS</option>
+                                       <option value="10" selected>10 
FPS</option>
+                                       <option value="15">15 FPS</option>
+                                       <option value="20">20 FPS</option>
+                                       <option value="25">25 FPS</option>
+                                       <option value="30">30 FPS</option>
+                               </select>
+                       </div>
+                       <hr/>
+                       <button class="share-start-stop" 
wicket:message="data-start:732, data-stop:733"><wicket:message 
key="732"/></button>
+                       <button class="record-start-stop ui-state-error" 
wicket:message="data-start:871, data-stop:872"><wicket:message 
key="872"/></button>
+               </div>
        </div>
 </wicket:panel>
 </html>
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 adc6f6f..6280061 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
@@ -738,9 +738,7 @@ public class RoomPanel extends BasePanel {
        }
 
        public boolean screenShareAllowed() {
-               return !interview && !r.isHidden(RoomElement.ScreenSharing)
-                               && r.isAllowRecording() && 
getClient().hasRight(Right.share)
-                               && !kHandler.isSharing(r.getId());
+               return kHandler.screenShareAllowed(getClient());
        }
 
        public RoomSidebar getSidebar() {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
index 42feac2..be5f7ad 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/ActionsSubMenu.java
@@ -78,7 +78,7 @@ public class ActionsSubMenu implements Serializable {
 
                        @Override
                        public void onClick(AjaxRequestTarget target) {
-                               shareBtn.onClick(target);
+                               
target.appendJavaScript(String.format("$('#%s').click()", 
shareBtn.getMarkupId()));
                        }
                };
                applyModerMenuItem = new RoomMenuItem(mp.getString("784"), 
mp.getString("1481"), false) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
index 1d826e5..383bff3 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.html
@@ -25,7 +25,7 @@
                <span class="icon shared ui-button ui-corner-all ui-widget" 
wicket:message="data-user:692, data-text:850, data-view:848"
                                role="button" style="display: none;"></span>
                <span wicket:id="ask" class="icon ask"></span>
-               <span wicket:id="share" class="icon share" 
wicket:message="title:732"></span>
+               <span wicket:id="share" class="icon share" 
wicket:message="title:732" onclick="Room.share();"></span>
                <span wicket:id="roomName" class="room name"></span>
                <span wicket:id="tag" class="room name"></span>
                <span wicket:id="logo" class="icon"></span>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
index fd05fec..12d1d81 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/StartSharingButton.java
@@ -18,27 +18,13 @@
  */
 package org.apache.openmeetings.web.room.menu;
 
-import org.apache.openmeetings.core.remote.KurentoHandler;
-import org.apache.openmeetings.web.common.OmButton;
-import org.apache.openmeetings.web.room.RoomPanel;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.spring.injection.annot.SpringBean;
+import com.googlecode.wicket.jquery.ui.form.button.Button;
 
-public class StartSharingButton extends OmButton {
+public class StartSharingButton extends Button {
        private static final long serialVersionUID = 1L;
-       @SpringBean
-       private KurentoHandler kHandler;
 
        public StartSharingButton(String id) {
                super(id);
                setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true);
        }
-
-       @Override
-       public void onClick(AjaxRequestTarget target) {
-               RoomPanel rp = findParent(RoomPanel.class);
-               if (rp.screenShareAllowed()) {
-                       kHandler.startSharing(rp.getClient());
-               }
-       }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
index cf527c7..e53926c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-room.js
@@ -1,7 +1,7 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
 var Room = (function() {
        const self = {}, sbSide = Settings.isRtl ? 'right' : 'left';
-       let options, menuHeight, chat, sb, dock, activities;
+       let options, menuHeight, chat, sb, dock, activities, sharer;
 
        function _init(_options) {
                options = _options;
@@ -43,6 +43,30 @@ var Room = (function() {
                if (typeof(Activities) !== 'undefined') {
                        Activities.init();
                }
+               sharer = $('#sharer').dialog({
+                       width: 450
+                       , autoOpen: false
+               });
+               const type = sharer.find('select.type').selectmenu({
+                       width: 150
+               }), fps = sharer.find('select.fps').selectmenu({
+                       width: 120
+               }), sbtn = sharer.find('.share-start-stop').button({
+                       icon: 'ui-icon-image'
+               });
+               sbtn.click(function() {
+                       sbtn.button('disable');
+                       VideoManager.sendMessage({
+                               id: 'wannaShare'
+                               , shareType: type.val()
+                               , fps: fps.val()
+                               , width: sharer.find('.width').val()
+                               , height: sharer.find('.height').val()
+                       });
+               });
+               sharer.find('.record-start-stop').button({
+                       icon: 'ui-icon-bullet'
+               });
        }
        function _getSelfAudioClient() {
                const vw = $('#video' + Room.getOptions().uid);
@@ -187,6 +211,9 @@ var Room = (function() {
                $(window).off('keyup', _keyHandler);
                $(document).off('click', _mouseHandler);
                sb = undefined;
+               if (sharer && sharer.dialog('instance')) {
+                       sharer.dialog('close');
+               }
        }
        function _showClipboard(txt) {
                const dlg = $('#clipboard-dialog');
@@ -251,6 +278,9 @@ var Room = (function() {
                }
                OmUtil.tmpl('#quick-vote-template', 'quick-vote');
        }
+       function _share() {
+               sharer.dialog('open');
+       }
 
        self.init = _init;
        self.getMenuHeight = function() { return menuHeight; };
@@ -267,6 +297,7 @@ var Room = (function() {
        self.unload = _unload;
        self.showClipboard = _showClipboard;
        self.quickPoll = _quickPoll;
+       self.share = _share;
        return self;
 })();
 function startPrivateChat(el) {
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 24325ee..1d2daf5 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
@@ -60,7 +60,10 @@ var Video = (function() {
                        // 
https://mozilla.github.io/webrtc-landing/gum_test.html
                        const cnts = {
                                video: {
-                                       mediaSource: 'screen' // 
'window'/'application' //FIXME TODO different behavior
+                                       mediaSource: sd.shareType
+                                       , frameRate: sd.fps //TODO ideal
+                                        //TODO ideal width
+                                        //TODO ideal height
                                }};
                        
navigator.mediaDevices.getUserMedia(cnts).then(function(stream) {
                                callback(msg, cnts, stream);
diff --git a/openmeetings-web/src/main/webapp/css/raw-room.css 
b/openmeetings-web/src/main/webapp/css/raw-room.css
index 4a4b3e8..f938256 100644
--- a/openmeetings-web/src/main/webapp/css/raw-room.css
+++ b/openmeetings-web/src/main/webapp/css/raw-room.css
@@ -572,6 +572,13 @@ ul.settings-menu {
        display: inline-block;
        float: right;
 }
+#sharer .label {
+       width: 215px;
+       display: inline-block;
+}
+#sharer input {
+       width: 75px;
+}
 @media screen and (max-width: 1280px) {
        .room.sidebar {
                width: 155px;

Reply via email to