1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$ 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$ 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$ 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software. 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.lang.reflect.InvocationTargetException; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.lang.reflect.Method; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.PacketListener; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.Connection; 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.filter.PacketExtensionFilter; 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.filter.PacketFilter; 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.Message; 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.Packet; 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.MessageEvent; 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Manages message events requests and notifications. A MessageEventManager provides a high 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * level access to request for notifications and send event notifications. It also provides 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * an easy way to hook up custom logic when requests or notifications are received. 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class MessageEventManager { 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private List<MessageEventNotificationListener> messageEventNotificationListeners = new ArrayList<MessageEventNotificationListener>(); 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private List<MessageEventRequestListener> messageEventRequestListeners = new ArrayList<MessageEventRequestListener>(); 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Connection con; 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private PacketFilter packetFilter = new PacketExtensionFilter("x", "jabber:x:event"); 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private PacketListener packetListener; 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new message event manager. 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param con a Connection to a XMPP server. 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public MessageEventManager(Connection con) { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.con = con; 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen init(); 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds event notification requests to a message. For each event type that 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the user wishes event notifications from the message recepient for, <tt>true</tt> 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * should be passed in to this method. 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param message the message to add the requested notifications. 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param offline specifies if the offline event is requested. 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param delivered specifies if the delivered event is requested. 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param displayed specifies if the displayed event is requested. 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param composing specifies if the composing event is requested. 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static void addNotificationsRequests(Message message, boolean offline, 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen boolean delivered, boolean displayed, boolean composing) 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen { 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create a MessageEvent Package and add it to the message 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = new MessageEvent(); 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setOffline(offline); 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setDelivered(delivered); 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setDisplayed(displayed); 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setComposing(composing); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen message.addExtension(messageEvent); 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds a message event request listener. The listener will be fired anytime a request for 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * event notification is received. 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param messageEventRequestListener a message event request listener. 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void addMessageEventRequestListener(MessageEventRequestListener messageEventRequestListener) { 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventRequestListeners) { 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!messageEventRequestListeners.contains(messageEventRequestListener)) { 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventRequestListeners.add(messageEventRequestListener); 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Removes a message event request listener. The listener will be fired anytime a request for 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * event notification is received. 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param messageEventRequestListener a message event request listener. 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void removeMessageEventRequestListener(MessageEventRequestListener messageEventRequestListener) { 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventRequestListeners) { 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventRequestListeners.remove(messageEventRequestListener); 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds a message event notification listener. The listener will be fired anytime a notification 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * event is received. 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param messageEventNotificationListener a message event notification listener. 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void addMessageEventNotificationListener(MessageEventNotificationListener messageEventNotificationListener) { 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventNotificationListeners) { 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!messageEventNotificationListeners.contains(messageEventNotificationListener)) { 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventNotificationListeners.add(messageEventNotificationListener); 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Removes a message event notification listener. The listener will be fired anytime a notification 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * event is received. 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param messageEventNotificationListener a message event notification listener. 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void removeMessageEventNotificationListener(MessageEventNotificationListener messageEventNotificationListener) { 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventNotificationListeners) { 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventNotificationListeners.remove(messageEventNotificationListener); 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Fires message event request listeners. 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private void fireMessageEventRequestListeners( 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String from, 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String packetID, 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String methodName) { 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEventRequestListener[] listeners = null; 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Method method; 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventRequestListeners) { 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen listeners = new MessageEventRequestListener[messageEventRequestListeners.size()]; 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventRequestListeners.toArray(listeners); 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen method = 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEventRequestListener.class.getDeclaredMethod( 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen methodName, 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen new Class[] { String.class, String.class, MessageEventManager.class }); 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < listeners.length; i++) { 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen method.invoke(listeners[i], new Object[] { from, packetID, this }); 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (NoSuchMethodException e) { 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (InvocationTargetException e) { 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (IllegalAccessException e) { 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Fires message event notification listeners. 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private void fireMessageEventNotificationListeners( 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String from, 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String packetID, 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String methodName) { 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEventNotificationListener[] listeners = null; 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Method method; 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (messageEventNotificationListeners) { 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen listeners = 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen new MessageEventNotificationListener[messageEventNotificationListeners.size()]; 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEventNotificationListeners.toArray(listeners); 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen method = 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEventNotificationListener.class.getDeclaredMethod( 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen methodName, 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen new Class[] { String.class, String.class }); 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < listeners.length; i++) { 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen method.invoke(listeners[i], new Object[] { from, packetID }); 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (NoSuchMethodException e) { 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (InvocationTargetException e) { 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (IllegalAccessException e) { 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen e.printStackTrace(); 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private void init() { 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Listens for all message event packets and fire the proper message event listeners. 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen packetListener = new PacketListener() { 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void processPacket(Packet packet) { 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Message message = (Message) packet; 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen (MessageEvent) message.getExtension("x", "jabber:x:event"); 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (messageEvent.isMessageEventRequest()) { 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Fire event for requests of message events 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<String> it = messageEvent.getEventTypes(); it.hasNext();) 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fireMessageEventRequestListeners( 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen message.getFrom(), 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen message.getPacketID(), 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen it.next().concat("NotificationRequested")); 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Fire event for notifications of message events 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<String> it = messageEvent.getEventTypes(); it.hasNext();) 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fireMessageEventNotificationListeners( 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen message.getFrom(), 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.getPacketID(), 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen it.next().concat("Notification")); 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen }; 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen }; 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.addPacketListener(packetListener, packetFilter); 226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sends the notification that the message was delivered to the sender of the original message 230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param to the recipient of the notification. 232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param packetID the id of the message to send. 233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void sendDeliveredNotification(String to, String packetID) { 235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create the message to send 236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Message msg = new Message(to); 237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create a MessageEvent Package and add it to the message 238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = new MessageEvent(); 239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setDelivered(true); 240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setPacketID(packetID); 241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen msg.addExtension(messageEvent); 242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Send the packet 243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.sendPacket(msg); 244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sends the notification that the message was displayed to the sender of the original message 248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param to the recipient of the notification. 250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param packetID the id of the message to send. 251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void sendDisplayedNotification(String to, String packetID) { 253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create the message to send 254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Message msg = new Message(to); 255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create a MessageEvent Package and add it to the message 256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = new MessageEvent(); 257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setDisplayed(true); 258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setPacketID(packetID); 259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen msg.addExtension(messageEvent); 260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Send the packet 261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.sendPacket(msg); 262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sends the notification that the receiver of the message is composing a reply 266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param to the recipient of the notification. 268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param packetID the id of the message to send. 269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void sendComposingNotification(String to, String packetID) { 271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create the message to send 272d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Message msg = new Message(to); 273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create a MessageEvent Package and add it to the message 274d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = new MessageEvent(); 275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setComposing(true); 276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setPacketID(packetID); 277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen msg.addExtension(messageEvent); 278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Send the packet 279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.sendPacket(msg); 280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 282d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 283d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sends the notification that the receiver of the message has cancelled composing a reply. 284d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 285d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param to the recipient of the notification. 286d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param packetID the id of the message to send. 287d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 288d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void sendCancelledNotification(String to, String packetID) { 289d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create the message to send 290d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Message msg = new Message(to); 291d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Create a MessageEvent Package and add it to the message 292d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen MessageEvent messageEvent = new MessageEvent(); 293d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setCancelled(true); 294d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen messageEvent.setPacketID(packetID); 295d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen msg.addExtension(messageEvent); 296d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Send the packet 297d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.sendPacket(msg); 298d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 299d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 300d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void destroy() { 301d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (con != null) { 302d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen con.removePacketListener(packetListener); 303d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 304d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 305d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 306d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected void finalize() throws Throwable { 307d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen destroy(); 308d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super.finalize(); 309d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 310d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}