Bug #170
authornikita@nikita-lab
Sat, 20 Jun 2009 22:42:26 +0200
changeset 255 8d0efe92412b
parent 254 daf9be1b7b1f
child 256 35f81983d351
Bug #170 Debug de l'ajout de contact, que ce soit pour un contact existant ou inexistant, pareil pour le groupe du contacte.
src/com/beem/project/beem/service/RosterAdapter.java
src/com/beem/project/beem/ui/AddContact.java
src/com/beem/project/beem/ui/ContactList.java
src/com/beem/project/beem/ui/Subscription.java
--- a/src/com/beem/project/beem/service/RosterAdapter.java	Sat Jun 20 19:43:37 2009 +0200
+++ b/src/com/beem/project/beem/service/RosterAdapter.java	Sat Jun 20 22:42:26 2009 +0200
@@ -5,7 +5,9 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -30,246 +32,272 @@
  */
 public class RosterAdapter extends com.beem.project.beem.service.aidl.IRoster.Stub {
 
-    /**
-     * Listener for the roster events. It will call the remote listeners registered.
-     * 
-     * @author darisk
-     */
-    private class RosterListenerAdapter implements RosterListener {
+	/**
+	 * Listener for the roster events. It will call the remote listeners registered.
+	 * 
+	 * @author darisk
+	 */
+	private class RosterListenerAdapter implements RosterListener {
+
+		/**
+		 * Constructor.
+		 */
+		public RosterListenerAdapter() {
+			// TODO Auto-generated constructor stub
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void entriesAdded(Collection<String> addresses) {
+			Log.i(TAG, "Ajout de l'entry");
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = new ArrayList<String>();
+			tab.addAll(addresses);
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {					
+					listener.onEntriesAdded(tab);
+				} catch (RemoteException e) {
+					Log.w(TAG, "Error while adding roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void entriesDeleted(Collection<String> addresses) {
+			Log.i(TAG, "Suppression de l'entry");
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = new ArrayList<String>();
+			tab.addAll(addresses);
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {					
+					listener.onEntriesDeleted(tab);
+				} catch (RemoteException e) {
+					Log.w(TAG, "Error while deleting roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void entriesUpdated(Collection<String> addresses) {
+			Log.d(TAG, "Update de l'entry");
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			List<String> tab = new ArrayList<String>();
+			tab.addAll(addresses);
+			for (int i = 0; i < n; i++) {
+				IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
+				try {					
+					listener.onEntriesUpdated(tab);
+				} catch (RemoteException e) {
+					Log.w(TAG, "Error while updating roster entries", e);
+				}
+			}
+			mRemoteRosListeners.finishBroadcast();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void presenceChanged(Presence presence) {
+			Log.i(TAG, "Changement de Presence");
+			String user = StringUtils.parseBareAddress(presence.getFrom());
+			Log.d(TAG, "User : " + user);
+			Contact c = mContacts.get(StringUtils.parseBareAddress(user));
+			if (c == null) {
+				c = new Contact(user);
+				mContacts.put(user, c);
+			}
+			c.addRes(StringUtils.parseResource(presence.getFrom()));
+			c.setStatus(mAdaptee.getPresence(presence.getFrom()));
+			c.setMsgState(presence.getStatus());
+			c.setName(mAdaptee.getEntry(user).getName());
+			/* redispatch vers les IBeemRosterListener */
+			final int n = mRemoteRosListeners.beginBroadcast();
+
+			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();
+		}
+	}
+
+	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 RosterListenerAdapter                   mRosterListener     = new RosterListenerAdapter();
 
 	/**
 	 * Constructor.
-	 */
-	public RosterListenerAdapter() {
-	    // TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void entriesAdded(Collection<String> addresses) {
-	    Log.i(TAG, "Ajout de l'entry");
-	    final int n = mRemoteRosListeners.beginBroadcast();
-
-	    List<String> tab = new ArrayList<String>();
-	    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();
-	}
-
-	/**
-	 * {@inheritDoc}
+	 * 
+	 * @param roster
+	 *            the roster to adapt
 	 */
-	@Override
-	public void entriesDeleted(Collection<String> addresses) {
-	    Log.i(TAG, "Suppression de l'entry");
-	    final int n = mRemoteRosListeners.beginBroadcast();
-
-	    List<String> tab = new ArrayList<String>();
-	    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);
+	public RosterAdapter(final Roster roster) {
+		mAdaptee = roster;
+		roster.addRosterListener(mRosterListener);
+		for (RosterEntry entry : roster.getEntries()) {
+			String user = StringUtils.parseBareAddress(entry.getUser());
+			if (!mContacts.containsKey(user)) {
+				Contact c = new Contact(user);
+				c.setStatus(roster.getPresence(user));
+				c.setGroups(entry.getGroups());
+				c.setName(entry.getName());
+				mContacts.put(user, c);
+			}
 		}
-	    }
-	    mRemoteRosListeners.finishBroadcast();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void entriesUpdated(Collection<String> addresses) {
-	    Log.d(TAG, "Update de l'entry");
-	    final int n = mRemoteRosListeners.beginBroadcast();
-
-	    List<String> tab = new ArrayList<String>();
-	    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();
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void presenceChanged(Presence presence) {
-	    Log.i(TAG, "Changement de Presence");
-	    /* gestion du roster coter sedirvice */
-	    String user = StringUtils.parseBareAddress(presence.getFrom());
-	    Log.d(TAG, "User : " + user);
-	    Contact c = mContacts.get(StringUtils.parseBareAddress(user));
-	    if (c == null) {
-		c = new Contact(user);
-		mContacts.put(user, c);
-	    }
-	    c.addRes(StringUtils.parseResource(presence.getFrom()));
-	    c.setStatus(mAdaptee.getPresence(presence.getFrom()));
-	    c.setMsgState(presence.getStatus());
-	    c.setName(mAdaptee.getEntry(user).getName());
-	    /* redispatch vers les IBeemRosterListener */
-	    final int n = mRemoteRosListeners.beginBroadcast();
-
-	    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();
+	public void addRosterListener(IBeemRosterListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteRosListeners.register(listen);
 	}
-    }
 
-    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 RosterListenerAdapter                   mRosterListener     = new RosterListenerAdapter();
-
-    /**
-     * Constructor.
-     * 
-     * @param roster
-     *            the roster to adapt
-     */
-    public RosterAdapter(final Roster roster) {
-	mAdaptee = roster;
-	roster.addRosterListener(mRosterListener);
-	for (RosterEntry entry : roster.getEntries()) {
-	    String user = StringUtils.parseBareAddress(entry.getUser());
-	    if (!mContacts.containsKey(user)) {
-		Contact c = new Contact(user);
-		c.setStatus(roster.getPresence(user));
-		c.setGroups(entry.getGroups());
-		c.setName(entry.getName());
-		mContacts.put(user, c);
-	    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Contact addContact(String user, String name, String[] groups) throws RemoteException {
+		Contact res = null;
+		RosterEntry contact = mAdaptee.getEntry(user);
+		if (contact != null)  {
+			res = mContacts.get(user);
+			for (String groupStr : groups) {
+				boolean found = false;
+				for (RosterGroup group: mAdaptee.getGroups()) {
+					if (group.getName().equals(groupStr) && !group.contains(contact)) {
+						try {
+							group.addEntry(contact);
+							res.addGroup(groupStr);
+							found = true;
+						} catch (XMPPException e) {
+							e.printStackTrace();
+						}
+					}
+				}
+				if (!found) {
+					try {
+						mAdaptee.createGroup(groupStr).addEntry(contact);
+					} catch (XMPPException e) {
+						e.printStackTrace();
+					} catch (IllegalArgumentException e) {
+					}
+					res.addGroup(groupStr);
+				}
+			}
+		} else {
+			try {
+				mAdaptee.createEntry(user, name, groups);
+				res = new Contact(user);
+				mContacts.put(user, res);
+				for (String groupStr : groups) {
+					try {
+						mAdaptee.createGroup(groupStr);
+					} catch (IllegalArgumentException e) {
+						//e.printStackTrace();
+					}
+					res.addGroup(groupStr);
+				}
+			} catch (XMPPException e) {
+				Log.e(TAG, "Error while adding new contact", e);
+				return null;
+			}
+		}
+		return res;
 	}
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addRosterListener(IBeemRosterListener listen) throws RemoteException {
-	if (listen != null)
-	    mRemoteRosListeners.register(listen);
-    }
 
-    /**
-     * {@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);
-	    for (String group : groups) {
-		// mAdaptee.createGroup(group);
-		res.addGroup(group);
-	    }
-	    return res;
-	} catch (XMPPException e) {
-	    Log.e(TAG, "Error while adding new contact", e);
-	    return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void createGroup(String groupname) throws RemoteException {
+		mAdaptee.createGroup(groupname);
 	}
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void createGroup(String groupname) throws RemoteException {
-	mAdaptee.createGroup(groupname);
-    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void deleteContact(Contact contact) throws RemoteException {
+		mContacts.remove(contact.getJID());
+	}
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void deleteContact(Contact contact) throws RemoteException {
-	mContacts.remove(contact.getJID());
-    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Contact getContact(String jid) throws RemoteException {
+		return mContacts.get(jid);
+	}
 
-    /**
-     * {@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<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());
+	/**
+	 * {@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;
 	}
-	return result;
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void removeRosterListener(IBeemRosterListener listen) throws RemoteException {
-	if (listen != null)
-	    mRemoteRosListeners.unregister(listen);
-    }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void removeRosterListener(IBeemRosterListener listen) throws RemoteException {
+		if (listen != null)
+			mRemoteRosListeners.unregister(listen);
+	}
 
-    /**
-     * 
-     */
-    @Override
-    public void setContactName(String jid, String name) throws RemoteException {
-	mContacts.get(jid).setName(name);
-	mAdaptee.getEntry(jid).setName(name);
-    }
+	/**
+	 * 
+	 */
+	@Override
+	public void setContactName(String jid, String name) throws RemoteException {
+		mContacts.get(jid).setName(name);
+		mAdaptee.getEntry(jid).setName(name);
+	}
 
 	@Override
 	public PresenceAdapter getPresence(String jid) throws RemoteException {
--- a/src/com/beem/project/beem/ui/AddContact.java	Sat Jun 20 19:43:37 2009 +0200
+++ b/src/com/beem/project/beem/ui/AddContact.java	Sat Jun 20 22:42:26 2009 +0200
@@ -28,75 +28,81 @@
  */
 public class AddContact extends Activity {
 
-    protected static final String TAG = "AddContact";
-    private String mLogin;
-    private String mAlias;
-    private final List<String> mGroup = new ArrayList<String>();
-    private IXmppFacade xmppFacade;
-    private final ServiceConnection mServConn = new BeemServiceConnection();
+	protected static final String TAG = "AddContact";
+	private String mLogin;
+	private String mAlias;
+	private final List<String> mGroup = new ArrayList<String>();
+	private IXmppFacade xmppFacade;
+	private final ServiceConnection mServConn = new BeemServiceConnection();
 
-    private final OnClickListener mOkListener = new OnClickListener() {
+	private final OnClickListener mOkListener = new OnClickListener() {
 
-	@Override
-	public void onClick(View v) {
-	    boolean valid = true;
-	    if (getWidgetText(R.id.addc_login).length() == 0) {
-		valid = false;
-	    } else {
-		mLogin = getWidgetText(R.id.addc_login);
-	    }
-	    if (getWidgetText(R.id.addc_alias).length() == 0) {
-		valid = false;
-	    } else {
-		mAlias = getWidgetText(R.id.addc_alias);
-	    }
-	    if (getWidgetText(R.id.addc_group).length() == 0) {
-		valid = false;
-	    } else {
-		mGroup.add(getWidgetText(R.id.addc_group));
-	    }
-	    if (valid) {
-		try {
-		    xmppFacade.getRoster().addContact(mLogin, mAlias, mGroup.toArray(new String[mGroup.size()]));
-		    Toast.makeText(AddContact.this, getString(R.string.AddCContactAdded), Toast.LENGTH_SHORT).show();
-		    finish();
-		} catch (RemoteException e) {
-		    Toast.makeText(AddContact.this, e.getMessage(), Toast.LENGTH_SHORT).show();
-		    e.printStackTrace();
+		@Override
+		public void onClick(View v) {
+			boolean valid = true;
+			if (getWidgetText(R.id.addc_login).length() == 0) {
+				valid = false;
+			} else {
+				mLogin = getWidgetText(R.id.addc_login);
+			}
+			if (getWidgetText(R.id.addc_alias).length() == 0) {
+				valid = false;
+			} else {
+				mAlias = getWidgetText(R.id.addc_alias);
+			}
+			if (getWidgetText(R.id.addc_group).length() == 0) {
+				valid = false;
+			} else {
+				mGroup.add(getWidgetText(R.id.addc_group));
+			}
+			if (valid) {
+				try {
+					xmppFacade.getRoster().addContact(mLogin, mAlias, mGroup.toArray(new String[mGroup.size()]));
+					Toast.makeText(AddContact.this, getString(R.string.AddCContactAdded), Toast.LENGTH_SHORT).show();
+					finish();
+				} catch (RemoteException e) {
+					Toast.makeText(AddContact.this, e.getMessage(), Toast.LENGTH_SHORT).show();
+					e.printStackTrace();
+				}
+				setResult(RESULT_OK);
+			} else {
+				Toast.makeText(AddContact.this, getString(R.string.AddCBadForm), Toast.LENGTH_SHORT).show();
+				setResult(RESULT_CANCELED);
+			}
+
 		}
-		setResult(RESULT_OK);
-	    } else {
-		Toast.makeText(AddContact.this, getString(R.string.AddCBadForm), Toast.LENGTH_SHORT).show();
-		setResult(RESULT_CANCELED);
-	    }
-
-	}
-    };
-
-    private String getWidgetText(int id) {
-	EditText widget = (EditText) this.findViewById(id);
-	return widget.getText().toString();
-    }
+	};
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-	super.onCreate(savedInstanceState);
-	setContentView(R.layout.addcontact);
-	Button ok = (Button) findViewById(R.id.addc_ok);
-	ok.setOnClickListener(mOkListener);
-	bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
-    }
-    
-    private class BeemServiceConnection implements ServiceConnection {
-
-	@Override
-	public void onServiceConnected(ComponentName name, IBinder service) {
-	    xmppFacade = IXmppFacade.Stub.asInterface(service);
+	private String getWidgetText(int id) {
+		EditText widget = (EditText) this.findViewById(id);
+		return widget.getText().toString();
 	}
 
 	@Override
-	public void onServiceDisconnected(ComponentName name) {
-	    xmppFacade = null;
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.addcontact);
+		Button ok = (Button) findViewById(R.id.addc_ok);
+		ok.setOnClickListener(mOkListener);
+		bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
+	}
+	
+	@Override
+	protected void onDestroy() {
+		super.onDestroy();
+		unbindService(mServConn);
 	}
-    }
+
+	private class BeemServiceConnection implements ServiceConnection {
+
+		@Override
+		public void onServiceConnected(ComponentName name, IBinder service) {
+			xmppFacade = IXmppFacade.Stub.asInterface(service);
+		}
+
+		@Override
+		public void onServiceDisconnected(ComponentName name) {
+			xmppFacade = null;
+		}
+	}
 }
--- a/src/com/beem/project/beem/ui/ContactList.java	Sat Jun 20 19:43:37 2009 +0200
+++ b/src/com/beem/project/beem/ui/ContactList.java	Sat Jun 20 22:42:26 2009 +0200
@@ -200,8 +200,7 @@
 					} else {
 						boolean found = false;
 						for (Contact tempContact : groupMap.get(group)) {
-							if (tempContact.getJID() == str) {
-								curContact = tempContact;
+							if (tempContact.getJID().equals(str)) {
 								found = true;
 								break;
 							}
--- a/src/com/beem/project/beem/ui/Subscription.java	Sat Jun 20 19:43:37 2009 +0200
+++ b/src/com/beem/project/beem/ui/Subscription.java	Sat Jun 20 22:42:26 2009 +0200
@@ -6,7 +6,6 @@
 import org.jivesoftware.smack.packet.Presence;
 import org.jivesoftware.smack.packet.Presence.Type;
 
-import com.beem.project.beem.BeemApplication;
 import com.beem.project.beem.BeemService;
 import com.beem.project.beem.R;
 import com.beem.project.beem.service.PresenceAdapter;
@@ -19,7 +18,6 @@
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.TextView;