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}