We can now get the contact list of the user.
authorDa Risk <darisk972@gmail.com>
Thu, 26 Mar 2009 18:01:21 +0100
changeset 38 3e76846c48a9
parent 37 4145f456d73b
child 39 220193461192
We can now get the contact list of the user. Need to complete the Contact class and try to get some information on the mobile contact directory.
checkstyle.xml
src/com/beem/project/beem/BeemService.java
src/com/beem/project/beem/service/Contact.java
src/com/beem/project/beem/service/RosterAdapter.java
src/com/beem/project/beem/service/XMPPConnectionAdapter.java
src/com/beem/project/beem/service/XMPPFacade.java
src/com/beem/project/beem/service/aidl/IRoster.aidl
src/com/beem/project/beem/service/aidl/IXMPPConnection.aidl
src/com/beem/project/beem/service/aidl/IXMPPFacade.aidl
src/com/beem/project/beem/ui/Beem.java
src/com/beem/project/beem/ui/ContactList.java
--- a/checkstyle.xml	Mon Mar 23 16:54:42 2009 +0100
+++ b/checkstyle.xml	Thu Mar 26 18:01:21 2009 +0100
@@ -189,7 +189,9 @@
 
 	<!-- Checks for class design                         -->
 	<!-- See http://checkstyle.sf.net/config_design.html -->
-	<module name="DesignForExtension"/>
+	<!-- 
+	  <module name="DesignForExtension"/>
+	  -->
 	<module name="FinalClass"/>
 	<module name="HideUtilityClassConstructor"/>
 	<module name="InterfaceIsType"/>
--- a/src/com/beem/project/beem/BeemService.java	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/BeemService.java	Thu Mar 26 18:01:21 2009 +0100
@@ -25,11 +25,14 @@
 import android.widget.Toast;
 
 import com.beem.project.beem.service.XMPPConnectionAdapter;
+import com.beem.project.beem.service.XMPPFacade;
+import com.beem.project.beem.service.aidl.IRoster;
 import com.beem.project.beem.service.aidl.IXMPPConnection;
 import com.beem.project.beem.service.aidl.IXMPPFacade;
 /**
+ * This class is for the Beem service.
  * @author darisk
- * 
+ *
  */
 public class BeemService extends Service {
 
@@ -41,30 +44,7 @@
     private String mPassword;
     private String mHost;
 
-    private IXMPPFacade.Stub bind = new IXMPPFacade.Stub() {
-
-	@Override
-	public IXMPPConnection getXMPPConnection() throws RemoteException {
-	    return connection;
-	}
-
-	@Override
-	public void disconnect() throws RemoteException {
-	    connection.disconnect();
-	}
-
-
-	@Override
-	public void connectAsync() throws RemoteException {
-	    connection.connectAsync(mLogin, mPassword, "BEEM");
-	}
-
-
-	@Override
-	public void connectSync() throws RemoteException {
-	    connection.connectSync(mLogin, mPassword, "BEEM");
-	}
-    };
+    private IXMPPFacade.Stub mBind;
 
     /*
      * (non-Javadoc)
@@ -74,7 +54,7 @@
     @Override
     public IBinder onBind(Intent intent) {
 	showBasicNotification(R.string.BeemServiceCreated);
-	return bind;
+	return mBind;
 	// to forbid a client to bind
 	// return null;
     }
@@ -89,9 +69,10 @@
 		getString(R.string.PreferencePasswordKey), "");
 	mHost = settings.getString(getString(R.string.PreferenceHostKey), "");
 	notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-	connection = new XMPPConnectionAdapter("10.0.2.2"); // address
+	connection = new XMPPConnectionAdapter("10.0.2.2", mLogin, mPassword); // address
+	mBind = new XMPPFacade((XMPPConnectionAdapter) connection);
     }
-    
+
     private void showBasicNotification(int stringResource) {
         String text = (String) getText(stringResource);
         Notification notif = new Notification(R.drawable.logo, text, System
@@ -108,7 +89,7 @@
     @Override
     public void onStart(Intent intent, int startId) {
 	try {
-	    connection.connectSync(mLogin, mPassword, "BEEM");
+	    connection.connectSync();
 	} catch (RemoteException e) {
 	    // TODO Auto-generated catch block
 	    e.printStackTrace();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/service/Contact.java	Thu Mar 26 18:01:21 2009 +0100
@@ -0,0 +1,93 @@
+/**
+ * 
+ */
+package com.beem.project.beem.service;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * This class contains informations on a jabber contact.
+ * @author darisk
+ */
+public class Contact implements Parcelable {
+
+    /**
+     * Parcelable.Creator needs by Android.
+     */
+    public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {
+
+	@Override
+	public Contact createFromParcel(Parcel source) {
+	    return new Contact(source);
+	}
+
+	@Override
+	public Contact[] newArray(int size) {
+	    return new Contact[size];
+	}
+    };
+
+    private String mJID;
+    private int mID;
+    private int mStatus;
+    private String mMsgState;
+
+    /**
+     * Constructor.
+     */
+    public Contact() {
+	// TODO Auto-generated constructor stub
+    }
+
+    /**
+     * Constructor.
+     * @param jid JID of the contact
+     */
+    public Contact(final String jid) {
+	mJID = jid;
+    }
+
+    /**
+     * Construct a contact from a parcel.
+     * @param in parcel to use for construction
+     */
+    private Contact(final Parcel in) {
+
+    }
+
+    /**
+     * Get the Jabber ID of the contact.
+     * @return the Jabber ID
+     */
+    public String getJID() {
+	return mJID;
+    }
+
+    /**
+     * Set the Jabber ID of the contact.
+     * @param mjid	the jabber ID to set
+     */
+    public void setJID(String mjid) {
+	mJID = mjid;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int describeContents() {
+	// TODO Auto-generated method stub
+	return 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+	// TODO Auto-generated method stub
+    }
+
+
+}
--- a/src/com/beem/project/beem/service/RosterAdapter.java	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/service/RosterAdapter.java	Thu Mar 26 18:01:21 2009 +0100
@@ -4,8 +4,9 @@
 package com.beem.project.beem.service;
 
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.jivesoftware.smack.Roster;
 import org.jivesoftware.smack.RosterEntry;
@@ -13,49 +14,76 @@
 
 import android.os.RemoteException;
 
-import com.beem.project.beem.service.aidl.IRosterEntry;
-import com.beem.project.beem.service.aidl.IRoster.Stub;
-
 /**
+ * This class implement a Roster adapter for BEEM.
  * @author darisk
- *
  */
 public class RosterAdapter extends com.beem.project.beem.service.aidl.IRoster.Stub {
 
-    private Roster adaptee;
-    
-    public RosterAdapter(Roster roster) {
-	adaptee = roster;
-    }
-    
-    @Override
-    public IRosterEntry createEntry(String user, String name, String[] groups)
-	    throws RemoteException {
-	try {
-	    adaptee.createEntry(user, name, groups);
-	} catch (XMPPException e) {
-	    // TODO Auto-generated catch block
-	    e.printStackTrace();
+    private Roster mAdaptee;
+    private Map<String, Contact> mContacts = new HashMap<String, Contact>();
+
+    /**
+     * Constructor.
+     * @param roster the roster to adapt
+     */
+    public RosterAdapter(final Roster roster) {
+	mAdaptee = roster;
+	for (RosterEntry entry : roster.getEntries()) {
+	    String user = entry.getUser();
+	    mContacts.put(user, new Contact(user));
 	}
-	return null;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void createGroup(String groupname) throws RemoteException {
 	// TODO Auto-generated method stub
-	adaptee.createGroup(groupname);
+	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 List getEntries() throws RemoteException {
+    public void deleteContact(Contact contact) throws RemoteException {
 	// TODO Auto-generated method stub
-	Collection<RosterEntry> col = adaptee.getEntries();
-	ArrayList<IRosterEntry> result = new ArrayList<IRosterEntry>(col.size());
-	for (RosterEntry rosterEntry : col ) {
-	    result.add(new RosterEntryAdapter(rosterEntry));
-	}
-	return result;
+
+    }
+
+    /**
+     * {@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;
+    }
 
 }
--- a/src/com/beem/project/beem/service/XMPPConnectionAdapter.java	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/service/XMPPConnectionAdapter.java	Thu Mar 26 18:01:21 2009 +0100
@@ -1,10 +1,11 @@
 /**
- * 
+ *
  */
 package com.beem.project.beem.service;
 
 import org.jivesoftware.smack.ConnectionConfiguration;
 import org.jivesoftware.smack.ConnectionListener;
+import org.jivesoftware.smack.Roster;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smackx.ServiceDiscoveryManager;
@@ -12,6 +13,7 @@
 
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.util.Log;
 
 import com.beem.project.beem.BeemException;
 import com.beem.project.beem.service.aidl.IBeemConnectionListener;
@@ -19,147 +21,223 @@
 import com.beem.project.beem.service.aidl.IXMPPConnection;
 
 /**
+ * This class implements an adapter for XMPPConnection.
  * @author darisk
- * 
  */
 public class XMPPConnectionAdapter extends IXMPPConnection.Stub {
 
-    private XMPPConnection adaptee;
-    private BeemException lastException;
+    private static final String TAG = "XMPPConnectionAdapter";
+    private XMPPConnection mAdaptee;
+    private BeemException mLastException;
+    private String mLogin;
+    private String mPassword;
+    private RosterAdapter mRoster;
 
-    private RemoteCallbackList<IBeemConnectionListener> mRemoteConnListeners = new RemoteCallbackList<IBeemConnectionListener>();
+    private RemoteCallbackList<IBeemConnectionListener> mRemoteConnListeners =
+	new RemoteCallbackList<IBeemConnectionListener>();
     private ConnexionListenerAdapter mConListener = new ConnexionListenerAdapter();
-    
-    public XMPPConnectionAdapter(XMPPConnection con) {
-	adaptee = con;
-	
+
+    /**
+     * 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;
     }
 
-    public XMPPConnectionAdapter(String serviceName) {
-	this(new XMPPConnection(serviceName));
-    }
-
-    public XMPPConnectionAdapter(ConnectionConfiguration config) {
-	this(new XMPPConnection(config));
+    /**
+     * 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(String username, String password, String resource)
-            throws RemoteException {
-     	try {
-	    adaptee.connect();
-	    this.initFeatures(); // pour declarer les features xmpp qu'on supporte
-	    adaptee.addConnectionListener(mConListener);
-	    adaptee.login(username, password, resource);
-	    lastException = null;
+    public boolean connectSync() throws RemoteException {
+	try {
+	    mAdaptee.connect();
+	    mAdaptee.addConnectionListener(mConListener);
+	    mAdaptee.login(mLogin, mPassword, "BEEM");
+	    // 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) {
-	    lastException = new BeemException(e);
+	    mLastException = new BeemException(e);
 	}
 	return false;
     }
 
-	public boolean disconnect() {
-	adaptee.disconnect();
-	lastException = null;
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean disconnect() {
+	mAdaptee.disconnect();
+	mLastException = null;
 	return true;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public IRoster getRoster() throws RemoteException {
-	return new RosterAdapter(adaptee.getRoster());
+	if (mRoster != null)
+	    return mRoster;
+	Roster adap = mAdaptee.getRoster();
+	if (adap == null)
+	    return null;
+	mRoster = new RosterAdapter(adap);
+	return mRoster;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
-    public void connectAsync(final String username, final String password, final String resource)
-            throws RemoteException {
+    public final void connectAsync() throws RemoteException {
 	Thread t = new Thread(new Runnable() {
 
 	    @Override
 	    public void run() {
 		try {
-		    connectSync(username,password,resource);
+		    connectSync();
 		} catch (RemoteException e) {
-		   
+		    Log.e(TAG, "Error while connecting", e);
 		}
 	    }
 	});
 	t.start();
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
-    public void addConnectionListener(IBeemConnectionListener listen)
-	    throws RemoteException {
+    public void addConnectionListener(IBeemConnectionListener listen) throws RemoteException {
 	if (listen != null)
 	    mRemoteConnListeners.register(listen);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
-    public void removeConnectionListener(IBeemConnectionListener listen)
-	    throws RemoteException {
+    public void removeConnectionListener(IBeemConnectionListener listen) throws RemoteException {
 	if (listen != null)
 	    mRemoteConnListeners.unregister(listen);
     }
 
+    /**
+     * 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 {
 
+	/**
+	 * 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();
+	    final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    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();
+	    final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    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();
+	    final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    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();
+	    final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    for (int i = 0; i < n; i++) {
 		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
 		try {
 		    listener.reconnectingIn(arg0);
@@ -171,93 +249,75 @@
 	    mRemoteConnListeners.finishBroadcast();
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
 	public void reconnectionFailed(Exception arg0) {
-	    final int N = mRemoteConnListeners.beginBroadcast();
+	    final int r = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    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();
+	    final int n = mRemoteConnListeners.beginBroadcast();
 
-	    for (int i = 0; i < N; i++) {
+	    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();
 	}
-	
+
     }
-    /**
-	 * @brief: enregistre les featues 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(adaptee);
-		sdm.addFeature("http://jabber.org/protocol/disco#info");
-		//sdm.addFeature("http://jabber.org/protocol/nick");
+    /**
+     * 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/XMPPFacade.java	Thu Mar 26 18:01:21 2009 +0100
@@ -0,0 +1,55 @@
+/**
+ * 
+ */
+package com.beem.project.beem.service;
+import android.os.RemoteException;
+
+import com.beem.project.beem.service.aidl.IRoster;
+import com.beem.project.beem.service.aidl.IXMPPConnection;
+import com.beem.project.beem.service.aidl.IXMPPFacade;
+/**
+ * @author darisk
+ *
+ */
+public class XMPPFacade extends IXMPPFacade.Stub {
+
+    private XMPPConnectionAdapter mConnexion;
+
+    /**
+     * Constructor for XMPPFacade.
+     * @param connection the connection use by the facade
+     */
+    public XMPPFacade(XMPPConnectionAdapter connection) {
+	this.mConnexion = connection;
+    }
+
+    @Override
+    public void connectAsync() throws RemoteException {
+	// TODO Auto-generated method stub
+	mConnexion.connectAsync();
+    }
+
+    @Override
+    public void connectSync() throws RemoteException {
+	// TODO Auto-generated method stub
+	mConnexion.connectSync();
+    }
+
+    @Override
+    public IXMPPConnection createConnection() throws RemoteException {
+	// TODO Auto-generated method stub
+	return mConnexion;
+    }
+
+    @Override
+    public void disconnect() throws RemoteException {
+	// TODO Auto-generated method stub
+	mConnexion.disconnect();
+    }
+
+    @Override
+    public IRoster getRoster() throws RemoteException {
+	return mConnexion.getRoster();
+    }
+
+}
--- a/src/com/beem/project/beem/service/aidl/IRoster.aidl	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/service/aidl/IRoster.aidl	Thu Mar 26 18:01:21 2009 +0100
@@ -4,11 +4,14 @@
 
 interface IRoster {
     
-    IRosterEntry createEntry(in String user, in String name, in String[] groups);
+    Contact addContact(in String user, in String name, in String[] groups);
     
+    void deleteContact(in Contact contact);
+    
+    Contact getContact(in String jid);
+     
     void createGroup(in String groupname);
     
-    // List<IRosterEntry>
-    List getEntries(); 
+    List<Contact> getContactList(); 
 
 }
\ No newline at end of file
--- a/src/com/beem/project/beem/service/aidl/IXMPPConnection.aidl	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/service/aidl/IXMPPConnection.aidl	Thu Mar 26 18:01:21 2009 +0100
@@ -5,14 +5,12 @@
 
 interface IXMPPConnection {
     
-    boolean connectSync(in String username, in String password, in String resource);
+    boolean connectSync();
     
-    void connectAsync(in String username, in String password, in String resource);
+    void connectAsync();
     
     boolean disconnect();
     
-  //  void login(String username, String password, String resource);
-      
     IRoster getRoster();
 
     void addConnectionListener(in IBeemConnectionListener listen);
--- a/src/com/beem/project/beem/service/aidl/IXMPPFacade.aidl	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/service/aidl/IXMPPFacade.aidl	Thu Mar 26 18:01:21 2009 +0100
@@ -1,10 +1,13 @@
 package com.beem.project.beem.service.aidl;
 
 import  com.beem.project.beem.service.aidl.IXMPPConnection;
+import  com.beem.project.beem.service.aidl.IRoster;
 
 interface IXMPPFacade {
 
-    IXMPPConnection getXMPPConnection();
+    IXMPPConnection createConnection();
+    
+    IRoster getRoster();
     
     void connectSync();
     
--- a/src/com/beem/project/beem/ui/Beem.java	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/ui/Beem.java	Thu Mar 26 18:01:21 2009 +0100
@@ -29,7 +29,7 @@
      */
     public Beem() {
 	super();
-	mHandler= new Handler();
+	mHandler = new Handler();
     }
 
     /**
@@ -105,5 +105,4 @@
 	mButton.setText(jid);
     }
 
-    
 }
--- a/src/com/beem/project/beem/ui/ContactList.java	Mon Mar 23 16:54:42 2009 +0100
+++ b/src/com/beem/project/beem/ui/ContactList.java	Thu Mar 26 18:01:21 2009 +0100
@@ -18,12 +18,16 @@
 
 import com.beem.project.beem.BeemService;
 import com.beem.project.beem.R;
+import com.beem.project.beem.service.Contact;
 import com.beem.project.beem.service.aidl.IBeemConnectionListener;
+import com.beem.project.beem.service.aidl.IRoster;
 import com.beem.project.beem.service.aidl.IXMPPConnection;
 import com.beem.project.beem.service.aidl.IXMPPFacade;
 
 public class ContactList extends ExpandableListActivity {
 
+    private static final String TAG = "CONTACTLIST_ACT";
+    
     private IXMPPFacade mService = null;
 
     @Override
@@ -65,7 +69,7 @@
         public void onServiceConnected(ComponentName name, IBinder service) {
             mService = IXMPPFacade.Stub.asInterface(service);
             try {
-		IXMPPConnection con = mService.getXMPPConnection();
+		IXMPPConnection con = mService.createConnection();
 		con.addConnectionListener(new TestConnectionListener());
 		mService.connectSync();
 		Log.i("BEEM", "Connected !!!");
@@ -108,6 +112,10 @@
 	@Override
 	public void onConnect() throws RemoteException {
 	    // TODO Auto-generated method stub
+	    IRoster roster = mService.getRoster();
+	    for (Contact contact : roster.getContactList()) {
+		Log.v(TAG,"Contact name " + contact.getJID() );
+	    }
 	    showContactList();
 	}