[OPENMEETINGS-551] fallback handling and volume slider are added
Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/a600e321 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/a600e321 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/a600e321 Branch: refs/heads/master Commit: a600e321f9dd4ccc8a1efe3cd7f2bb8ccf0877f0 Parents: a4d2a56 Author: Maxim Solodovnik <[email protected]> Authored: Fri Apr 21 01:27:01 2017 +0000 Committer: Maxim Solodovnik <[email protected]> Committed: Fri Apr 21 01:27:01 2017 +0000 ---------------------------------------------------------------------- .../openmeetings/db/entity/basic/Client.java | 11 ++++-- .../flex/org/apache/openmeetings/OmVideo.as | 37 ++++++++++++-------- .../apache/openmeetings/web/room/RoomPanel.html | 12 +++++++ .../apache/openmeetings/web/room/RoomPanel.java | 29 ++++++++++----- .../org/apache/openmeetings/web/room/room.js | 24 +++++++++++++ .../web/room/sidebar/RoomSidebar.java | 2 +- openmeetings-web/src/main/webapp/css/room.css | 14 +++++++- 7 files changed, 102 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java ---------------------------------------------------------------------- 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 0f8fc82..19e9787 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 @@ -342,7 +342,7 @@ public class Client implements IClient { return true; } - public JSONObject toJson() { + public JSONObject toJson(boolean self) { JSONObject u = new JSONObject(); if (user != null) { JSONObject a = new JSONObject(); @@ -356,7 +356,7 @@ public class Client implements IClient { a.put("country", user.getAddress().getCountry()); } } - return new JSONObject() + JSONObject json = new JSONObject() .put("user", u) .put("uid", uid) .put("rights", new JSONArray(rights)) @@ -364,7 +364,12 @@ public class Client implements IClient { .put("pod", pod) .put("broadcastId", broadcastId) .put("width", width) - .put("height", height); + .put("height", height) + .put("self", self); + if (self) { + json.put("cam", cam).put("mic", mic); + } + return json; } @Override http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as index 5538f46..c32e8a2 100644 --- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as +++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as @@ -45,6 +45,7 @@ public class OmVideo { public var height:int; private var mode:String; private var params:Object; + private var url:String; private var fallback:Boolean; public function OmVideo(ui:UIComponent, params:Object) { @@ -97,9 +98,6 @@ public class OmVideo { private function createStream():void { debug("createStream: "); ns = new NetStream(nc); - //see: http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/NetStream.html - //according to the docs the construct to catch event has to be implemented like this. - //var t = this; ns.client = { onMetaData: function(metadata:Object):void { debug("onMetaData: ", metadata); @@ -137,7 +135,6 @@ public class OmVideo { if (cam != null) { ns.attachCamera(cam); - //invokes Method in baseVideoView which shows the cam attachCamera(cam); var videoStreamSettings:VideoStreamSettings = null; @@ -166,17 +163,33 @@ public class OmVideo { } } + private function _connect(url:String):void { + nc.connect(url, { + uid: params.uid + , sid: params.sid + , nativeSsl: 'best' == params.proxyType + }); + } + private function connect(callback:Function):void { if (nc == null || !nc.connected) { - var url:String = params.url; //TODO fallback + url = params.url; debug("NetConnection is not connected", url); nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void { debug("ConnectionStatus: " + e.info.code); - if (e.info.code == "NetConnection.Connect.Success") { - callback(); - } else { - //TODO + switch (e.info.code) { + case 'NetConnection.Connect.Failed': + if (!fallback) { + fallback = true; + url = params.fallback; + _connect(url); + } + break; + case 'NetConnection.Connect.Success': + callback(); + break; + //TODO other cases } }); nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function (event:AsyncErrorEvent):void { @@ -197,11 +210,7 @@ public class OmVideo { debug("id: " + id); //TODO save connection id } }; - nc.connect(url, { - uid: params.uid - , sid: params.sid - , nativeSsl: 'best' == params.proxyType - }); + _connect(url); } else { callback(); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html ---------------------------------------------------------------------- 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 87afb87..3f30083 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 @@ -46,6 +46,18 @@ <div id="user-video"> <div class="video"></div> </div> + <div id="video-volume-btn"> + <a class="ui-dialog-titlebar-volume ui-corner-all ui-state-default" href="#" title="volume" role="button" data-toggle="dropdown"> + <span class="ui-icon ui-icon-triangle-2-n-s">volume</span> + </a> + <ul class="dropdown-menu video volume"> + <li> + <div class="slider"> + <div class="ui-slider-handle handle"></div> + </div> + </li> + </ul> + </div> </div> </wicket:panel> </html> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java ---------------------------------------------------------------------- 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 315acc0..0cf02f3 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 @@ -161,7 +161,7 @@ public class RoomPanel extends BasePanel { for (Client c: getRoomClients(getRoom().getId()) ){ boolean self = getClient().getUid().equals(c.getUid()); if (!self) { - JSONObject json = c.toJson().put("sid", getSid()).put("self", self); + JSONObject json = c.toJson(self).put("sid", getSid()); // TODO we should check if client is screenShare, see onEvent newStream case. target.appendJavaScript(String.format("VideoManager.play(%s);", json)); } @@ -344,7 +344,7 @@ public class RoomPanel extends BasePanel { log.error("Not existing user has stopped recording {} !!!!", uid); return; } - c.getActivities().remove(Client.Activity.record); + c.remove(Client.Activity.record); } break; case recordingStarted: @@ -356,17 +356,30 @@ public class RoomPanel extends BasePanel { log.error("Not existing user has started recording {} !!!!", recordingUser); return; } - c.getActivities().add(Client.Activity.record); + c.set(Client.Activity.record); } break; case sharingStoped: - //TODO check sharingUser == ((TextRoomMessage)m).getText(); - sharingUser = null; - menu.update(handler); + { + sharingUser = null; + Client c = getOnlineClient(((TextRoomMessage)m).getText()); + if (c == null) { + log.error("Not existing user has started sharing {} !!!!", sharingUser); + return; + } + c.remove(Client.Activity.share); + menu.update(handler); + } break; case sharingStarted: { sharingUser = ((TextRoomMessage)m).getText(); + Client c = getOnlineClient(sharingUser); + if (c == null) { + log.error("Not existing user has started sharing {} !!!!", sharingUser); + return; + } + c.set(Client.Activity.share); menu.update(handler); } break; @@ -374,7 +387,7 @@ public class RoomPanel extends BasePanel { { Client c = getOnlineClient(((TextRoomMessage)m).getText()); handler.appendJavaScript(String.format("VideoManager.update(%s);" - , c.toJson().put("sid", getSid()).put("self", getClient().getUid().equals(c.getUid())))); + , c.toJson(getClient().getUid().equals(c.getUid())).put("sid", getSid()))); sidebar.update(handler); menu.update(handler); wb.update(handler); @@ -386,7 +399,7 @@ public class RoomPanel extends BasePanel { Client c = getOnlineClient(obj.getString("uid")); boolean self = getClient().getUid().equals(c.getUid()); if (!self) { - JSONObject json = c.toJson().put("sid", getSid()).put("self", self); + JSONObject json = c.toJson(self).put("sid", getSid()); if (obj.optBoolean("screenShare", false)) { json.put("screenShare", true) .put("uid", obj.getString("suid")) // unique screen-sharing ID http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js index cd182c0..1b2d687 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js @@ -63,6 +63,30 @@ var Video = (function() { , dblclick: "collapse" }); t = v.parent().find('.ui-dialog-titlebar').attr('title', name); + v.parent().find('.ui-dialog-titlebar-buttonpane').append($('#video-volume-btn').children().clone()); + var volume = v.parent().find('.dropdown-menu.video.volume'); + v.parent().find('.ui-dialog-titlebar-volume').click(function(e) { + e.stopImmediatePropagation(); + volume.toggle(); + }).dblclick(function(e) { + e.stopImmediatePropagation(); + }); + var handle = v.parent().find('.slider .handle'); + v.parent().find('.slider').slider({ + orientation: 'vertical' + , range: 'min' + , min: 0 + , max: 100 + , value: 60 + , slide: function(event, ui) { + } + , create: function() { + handle.text($(this).slider("value")); + } + , slide: function(event, ui) { + handle.text(ui.value); + } + }); vc = v.find('.video'); vc.width(_w).height(_h); //broadcast http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java ---------------------------------------------------------------------- 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 168bea9..17b6973 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 @@ -414,7 +414,7 @@ public class RoomSidebar extends Panel { } Pod pod = c.getPod(); c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger()); - if (pod != Pod.none && pod != c.getPod()) { + if (pod != null && pod != Pod.none && pod != c.getPod()) { //pod has changed, no need to toggle c.set(a); } else { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a600e321/openmeetings-web/src/main/webapp/css/room.css ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/css/room.css b/openmeetings-web/src/main/webapp/css/room.css index 04d3a2b..cf437c1 100644 --- a/openmeetings-web/src/main/webapp/css/room.css +++ b/openmeetings-web/src/main/webapp/css/room.css @@ -354,10 +354,22 @@ } .ui-dialog.video, .ui-dialog.video .ui-dialog-titlebar, .ui-dialog.video .ui-dialog-content { padding: 0; +} +.ui-dialog.video .ui-dialog-content { overflow: hidden; } .ui-dialog.video .ui-dialog-titlebar { - padding-left:10px + padding-left: 10px +} +.dropdown-menu.video.volume, .dropdown-menu.video.volume li { + width: 20px; + min-width: 20px; + border-radius: 0; + border: 0; + box-shadow: initial; + left: 50px; + top: -50px; + background-color: transparent; } .ui-dialog.video .title { font-weight: bold;
