# HG changeset patch # User Da Risk # Date 1261062902 -3600 # Node ID ca7bec1b5754734f33144b323e35c2ed29488b75 # Parent 739518ae68e08782348b5a0d51cf7cdb120b487d Add methods for managing MessageListeners in the Chat adapter. diff -r 739518ae68e0 -r ca7bec1b5754 src/com/beem/project/beem/service/ChatAdapter.java --- 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 mMessages; + private final RemoteCallbackList mRemoteListeners = new RemoteCallbackList(); + private final MsgListener mMsgListener = new MsgListener(); /** * Constructor. @@ -76,6 +83,7 @@ mAdaptee = chat; mParticipant = new Contact(chat.getParticipant()); mMessages = new LinkedList(); + 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(); + } + } } + diff -r 739518ae68e0 -r ca7bec1b5754 src/com/beem/project/beem/service/aidl/IChat.aidl --- 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 getMessages(); -} \ No newline at end of file +}