Add methods for managing MessageListeners in the Chat adapter.
--- a/src/com/beem/project/beem/service/ChatAdapter.java Thu Dec 17 13:54:55 2009 +0100
+++ b/src/com/beem/project/beem/service/ChatAdapter.java Thu Dec 17 16:15:02 2009 +0100
@@ -49,10 +49,14 @@
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.MessageListener;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.util.Log;
import com.beem.project.beem.service.aidl.IChat;
+import com.beem.project.beem.service.aidl.IMessageListener;
// TODO: Auto-generated Javadoc
/**
@@ -61,12 +65,15 @@
*/
public class ChatAdapter extends IChat.Stub {
private static final int HISTORY_MAX_SIZE = 50;
+ private static final String TAG = "ChatAdapter";
private final Chat mAdaptee;
private final Contact mParticipant;
private String mState;
private boolean mIsOpen;
private final List<Message> mMessages;
+ private final RemoteCallbackList<IMessageListener> mRemoteListeners = new RemoteCallbackList<IMessageListener>();
+ private final MsgListener mMsgListener = new MsgListener();
/**
* Constructor.
@@ -76,6 +83,7 @@
mAdaptee = chat;
mParticipant = new Contact(chat.getParticipant());
mMessages = new LinkedList<Message>();
+ mAdaptee.addMessageListener(mMsgListener);
}
/**
@@ -112,6 +120,24 @@
* {@inheritDoc}
*/
@Override
+ public void addMessageListener(IMessageListener listen) {
+ if (listen != null)
+ mRemoteListeners.register(listen);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void removeMessageListener(IMessageListener listen) {
+ if (listen != null)
+ mRemoteListeners.unregister(listen);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public String getState() throws RemoteException {
return mState;
}
@@ -166,4 +192,21 @@
mMessages.add(msg);
}
+ private class MsgListener implements MessageListener {
+ @Override
+ public void processMessage(Chat chat, org.jivesoftware.smack.packet.Message message) {
+ final int n = mRemoteListeners.beginBroadcast();
+ for (int i = 0; i < n; i++) {
+ IMessageListener listener = mRemoteListeners.getBroadcastItem(i);
+ try {
+ if (listener != null)
+ listener.processMessage(ChatAdapter.this, new Message(message));
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error while diffusing message to listener", e);
+ }
+ }
+ mRemoteListeners.finishBroadcast();
+ }
+ }
}
+
--- a/src/com/beem/project/beem/service/aidl/IChat.aidl Thu Dec 17 13:54:55 2009 +0100
+++ b/src/com/beem/project/beem/service/aidl/IChat.aidl Thu Dec 17 16:15:02 2009 +0100
@@ -20,6 +20,18 @@
* @return the participant
*/
Contact getParticipant();
+
+ /**
+ * Add a message listener.
+ * @param listener the listener to add.
+ */
+ void addMessageListener(in IMessageListener listener);
+
+ /**
+ * Remove a message listener.
+ * @param listener the listener to remove.
+ */
+ void removeMessageListener(in IMessageListener listener);
String getState();
@@ -31,4 +43,4 @@
List<Message> getMessages();
-}
\ No newline at end of file
+}