Author: solomax
Date: Wed Feb 22 08:56:05 2017
New Revision: 1783980

URL: http://svn.apache.org/viewvc?rev=1783980&view=rev
Log:
[OPENMEETINGS-1209] chat typing indicator is added

Modified:
    
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
    
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/user/chat/Chat.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
    
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
    
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/user/chat/Chat.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
 Wed Feb 22 08:56:05 2017
@@ -30,7 +30,6 @@ import java.util.Set;
 
 import javax.activation.MimetypesFileTypeMap;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.wicket.util.string.Strings;
 
 public class StoredFile {
@@ -67,7 +66,7 @@ public class StoredFile {
                ext.addAll(pdfExtensions);
                ext.addAll(chartExtensions);
                StringBuilder sb = new 
StringBuilder("audio/*,video/*,image/*,.");
-               sb.append(StringUtils.join(ext, ",.")); // TODO java8 
String.join("|.", ext);
+               sb.append(String.join("|.", ext));
                return sb.toString();
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
 Wed Feb 22 08:56:05 2017
@@ -20,8 +20,8 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org";>
 <wicket:panel>
-       <div class="room container">
-               <div wicket:id="roomContainer" style="height: 100%">
+       <div class="room holder">
+               <div class="room container" wicket:id="roomContainer">
                        <div class="room menu" wicket:id="menu"></div>
                        <div class="room sidebar left" 
wicket:id="sidebar"></div>
                        <div wicket:id="wb-area" class="room wb area">

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=1783980&r1=1783979&r2=1783980&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
 Wed Feb 22 08:56:05 2017
@@ -63,6 +63,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -151,6 +152,7 @@ public class RoomPanel extends BasePanel
                Component eventDetail = new 
WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
 
                room.add(menu = new RoomMenuPanel("menu", this));
+               room.add(AttributeAppender.append("data-room-id", r.getId()));
                Droppable<FileItem> wbArea = new Droppable<FileItem>("wb-area") 
{
                        private static final long serialVersionUID = 1L;
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 Wed Feb 22 08:56:05 2017
@@ -78,22 +78,32 @@ public class Chat extends Panel {
        private static final Logger log = 
Red5LoggerFactory.getLogger(Chat.class, webAppRootKey);
        private static final String PARAM_MSG_ID = "msgid";
        private static final String PARAM_ROOM_ID = "roomid";
-       private final AbstractDefaultAjaxBehavior acceptMessage = new 
AbstractDefaultAjaxBehavior() {
+       private static final String PARAM_TYPE = "type";
+       private final AbstractDefaultAjaxBehavior chatActivity = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
 
                @Override
                protected void respond(AjaxRequestTarget target) {
                        try {
-                               long msgId = 
getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong();
+                               String type = 
getRequest().getRequestParameters().getParameterValue(PARAM_TYPE).toString(null);
                                long roomId = 
getRequest().getRequestParameters().getParameterValue(PARAM_ROOM_ID).toLong();
-                               ChatDao dao = getBean(ChatDao.class);
-                               ChatMessage m = dao.get(msgId);
-                               if (m.isNeedModeration() && 
isModerator(getUserId(), roomId)) {
-                                       m.setNeedModeration(false);
-                                       dao.update(m);
-                                       WebSocketHelper.sendRoom(m, 
getMessage(Arrays.asList(m)).put("mode",  "accept"));
-                               } else {
-                                       log.error("It seems like we are being 
hacked!!!!");
+                               if ("accept".equals(type)) {
+                                       long msgId = 
getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong();
+                                       ChatDao dao = getBean(ChatDao.class);
+                                       ChatMessage m = dao.get(msgId);
+                                       if (m.isNeedModeration() && 
isModerator(getUserId(), roomId)) {
+                                               m.setNeedModeration(false);
+                                               dao.update(m);
+                                               WebSocketHelper.sendRoom(m, 
getMessage(Arrays.asList(m)).put("mode",  "accept"));
+                                       } else {
+                                               log.error("It seems like we are 
being hacked!!!!");
+                                       }
+                               } else if (type != null && 
type.indexOf("typing") > -1) {
+                                       WebSocketHelper.sendRoom(roomId
+                                                       , new 
JSONObject().put("type", "typing")
+                                                                       
.put("active", type.indexOf("start") > -1)
+                                                                       
.put("uid", getUid())
+                                                                       
.toString());
                                }
                        } catch (Exception e) {
                                log.error("Unexpected exception while accepting 
chat message", e);
@@ -101,6 +111,10 @@ public class Chat extends Panel {
                }
        };
 
+       private String getUid() {
+               return findParent(MainPanel.class).getClient().getUid(); //TODO 
HACK
+       }
+
        public JSONObject getMessage(List<ChatMessage> list) {
                return getMessage(getUserId(), list);
        }
@@ -114,7 +128,7 @@ public class Chat extends Panel {
                setOutputMarkupPlaceholderTag(true);
                setMarkupId(id);
 
-               add(acceptMessage);
+               add(chatActivity);
                add(new ChatForm("sendForm"));
        }
 
@@ -142,7 +156,7 @@ public class Chat extends Panel {
                response.render(new 
PriorityHeaderItem(JavaScriptHeaderItem.forReference(new 
JavaScriptResourceReference(Chat.class, "chat.js"))));
                
response.render(CssHeaderItem.forReference(EMOTIONS_CSS_REFERENCE));
                response.render(CssHeaderItem.forUrl("css/chat.css"));
-               response.render(new 
PriorityHeaderItem(getNamedFunction("acceptMessage", acceptMessage, 
explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
+               response.render(new 
PriorityHeaderItem(getNamedFunction("chatActivity", chatActivity, 
explicit(PARAM_TYPE), explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
 
                ChatDao dao = getBean(ChatDao.class);
                //FIXME limited count should be loaded with "earlier" link
@@ -205,8 +219,7 @@ public class Chat extends Panel {
                                                dao.update(m);
                                                JSONObject msg = 
getMessage(Arrays.asList(m));
                                                if (m.getToRoom() != null) {
-                                                       String uid = 
findParent(MainPanel.class).getClient().getUid(); //TODO HACK
-                                                       
getBean(MobileService.class).sendChatMessage(uid, m, getDateFormat()); //let's 
send to mobile users
+                                                       
getBean(MobileService.class).sendChatMessage(getUid(), m, getDateFormat()); 
//let's send to mobile users
                                                        
WebSocketHelper.sendRoom(m, msg);
                                                } else if (m.getToUser() != 
null) {
                                                        
WebSocketHelper.sendUser(getUserId(), msg.toString());

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
 Wed Feb 22 08:56:05 2017
@@ -20,7 +20,7 @@ var Chat = function() {
        var chatTabs
                , tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
                , msgTemplate = "<div id='chat-msg-id-#{id}'><img 
class='profile' src='#{imgSrc}'/><span class='from' 
data-user-id='#{userId}'>#{from}</span><span class='date 
align-right'>#{sent}</span>#{msg}</div>"
-               , acceptTemplate = "<div class='tick om-icon align-right 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var 
e=$(this);acceptMessage(e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
+               , acceptTemplate = "<div class='tick om-icon align-right 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var 
e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
                , infoTemplate = "<div class='user om-icon align-right 
clickable' data-user-id='#{userId}' onclick='var 
e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
                , addTemplate = "<div class='add om-icon align-right clickable' 
data-user-id='#{userId}' onclick='var 
e=$(this);addContact(e.data(\"userId\"));'></div>"
                , messageTemplate = "<div class='new-email om-icon align-right 
clickable' data-user-id='#{userId}' onclick='var 
e=$(this);privateMessage(e.data(\"userId\"));'></div>"
@@ -31,8 +31,15 @@ var Chat = function() {
                , openedHeight = "345px"
                , allPrefix = "All"
                , roomPrefix = "Room "
-               , emoticon = new CSSEmoticon();
-       
+               , emoticon = new CSSEmoticon()
+               , typingTimer
+               , doneTypingInterval = 5000 //time in ms, 5 second for example
+               ;
+
+       function doneTyping () {
+               typingTimer = null;
+               chatActivity('typing_stop', 
$('.room.container').data('room-id'));
+       }
        function emtClick(emoticon) {
                var editor = $('#chatMessage .wysiwyg-editor');
                editor.html(editor.html() + ' ' + emoticon + ' ');
@@ -94,6 +101,17 @@ var Chat = function() {
                                        openedHeight = ui.size.height + "px";
                                }
                        });
+                       $('#chatMessage').off().on('input propertychange 
paste', function () {
+                               var room = $('.room.container');
+                               if (room.length) {
+                                       if (!!typingTimer) {
+                                               clearTimeout(typingTimer);
+                                       } else {
+                                               chatActivity('typing_start', 
room.data('room-id'));
+                                       }
+                                       typingTimer = setTimeout(doneTyping, 
doneTypingInterval);
+                               }
+                       });
                }
                , removeTab: function(id) {
                        $('li[aria-controls="' + id + '"]').remove();
@@ -194,6 +212,11 @@ $(function() {
                                        case "chat":
                                                Chat.addMessage(m);
                                                break;
+                                       case "typing":
+                                               if (typeof typingActivity == 
"function") {
+                                                       typingActivity(m.uid, 
m.active);
+                                               }
+                                               break;
                                }
                        }
                } catch (err) {

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
 Wed Feb 22 08:56:05 2017
@@ -19,9 +19,12 @@
 .room.sidebar #busy-indicator {
        margin: 8px;
 }
-.room.container {
+.room.holder {
        width: 100%;
 }
+.room.container {
+       height: 100%;
+}
 .ui-icon.room.menu.exit {
        background-image: url(images/exit_button.png);
        background-repeat: no-repeat;

Modified: 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java
 Wed Feb 22 08:56:05 2017
@@ -30,7 +30,6 @@ import java.util.Set;
 
 import javax.activation.MimetypesFileTypeMap;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.wicket.util.string.Strings;
 
 public class StoredFile {
@@ -67,7 +66,7 @@ public class StoredFile {
                ext.addAll(pdfExtensions);
                ext.addAll(chartExtensions);
                StringBuilder sb = new 
StringBuilder("audio/*,video/*,image/*,.");
-               sb.append(StringUtils.join(ext, ",.")); // TODO java8 
String.join("|.", ext);
+               sb.append(String.join("|.", ext));
                return sb.toString();
        }
 

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
 Wed Feb 22 08:56:05 2017
@@ -20,8 +20,8 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org";>
 <wicket:panel>
-       <div class="room container">
-               <div wicket:id="roomContainer" style="height: 100%">
+       <div class="room holder">
+               <div class="room container" wicket:id="roomContainer">
                        <div class="room menu" wicket:id="menu"></div>
                        <div class="room sidebar left" 
wicket:id="sidebar"></div>
                        <div wicket:id="wb-area" class="room wb area">

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=1783980&r1=1783979&r2=1783980&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
 Wed Feb 22 08:56:05 2017
@@ -63,6 +63,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -161,6 +162,7 @@ public class RoomPanel extends BasePanel
                Component eventDetail = new 
WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
 
                room.add(menu = new RoomMenuPanel("menu", this));
+               room.add(AttributeAppender.append("data-room-id", r.getId()));
                Droppable<FileItem> wbArea = new Droppable<FileItem>("wb-area") 
{
                        private static final long serialVersionUID = 1L;
 

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
 Wed Feb 22 08:56:05 2017
@@ -78,22 +78,32 @@ public class Chat extends Panel {
        private static final Logger log = 
Red5LoggerFactory.getLogger(Chat.class, webAppRootKey);
        private static final String PARAM_MSG_ID = "msgid";
        private static final String PARAM_ROOM_ID = "roomid";
-       private final AbstractDefaultAjaxBehavior acceptMessage = new 
AbstractDefaultAjaxBehavior() {
+       private static final String PARAM_TYPE = "type";
+       private final AbstractDefaultAjaxBehavior chatActivity = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
 
                @Override
                protected void respond(AjaxRequestTarget target) {
                        try {
-                               long msgId = 
getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong();
+                               String type = 
getRequest().getRequestParameters().getParameterValue(PARAM_TYPE).toString(null);
                                long roomId = 
getRequest().getRequestParameters().getParameterValue(PARAM_ROOM_ID).toLong();
-                               ChatDao dao = getBean(ChatDao.class);
-                               ChatMessage m = dao.get(msgId);
-                               if (m.isNeedModeration() && 
isModerator(getUserId(), roomId)) {
-                                       m.setNeedModeration(false);
-                                       dao.update(m);
-                                       WebSocketHelper.sendRoom(m, 
getMessage(Arrays.asList(m)).put("mode",  "accept"));
-                               } else {
-                                       log.error("It seems like we are being 
hacked!!!!");
+                               if ("accept".equals(type)) {
+                                       long msgId = 
getRequest().getRequestParameters().getParameterValue(PARAM_MSG_ID).toLong();
+                                       ChatDao dao = getBean(ChatDao.class);
+                                       ChatMessage m = dao.get(msgId);
+                                       if (m.isNeedModeration() && 
isModerator(getUserId(), roomId)) {
+                                               m.setNeedModeration(false);
+                                               dao.update(m);
+                                               WebSocketHelper.sendRoom(m, 
getMessage(Arrays.asList(m)).put("mode",  "accept"));
+                                       } else {
+                                               log.error("It seems like we are 
being hacked!!!!");
+                                       }
+                               } else if (type != null && 
type.indexOf("typing") > -1) {
+                                       WebSocketHelper.sendRoom(roomId
+                                                       , new 
JSONObject().put("type", "typing")
+                                                                       
.put("active", type.indexOf("start") > -1)
+                                                                       
.put("uid", getUid())
+                                                                       
.toString());
                                }
                        } catch (Exception e) {
                                log.error("Unexpected exception while accepting 
chat message", e);
@@ -101,6 +111,10 @@ public class Chat extends Panel {
                }
        };
 
+       private String getUid() {
+               return findParent(MainPanel.class).getClient().getUid(); //TODO 
HACK
+       }
+
        public JSONObject getMessage(List<ChatMessage> list) {
                return getMessage(getUserId(), list);
        }
@@ -114,7 +128,7 @@ public class Chat extends Panel {
                setOutputMarkupPlaceholderTag(true);
                setMarkupId(id);
 
-               add(acceptMessage);
+               add(chatActivity);
                add(new ChatForm("sendForm"));
        }
 
@@ -142,7 +156,7 @@ public class Chat extends Panel {
                response.render(new 
PriorityHeaderItem(JavaScriptHeaderItem.forReference(new 
JavaScriptResourceReference(Chat.class, "chat.js"))));
                
response.render(CssHeaderItem.forReference(EMOTIONS_CSS_REFERENCE));
                response.render(CssHeaderItem.forUrl("css/chat.css"));
-               response.render(new 
PriorityHeaderItem(getNamedFunction("acceptMessage", acceptMessage, 
explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
+               response.render(new 
PriorityHeaderItem(getNamedFunction("chatActivity", chatActivity, 
explicit(PARAM_TYPE), explicit(PARAM_ROOM_ID), explicit(PARAM_MSG_ID))));
 
                ChatDao dao = getBean(ChatDao.class);
                //FIXME limited count should be loaded with "earlier" link
@@ -205,8 +219,7 @@ public class Chat extends Panel {
                                                dao.update(m);
                                                JSONObject msg = 
getMessage(Arrays.asList(m));
                                                if (m.getToRoom() != null) {
-                                                       String uid = 
findParent(MainPanel.class).getClient().getUid(); //TODO HACK
-                                                       
getBean(MobileService.class).sendChatMessage(uid, m, getDateFormat()); //let's 
send to mobile users
+                                                       
getBean(MobileService.class).sendChatMessage(getUid(), m, getDateFormat()); 
//let's send to mobile users
                                                        
WebSocketHelper.sendRoom(m, msg);
                                                } else if (m.getToUser() != 
null) {
                                                        
WebSocketHelper.sendUser(getUserId(), msg.toString());

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat.js
 Wed Feb 22 08:56:05 2017
@@ -20,7 +20,7 @@ var Chat = function() {
        var chatTabs
                , tabTemplate = "<li><a href='#{href}'>#{label}</a></li>"
                , msgTemplate = "<div id='chat-msg-id-#{id}'><img 
class='profile' src='#{imgSrc}'/><span class='from' 
data-user-id='#{userId}'>#{from}</span><span class='date 
align-right'>#{sent}</span>#{msg}</div>"
-               , acceptTemplate = "<div class='tick om-icon align-right 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var 
e=$(this);acceptMessage(e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
+               , acceptTemplate = "<div class='tick om-icon align-right 
clickable' data-msgid='#{msgid}' data-roomid='#{roomid}' onclick='var 
e=$(this);chatActivity('accept',e.data(\"roomid\"),e.data(\"msgid\"));e.parent().remove();'></div>"
                , infoTemplate = "<div class='user om-icon align-right 
clickable' data-user-id='#{userId}' onclick='var 
e=$(this);showUserInfo(e.data(\"userId\"));'></div>"
                , addTemplate = "<div class='add om-icon align-right clickable' 
data-user-id='#{userId}' onclick='var 
e=$(this);addContact(e.data(\"userId\"));'></div>"
                , messageTemplate = "<div class='new-email om-icon align-right 
clickable' data-user-id='#{userId}' onclick='var 
e=$(this);privateMessage(e.data(\"userId\"));'></div>"
@@ -31,8 +31,15 @@ var Chat = function() {
                , openedHeight = "345px"
                , allPrefix = "All"
                , roomPrefix = "Room "
-               , emoticon = new CSSEmoticon();
-       
+               , emoticon = new CSSEmoticon()
+               , typingTimer
+               , doneTypingInterval = 5000 //time in ms, 5 second for example
+               ;
+
+       function doneTyping () {
+               typingTimer = null;
+               chatActivity('typing_stop', 
$('.room.container').data('room-id'));
+       }
        function emtClick(emoticon) {
                var editor = $('#chatMessage .wysiwyg-editor');
                editor.html(editor.html() + ' ' + emoticon + ' ');
@@ -94,6 +101,17 @@ var Chat = function() {
                                        openedHeight = ui.size.height + "px";
                                }
                        });
+                       $('#chatMessage').off().on('input propertychange 
paste', function () {
+                               var room = $('.room.container');
+                               if (room.length) {
+                                       if (!!typingTimer) {
+                                               clearTimeout(typingTimer);
+                                       } else {
+                                               chatActivity('typing_start', 
room.data('room-id'));
+                                       }
+                                       typingTimer = setTimeout(doneTyping, 
doneTypingInterval);
+                               }
+                       });
                }
                , removeTab: function(id) {
                        $('li[aria-controls="' + id + '"]').remove();
@@ -194,6 +212,11 @@ $(function() {
                                        case "chat":
                                                Chat.addMessage(m);
                                                break;
+                                       case "typing":
+                                               if (typeof typingActivity == 
"function") {
+                                                       typingActivity(m.uid, 
m.active);
+                                               }
+                                               break;
                                }
                        }
                } catch (err) {

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css?rev=1783980&r1=1783979&r2=1783980&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css 
(original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css 
Wed Feb 22 08:56:05 2017
@@ -19,9 +19,12 @@
 .room.sidebar #busy-indicator {
        margin: 8px;
 }
-.room.container {
+.room.holder {
        width: 100%;
 }
+.room.container {
+       height: 100%;
+}
 .ui-icon.room.menu.exit {
        background-image: url(images/exit_button.png);
        background-repeat: no-repeat;


Reply via email to