Ajout du IBeemRosterListener
authornikita@nikita-rack
Fri, 03 Apr 2009 18:50:13 +0200
changeset 61 08cfba11099a
parent 58 ae9ca6ed9095
child 62 ec87eec66d56
child 63 edd2c2ffe3ac
Ajout du IBeemRosterListener
project.aidl
src/com/beem/project/beem/provider/BeemDatabaseHelper.java
src/com/beem/project/beem/service/PresenceAdapter.java
src/com/beem/project/beem/service/RosterAdapter.java
src/com/beem/project/beem/service/XMPPConnectionAdapter.java
src/com/beem/project/beem/service/aidl/IBeemRosterListener.aidl
src/com/beem/project/beem/service/aidl/IContact.aidl
src/com/beem/project/beem/service/aidl/IRoster.aidl
--- a/project.aidl	Fri Apr 03 00:43:02 2009 +0200
+++ b/project.aidl	Fri Apr 03 18:50:13 2009 +0200
@@ -3,5 +3,6 @@
 // action. Do not modify!
 
 parcelable com.beem.project.beem.BeemException
+parcelable com.beem.project.beem.service.Message
 parcelable com.beem.project.beem.service.Contact
-parcelable com.beem.project.beem.service.Message
+parcelable com.beem.project.beem.service.PresenceAdapter
--- a/src/com/beem/project/beem/provider/BeemDatabaseHelper.java	Fri Apr 03 00:43:02 2009 +0200
+++ b/src/com/beem/project/beem/provider/BeemDatabaseHelper.java	Fri Apr 03 18:50:13 2009 +0200
@@ -23,6 +23,7 @@
 	public void onCreate(SQLiteDatabase db) {
 		db.execSQL(this.creationQuery);
 	}
+	
 
 	@Override
 	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/service/PresenceAdapter.java	Fri Apr 03 18:50:13 2009 +0200
@@ -0,0 +1,54 @@
+package com.beem.project.beem.service;
+
+import org.jivesoftware.smack.packet.Presence;
+
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PresenceAdapter implements  Parcelable {
+	
+	private Presence mPresence;
+	
+	/**
+	 * Parcelable.Creator needs by Android.
+	 */
+	public static final Parcelable.Creator<PresenceAdapter> CREATOR = new Parcelable.Creator<PresenceAdapter>() {
+
+		@Override
+		public PresenceAdapter createFromParcel(Parcel source) {
+			return new PresenceAdapter(source);
+		}
+
+		@Override
+		public PresenceAdapter[] newArray(int size) {
+			return new PresenceAdapter[size];
+		}
+	};
+	
+	public PresenceAdapter(Presence presence) {
+		mPresence = presence;
+	}
+	
+	
+	public PresenceAdapter(Parcel source) {
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	public int describeContents() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public void writeToParcel(Parcel dest, int flags) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public IBinder asBinder() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
--- a/src/com/beem/project/beem/service/RosterAdapter.java	Fri Apr 03 00:43:02 2009 +0200
+++ b/src/com/beem/project/beem/service/RosterAdapter.java	Fri Apr 03 18:50:13 2009 +0200
@@ -16,6 +16,10 @@
 import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smack.packet.Presence;
 
+import com.beem.project.beem.service.aidl.IBeemConnectionListener;
+import com.beem.project.beem.service.aidl.IBeemRosterListener;
+
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -25,143 +29,238 @@
  */
 public class RosterAdapter extends com.beem.project.beem.service.aidl.IRoster.Stub {
 
-    private Roster mAdaptee;
-    private Map<String, Contact> mContacts = new HashMap<String, Contact>();
-    private RosterListener mRosterListener = new RosterListener() {
+	private static final String TAG = "RosterAdapter";
+	private Roster mAdaptee;
+	private RemoteCallbackList<IBeemRosterListener> mRemoteRosListeners = 
+		new RemoteCallbackList<IBeemRosterListener>();
+	private Map<String, Contact> mContacts = new HashMap<String, Contact>();
+	private RosterListener mRosterListener = new RosterListener() {
+		@Override
+		public void presenceChanged(Presence presence) {
+			String user = presence.getFrom();
+			Presence bestPresence = mAdaptee.getPresence(user);
+			Contact c = mContacts.get(user);
+			if (c == null) {
+				c = new Contact(user);
+				mContacts.put(user, c);
+			}
+			int status;
+			if (bestPresence.getType().equals(Presence.Type.unavailable))
+				status = Contact.CONTACT_STATUS_DISCONNECT;
+			else {
+				switch (bestPresence.getMode()) {
+				case available:
+					status = Contact.CONTACT_STATUS_AVAILABLE;
+					break;
+				case away:
+					status = Contact.CONTACT_STATUS_AWAY;
+					break;
+				case chat:
+					status = Contact.CONTACT_STATUS_AVAILABLE_FOR_CHAT;
+					break;
+				case dnd:
+					status = Contact.CONTACT_STATUS_BUSY;
+					break;
+				case xa:
+					status = Contact.CONTACT_STATUS_UNAVAILABLE;
+					break;
+				default:
+					Log.e("RosterAdapter", "Status mode non gere");
+				status = Contact.CONTACT_STATUS_DISCONNECT;
+				break;
+				}
+			}
+			c.setStatus(status);
+		}
 
+		@Override
+		public void entriesUpdated(Collection<String> arg0) {
+			// TODO Auto-generated method stub
+
+		}
+
+		@Override
+		public void entriesDeleted(Collection<String> arg0) {
+			// TODO Auto-generated method stub
+
+		}
+
+		@Override
+		public void entriesAdded(Collection<String> arg0) {
+			// TODO Auto-generated method stub
+
+		}
+	};
+
+	/**
+	 * Constructor.
+	 * @param roster the roster to adapt
+	 */
+	public RosterAdapter(final Roster roster) {
+		mAdaptee = roster;
+		roster.addRosterListener(mRosterListener);
+		for (RosterEntry entry : roster.getEntries()) {
+			String user = entry.getUser();
+			if ( !mContacts.containsKey(user))
+				mContacts.put(user, new Contact(user));
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
-	public void presenceChanged(Presence presence) {
-	    String user = presence.getFrom();
-	    Presence bestPresence = mAdaptee.getPresence(user);
-	    Contact c = mContacts.get(user);
-	    if (c == null) {
-		c = new Contact(user);
-		mContacts.put(user, c);
-	    }
-	    int status;
-	    if (bestPresence.getType().equals(Presence.Type.unavailable))
-		status = Contact.CONTACT_STATUS_DISCONNECT;
-	    else {
-		switch (bestPresence.getMode()) {
-		    case available:
-			status = Contact.CONTACT_STATUS_AVAILABLE;
-			break;
-		    case away:
-			status = Contact.CONTACT_STATUS_AWAY;
-			break;
-		    case chat:
-			status = Contact.CONTACT_STATUS_AVAILABLE_FOR_CHAT;
-			break;
-		    case dnd:
-			status = Contact.CONTACT_STATUS_BUSY;
-			break;
-		    case xa:
-			status = Contact.CONTACT_STATUS_UNAVAILABLE;
-			break;
-		    default:
-			Log.e("RosterAdapter", "Status mode non gere");
-			status = Contact.CONTACT_STATUS_DISCONNECT;
-			break;
+	public void createGroup(String groupname) throws RemoteException {
+		// TODO Auto-generated method stub
+		mAdaptee.createGroup(groupname);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Contact addContact(String user, String name, String[] groups) throws RemoteException {
+		try {
+			mAdaptee.createEntry(user, name, groups);
+			Contact res = new Contact(user);
+			mContacts.put(user, res);
+			return res;
+		} catch (XMPPException e) {
+			return null;
 		}
-	    }
-	    c.setStatus(status);
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
-	public void entriesUpdated(Collection<String> arg0) {
-	    // TODO Auto-generated method stub
+	public void deleteContact(Contact contact) throws RemoteException {
+		// TODO Auto-generated method stub
 
 	}
+	@Override
+	public void addConnectionListener(IBeemRosterListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteRosListeners.register(listen);
+	}
 
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void removeConnectionListener(IBeemRosterListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteRosListeners.unregister(listen);
+	}
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Contact getContact(String jid) throws RemoteException {
+		return mContacts.get(jid);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
-	public void entriesDeleted(Collection<String> arg0) {
-	    // TODO Auto-generated method stub
+	public List<Contact> getContactList() throws RemoteException {
+		List<Contact> res = new ArrayList<Contact>();
+		res.addAll(mContacts.values());
+		return res;
+	}
+
+	private class RosterListenerAdapter implements RosterListener {
+
+		@Override
+		public void entriesAdded(Collection<String> addresses) {
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = null;
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {
+					tab.addAll(addresses);
+					listener.onEntriesAdded(tab);
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while adding roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();
+
+		}
+
+		@Override
+		public void entriesDeleted(Collection<String> addresses) {
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = null;
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {
+					tab.addAll(addresses);
+					listener.onEntriesDeleted(tab);
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while deleting roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();			
+		}
+
+		@Override
+		public void entriesUpdated(Collection<String> addresses) {
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = null;
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {
+					tab.addAll(addresses);
+					listener.onEntriesUpdated(tab);
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while updating roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();			
+		}
+
+		@Override
+		public void presenceChanged(Presence presence) {
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = null;
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {
+					listener.onPresenceChanged(new PresenceAdapter(presence));
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while updating roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();			
+		}    	
 
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
-	public void entriesAdded(Collection<String> arg0) {
-	    // TODO Auto-generated method stub
-
-	}
-    };
-
-    /**
-     * Constructor.
-     * @param roster the roster to adapt
-     */
-    public RosterAdapter(final Roster roster) {
-	mAdaptee = roster;
-	roster.addRosterListener(mRosterListener);
-	for (RosterEntry entry : roster.getEntries()) {
-	    String user = entry.getUser();
-	    if ( !mContacts.containsKey(user))
-		mContacts.put(user, new Contact(user));
+	public List<String> getGroupsNames() throws RemoteException {
+		Collection<RosterGroup> groups = mAdaptee.getGroups();
+		ArrayList<String> result = new ArrayList<String>(groups.size());
+		for (RosterGroup rosterGroup : groups) {
+			result.add(rosterGroup.getName());
+		}
+		return result;
 	}
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void createGroup(String groupname) throws RemoteException {
-	// TODO Auto-generated method stub
-	mAdaptee.createGroup(groupname);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Contact addContact(String user, String name, String[] groups) throws RemoteException {
-	try {
-	    mAdaptee.createEntry(user, name, groups);
-	    Contact res = new Contact(user);
-	    mContacts.put(user, res);
-	    return res;
-	} catch (XMPPException e) {
-	    return null;
-	}
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void deleteContact(Contact contact) throws RemoteException {
-	// TODO Auto-generated method stub
-
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Contact getContact(String jid) throws RemoteException {
-	return mContacts.get(jid);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<Contact> getContactList() throws RemoteException {
-	List<Contact> res = new ArrayList<Contact>();
-	res.addAll(mContacts.values());
-	return res;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<String> getGroupsNames() throws RemoteException {
-	Collection<RosterGroup> groups = mAdaptee.getGroups();
-	ArrayList<String> result = new ArrayList<String>(groups.size());
-	for (RosterGroup rosterGroup : groups) {
-	    result.add(rosterGroup.getName());
-	}
-	return result;
-    }
 
 }
--- a/src/com/beem/project/beem/service/XMPPConnectionAdapter.java	Fri Apr 03 00:43:02 2009 +0200
+++ b/src/com/beem/project/beem/service/XMPPConnectionAdapter.java	Fri Apr 03 18:50:13 2009 +0200
@@ -25,308 +25,308 @@
  */
 public class XMPPConnectionAdapter extends IXmppConnection.Stub {
 
-    private static final String TAG = "XMPPConnectionAdapter";
-    private XMPPConnection mAdaptee;
-    private IChatManager mChatManager;
-    private BeemException mLastException;
-    private String mLogin;
-    private String mPassword;
-    private RosterAdapter mRoster;
-
-    private RemoteCallbackList<IBeemConnectionListener> mRemoteConnListeners =
-	new RemoteCallbackList<IBeemConnectionListener>();
-    private ConnexionListenerAdapter mConListener = new ConnexionListenerAdapter();
-
-    /**
-     * Constructor.
-     * @param con The connection to adapt
-     * @param login The login to use
-     * @param password The password to use
-     */
-    public XMPPConnectionAdapter(final XMPPConnection con, final String login, final String password) {
-	mAdaptee = con;
-	mLogin = login;
-	mPassword = password;
-    }
-
-    /**
-     * Constructor.
-     * @param serviceName name of the service to connect to
-     * @param login login to use on connect
-     * @param password password to use on connect
-     */
-    public XMPPConnectionAdapter(final String serviceName, final String login, final String password) {
-	this(new XMPPConnection(serviceName), login, password);
-    }
-
-    /**
-     * Constructor.
-     * @param config Configuration to use in order to connect
-     * @param login login to use on connect
-     * @param password password to use on connect
-     */
-    public XMPPConnectionAdapter(final ConnectionConfiguration config, final String login, final String password) {
-	this(new XMPPConnection(config), login, password);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean connectSync() throws RemoteException {
-	try {
-	    mAdaptee.connect();
-	    mAdaptee.addConnectionListener(mConListener);
-	    mAdaptee.login(mLogin, mPassword, "BEEM");
-	    mChatManager = new BeemChatManager(mAdaptee.getChatManager());
-	    // TODO find why this cause a null pointer exception
-	    // this.initFeatures(); // pour declarer les features xmpp qu'on supporte
-	    mLastException = null;
-	    triggerAsynchronousConnectEvent();
-	    return true;
-	} catch (XMPPException e) {
-	    mLastException = new BeemException(e);
-	}
-	return false;
-    }
+	private static final String TAG = "XMPPConnectionAdapter";
+	private XMPPConnection mAdaptee;
+	private IChatManager mChatManager;
+	private BeemException mLastException;
+	private String mLogin;
+	private String mPassword;
+	private RosterAdapter mRoster;
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean disconnect() {
-	mAdaptee.disconnect();
-	mLastException = null;
-	return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IRoster getRoster() throws RemoteException {
-	if (mRoster != null)
-	    return mRoster;
-	Roster adap = mAdaptee.getRoster();
-	if (adap == null)
-	    return null;
-	mRoster = new RosterAdapter(adap);
-	return mRoster;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public final void connectAsync() throws RemoteException {
-	Thread t = new Thread(new Runnable() {
-
-	    @Override
-	    public void run() {
-		try {
-		    connectSync();
-		} catch (RemoteException e) {
-		    Log.e(TAG, "Error while connecting", e);
-		}
-	    }
-	});
-	t.start();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addConnectionListener(IBeemConnectionListener listen) throws RemoteException {
-	if (listen != null)
-	    mRemoteConnListeners.register(listen);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void removeConnectionListener(IBeemConnectionListener listen) throws RemoteException {
-	if (listen != null)
-	    mRemoteConnListeners.unregister(listen);
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IChatManager getChatManager() throws RemoteException {
-	return mChatManager;
-    }
-
-    /**
-     * Trigger Connection event.
-     */
-    private void triggerAsynchronousConnectEvent() {
-	mConListener.onConnect();
-    }
-
-    /**
-     * Listener for XMPP connection events.
-     * It will calls the remote listeners for connexion events.
-     * @author darisk
-     */
-    private class ConnexionListenerAdapter implements ConnectionListener {
+	private RemoteCallbackList<IBeemConnectionListener> mRemoteConnListeners =
+		new RemoteCallbackList<IBeemConnectionListener>();
+	private ConnexionListenerAdapter mConListener = new ConnexionListenerAdapter();
 
 	/**
-	 * Defaut constructor.
+	 * Constructor.
+	 * @param con The connection to adapt
+	 * @param login The login to use
+	 * @param password The password to use
 	 */
-	public ConnexionListenerAdapter() {
-	    // TODO Auto-generated constructor stub
+	public XMPPConnectionAdapter(final XMPPConnection con, final String login, final String password) {
+		mAdaptee = con;
+		mLogin = login;
+		mPassword = password;
+	}
+
+	/**
+	 * Constructor.
+	 * @param serviceName name of the service to connect to
+	 * @param login login to use on connect
+	 * @param password password to use on connect
+	 */
+	public XMPPConnectionAdapter(final String serviceName, final String login, final String password) {
+		this(new XMPPConnection(serviceName), login, password);
+	}
+
+	/**
+	 * Constructor.
+	 * @param config Configuration to use in order to connect
+	 * @param login login to use on connect
+	 * @param password password to use on connect
+	 */
+	public XMPPConnectionAdapter(final ConnectionConfiguration config, final String login, final String password) {
+		this(new XMPPConnection(config), login, password);
 	}
 
 	/**
-	 * Method to execute when a connection event occurs.
+	 * {@inheritDoc}
 	 */
-	public void onConnect() {
-	    final int n = mRemoteConnListeners.beginBroadcast();
-
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+	@Override
+	public boolean connectSync() throws RemoteException {
 		try {
-		    listener.onConnect();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
+			mAdaptee.connect();
+			mAdaptee.addConnectionListener(mConListener);
+			mAdaptee.login(mLogin, mPassword, "BEEM");
+			mChatManager = new BeemChatManager(mAdaptee.getChatManager());
+			// TODO find why this cause a null pointer exception
+			// this.initFeatures(); // pour declarer les features xmpp qu'on supporte
+			mLastException = null;
+			triggerAsynchronousConnectEvent();
+			return true;
+		} catch (XMPPException e) {
+			mLastException = new BeemException(e);
 		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean disconnect() {
+		mAdaptee.disconnect();
+		mLastException = null;
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public IRoster getRoster() throws RemoteException {
+		if (mRoster != null)
+			return mRoster;
+		Roster adap = mAdaptee.getRoster();
+		if (adap == null)
+			return null;
+		mRoster = new RosterAdapter(adap);
+		return mRoster;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final void connectAsync() throws RemoteException {
+		Thread t = new Thread(new Runnable() {
+
+			@Override
+			public void run() {
+				try {
+					connectSync();
+				} catch (RemoteException e) {
+					Log.e(TAG, "Error while connecting", e);
+				}
+			}
+		});
+		t.start();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void addConnectionListener(IBeemConnectionListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteConnListeners.register(listen);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void removeConnectionListener(IBeemConnectionListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteConnListeners.unregister(listen);
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void connectionClosed() {
-	    final int n = mRemoteConnListeners.beginBroadcast();
-
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    listener.connectionClosed();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
-		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
+	public IChatManager getChatManager() throws RemoteException {
+		return mChatManager;
 	}
 
 	/**
-	 * {@inheritDoc}
+	 * Trigger Connection event.
 	 */
-	@Override
-	public void connectionClosedOnError(Exception arg0) {
-	    final int n = mRemoteConnListeners.beginBroadcast();
-
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    listener.connectionClosedOnError();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
-		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void reconnectingIn(int arg0) {
-	    final int n = mRemoteConnListeners.beginBroadcast();
-
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    listener.reconnectingIn(arg0);
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
+	private void triggerAsynchronousConnectEvent() {
+		mConListener.onConnect();
 	}
 
 	/**
-	 * {@inheritDoc}
+	 * Listener for XMPP connection events.
+	 * It will calls the remote listeners for connexion events.
+	 * @author darisk
 	 */
-	@Override
-	public void reconnectionFailed(Exception arg0) {
-	    final int r = mRemoteConnListeners.beginBroadcast();
+	private class ConnexionListenerAdapter implements ConnectionListener {
+
+		/**
+		 * Defaut constructor.
+		 */
+		public ConnexionListenerAdapter() {
+			// TODO Auto-generated constructor stub
+		}
+
+		/**
+		 * Method to execute when a connection event occurs.
+		 */
+		public void onConnect() {
+			final int n = mRemoteConnListeners.beginBroadcast();
+
+			for (int i = 0; i < n; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.onConnect();
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while triggering remote connection listeners", e);
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void connectionClosed() {
+			final int n = mRemoteConnListeners.beginBroadcast();
+
+			for (int i = 0; i < n; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.connectionClosed();
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while triggering remote connection listeners", e);
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void connectionClosedOnError(Exception arg0) {
+			final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < r; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    listener.reconnectionFailed();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
+			for (int i = 0; i < n; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.connectionClosedOnError();
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while triggering remote connection listeners", e);
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void reconnectingIn(int arg0) {
+			final int n = mRemoteConnListeners.beginBroadcast();
+
+			for (int i = 0; i < n; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.reconnectingIn(arg0);
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
 		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void reconnectionFailed(Exception arg0) {
+			final int r = mRemoteConnListeners.beginBroadcast();
+
+			for (int i = 0; i < r; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.reconnectionFailed();
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while triggering remote connection listeners", e);
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void reconnectionSuccessful() {
+			final int n = mRemoteConnListeners.beginBroadcast();
+
+			for (int i = 0; i < n; i++) {
+				IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
+				try {
+					listener.reconnectionSuccessful();
+				} catch (RemoteException e) {
+					// The RemoteCallbackList will take care of removing the
+					// dead listeners.
+					Log.w(TAG, "Error while triggering remote connection listeners", e);
+				}
+			}
+			mRemoteConnListeners.finishBroadcast();
+		}
+
 	}
 
 	/**
-	 * {@inheritDoc}
+	 * enregistre les features dispo dans notre version Liste de features que Telepathy supporte.
+	 * "http://www.google.com/xmpp/protocol/session" "http://www.google.com/transport/p2p"
+	 * "http://jabber.org/protocol/jingle" "http://jabber.org/protocol/chatstates" "http://jabber.org/protocol/nick"
+	 * "http://jabber.org/protocol/nick+notify" "http://jabber.org/protocol/si" "ttp://jabber.org/protocol/ibb"
+	 * "ttp://telepathy.freedesktop.org/xmpp/tubes" "http://www.google.com/xmpp/protocol/voice/v1"
+	 * "http://jabber.org/protocol/jingle/description/audio" "http://jabber.org/protocol/jingle/description/video" Liste
+	 * de features que pidgin `supporte' (on notera la cradence de l'annonce): "jabber:iq:last" "jabber:iq:oob"
+	 * "jabber:iq:time" "jabber:iq:version" "jabber:x:conference" "urn:xmpp:attention:0" "urn:xmpp:bob" "urn:xmpp:ping"
+	 * "xmpp:urn:time" "http://jabber.org/protocol/bytestreams" "http://jabber.org/protocol/disco#info"
+	 * "http://jabber.org/protocol/disco#items" "http://jabber.org/protocol/ibb" "http://jabber.org/protocol/muc"
+	 * "http://jabber.org/protocol/muc#user" "http://jabber.org/protocol/si"
+	 * "http://jabber.org/protocol/si/profile/file-transfer" "http://jabber.org/protocol/xhtml-im"
+	 * "http://www.xmpp.org/extensions/xep-0199.html#ns" "http://jabber.org/protocol/mood"
+	 * "http://jabber.org/protocol/mood+notify" "http://jabber.org/protocol/nick"
+	 * "http://jabber.org/protocol/nick+notify" "http://jabber.org/protocol/tune"
+	 * "http://jabber.org/protocol/tune+notify" "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata"
+	 * "http://www.xmpp.org/extensions/xep-0084.html#ns-data"
+	 * "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata+notify"
+	 * "http://www.xmpp.org/extensions/xep-0167.html#ns" << Jingle RTP Sessions
 	 */
-	@Override
-	public void reconnectionSuccessful() {
-	    final int n = mRemoteConnListeners.beginBroadcast();
+	private void initFeatures() {
+		JingleManager.setJingleServiceEnabled();
+		ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(mAdaptee);
+		sdm.addFeature("http://jabber.org/protocol/disco#info");
+		// sdm.addFeature("http://jabber.org/protocol/nick");
 
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    listener.reconnectionSuccessful();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
-		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
 	}
 
-    }
-
-    /**
-     * enregistre les features dispo dans notre version Liste de features que Telepathy supporte.
-     * "http://www.google.com/xmpp/protocol/session" "http://www.google.com/transport/p2p"
-     * "http://jabber.org/protocol/jingle" "http://jabber.org/protocol/chatstates" "http://jabber.org/protocol/nick"
-     * "http://jabber.org/protocol/nick+notify" "http://jabber.org/protocol/si" "ttp://jabber.org/protocol/ibb"
-     * "ttp://telepathy.freedesktop.org/xmpp/tubes" "http://www.google.com/xmpp/protocol/voice/v1"
-     * "http://jabber.org/protocol/jingle/description/audio" "http://jabber.org/protocol/jingle/description/video" Liste
-     * de features que pidgin `supporte' (on notera la cradence de l'annonce): "jabber:iq:last" "jabber:iq:oob"
-     * "jabber:iq:time" "jabber:iq:version" "jabber:x:conference" "urn:xmpp:attention:0" "urn:xmpp:bob" "urn:xmpp:ping"
-     * "xmpp:urn:time" "http://jabber.org/protocol/bytestreams" "http://jabber.org/protocol/disco#info"
-     * "http://jabber.org/protocol/disco#items" "http://jabber.org/protocol/ibb" "http://jabber.org/protocol/muc"
-     * "http://jabber.org/protocol/muc#user" "http://jabber.org/protocol/si"
-     * "http://jabber.org/protocol/si/profile/file-transfer" "http://jabber.org/protocol/xhtml-im"
-     * "http://www.xmpp.org/extensions/xep-0199.html#ns" "http://jabber.org/protocol/mood"
-     * "http://jabber.org/protocol/mood+notify" "http://jabber.org/protocol/nick"
-     * "http://jabber.org/protocol/nick+notify" "http://jabber.org/protocol/tune"
-     * "http://jabber.org/protocol/tune+notify" "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata"
-     * "http://www.xmpp.org/extensions/xep-0084.html#ns-data"
-     * "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata+notify"
-     * "http://www.xmpp.org/extensions/xep-0167.html#ns" << Jingle RTP Sessions
-     */
-    private void initFeatures() {
-	JingleManager.setJingleServiceEnabled();
-	ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(mAdaptee);
-	sdm.addFeature("http://jabber.org/protocol/disco#info");
-	// sdm.addFeature("http://jabber.org/protocol/nick");
-
-    }
-
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/service/aidl/IBeemRosterListener.aidl	Fri Apr 03 18:50:13 2009 +0200
@@ -0,0 +1,10 @@
+package com.beem.project.beem.service.aidl;
+
+import com.beem.project.beem.service.PresenceAdapter;
+
+interface IBeemRosterListener {
+    void onEntriesAdded(in List<String> addresses);
+    void onEntriesUpdated(in List<String> addresses);
+    void onEntriesDeleted(in List<String> addresses);
+    void onPresenceChanged(in PresenceAdapter presence);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/service/aidl/IContact.aidl	Fri Apr 03 18:50:13 2009 +0200
@@ -0,0 +1,9 @@
+package com.beem.project.beem.service.aidl;
+
+interface IContact {
+
+	String getJID();
+	
+	void setJID(String mjid);
+
+}
\ No newline at end of file
--- a/src/com/beem/project/beem/service/aidl/IRoster.aidl	Fri Apr 03 00:43:02 2009 +0200
+++ b/src/com/beem/project/beem/service/aidl/IRoster.aidl	Fri Apr 03 18:50:13 2009 +0200
@@ -1,5 +1,6 @@
 package com.beem.project.beem.service.aidl;
 
+import com.beem.project.beem.service.aidl.IBeemRosterListener;
 import com.beem.project.beem.service.Contact;
 
 interface IRoster {
@@ -15,5 +16,8 @@
     List<Contact> getContactList(); 
     
     List<String> getGroupsNames();
+    
+    void addConnectionListener(in IBeemRosterListener listen);
+    void removeConnectionListener(in IBeemRosterListener listen);
 
 }
\ No newline at end of file