Add methods for managing MessageListeners in the Chat adapter.
authorDa Risk <darisk972@gmail.com>
Thu, 17 Dec 2009 16:15:02 +0100
changeset 583 ca7bec1b5754
parent 582 739518ae68e0
child 584 72d9d76900af
Add methods for managing MessageListeners in the Chat adapter.
src/com/beem/project/beem/service/ChatAdapter.java
src/com/beem/project/beem/service/aidl/IChat.aidl
--- 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
+}