src/com/beem/project/beem/service/RosterAdapter.java
changeset 279 af993bc754a5
parent 271 e5040078e3bb
child 281 3178dcbd170a
equal deleted inserted replaced
278:8bfaad9cfe93 279:af993bc754a5
    25 
    25 
    26 /**
    26 /**
    27  * This class implement a Roster adapter for BEEM.
    27  * This class implement a Roster adapter for BEEM.
    28  * @author darisk
    28  * @author darisk
    29  */
    29  */
    30 public class RosterAdapter extends com.beem.project.beem.service.aidl.IRoster.Stub {
    30 public class RosterAdapter extends
       
    31 	com.beem.project.beem.service.aidl.IRoster.Stub {
    31 
    32 
    32     private static final String TAG = "RosterAdapter";
    33     private static final String TAG = "RosterAdapter";
    33     private Roster mAdaptee;
    34     private Roster mAdaptee;
    34     private RemoteCallbackList<IBeemRosterListener> mRemoteRosListeners = new RemoteCallbackList<IBeemRosterListener>();
    35     private RemoteCallbackList<IBeemRosterListener> mRemoteRosListeners = new RemoteCallbackList<IBeemRosterListener>();
    35 
    36 
    37 
    38 
    38     private RosterListenerAdapter mRosterListener = new RosterListenerAdapter();
    39     private RosterListenerAdapter mRosterListener = new RosterListenerAdapter();
    39 
    40 
    40     /**
    41     /**
    41      * Constructor.
    42      * Constructor.
    42      * @param roster the roster to adapt
    43      * @param roster
       
    44      *            the roster to adapt
    43      */
    45      */
    44     public RosterAdapter(final Roster roster) {
    46     public RosterAdapter(final Roster roster) {
    45 	mAdaptee = roster;
    47 	mAdaptee = roster;
    46 	roster.addRosterListener(mRosterListener);
    48 	roster.addRosterListener(mRosterListener);
    47 	for (RosterEntry entry : roster.getEntries()) {
    49 	for (RosterEntry entry : roster.getEntries()) {
    48 	    String user = StringUtils.parseBareAddress(entry.getUser());
    50 	    String user = StringUtils.parseBareAddress(entry.getUser());
    49 	    if (!mContacts.containsKey(user)) {
    51 	    if (!mContacts.containsKey(user)) {
    50 		Contact c = new Contact(user);
    52 		Contact c = getContactFromRosterEntry(entry);
    51 		c.setStatus(roster.getPresence(user));
       
    52 		c.setGroups(entry.getGroups());
       
    53 		c.setName(entry.getName());
       
    54 		mContacts.put(user, c);
    53 		mContacts.put(user, c);
    55 	    }
    54 	    }
    56 	}
    55 	}
    57     }
    56     }
    58 
    57 
    59     /**
    58     /**
    60      * {@inheritDoc}
    59      * {@inheritDoc}
    61      */
    60      */
    62     @Override
    61     @Override
    63     public void addRosterListener(IBeemRosterListener listen) throws RemoteException {
    62     public void addRosterListener(IBeemRosterListener listen)
       
    63 	    throws RemoteException {
    64 	if (listen != null)
    64 	if (listen != null)
    65 	    mRemoteRosListeners.register(listen);
    65 	    mRemoteRosListeners.register(listen);
    66     }
    66     }
    67 
    67 
    68     /**
    68     /**
    69      * {@inheritDoc}
    69      * {@inheritDoc}
    70      */
    70      */
    71     @Override
    71     @Override
    72     public Contact addContact(String user, String name, String[] groups) throws RemoteException {
    72     public Contact addContact(String user, String name, String[] groups)
       
    73 	    throws RemoteException {
    73 	Contact res = null;
    74 	Contact res = null;
    74 	RosterEntry contact = mAdaptee.getEntry(user);
    75 	RosterEntry contact = mAdaptee.getEntry(user);
    75 	if (contact != null) {
    76 	if (contact != null) {
    76 	    res = mContacts.get(user);
    77 	    res = mContacts.get(user);
    77 	    if (groups != null) {
    78 	    if (groups != null) {
    78 		for (String groupStr : groups) {
    79 		for (String groupStr : groups) {
    79 		    boolean found = false;
    80 		    boolean found = false;
    80 		    for (RosterGroup group : mAdaptee.getGroups()) {
    81 		    for (RosterGroup group : mAdaptee.getGroups()) {
    81 			if (group.getName().equals(groupStr) && !group.contains(contact)) {
    82 			if (group.getName().equals(groupStr)
       
    83 				&& !group.contains(contact)) {
    82 			    try {
    84 			    try {
    83 				group.addEntry(contact);
    85 				group.addEntry(contact);
    84 				res.addGroup(groupStr);
    86 				res.addGroup(groupStr);
    85 				found = true;
    87 				found = true;
    86 			    } catch (XMPPException e) {
    88 			    } catch (XMPPException e) {
   124 
   126 
   125     /**
   127     /**
   126      * {@inheritDoc}
   128      * {@inheritDoc}
   127      */
   129      */
   128     @Override
   130     @Override
   129     public void deleteContact(Contact contact, String group) throws RemoteException {
   131     public void deleteContact(Contact contact, String group)
       
   132 	    throws RemoteException {
   130 	mContacts.get(contact.getJID()).delGroup(group);
   133 	mContacts.get(contact.getJID()).delGroup(group);
   131 	try {
   134 	try {
   132 	    mAdaptee.getGroup(group).removeEntry(mAdaptee.getEntry(contact.getJID()));
   135 	    mAdaptee.getGroup(group).removeEntry(
       
   136 		    mAdaptee.getEntry(contact.getJID()));
   133 	} catch (XMPPException e) {
   137 	} catch (XMPPException e) {
   134 	    e.printStackTrace();
   138 	    e.printStackTrace();
   135 	}
   139 	}
   136     }
   140     }
   137 
   141 
   176 
   180 
   177     /**
   181     /**
   178      * {@inheritDoc}
   182      * {@inheritDoc}
   179      */
   183      */
   180     @Override
   184     @Override
   181     public void removeRosterListener(IBeemRosterListener listen) throws RemoteException {
   185     public void removeRosterListener(IBeemRosterListener listen)
       
   186 	    throws RemoteException {
   182 	if (listen != null)
   187 	if (listen != null)
   183 	    mRemoteRosListeners.unregister(listen);
   188 	    mRemoteRosListeners.unregister(listen);
   184     }
   189     }
   185 
   190 
   186     /**
   191     /**
   195     @Override
   200     @Override
   196     public PresenceAdapter getPresence(String jid) throws RemoteException {
   201     public PresenceAdapter getPresence(String jid) throws RemoteException {
   197 	return new PresenceAdapter(mAdaptee.getPresence(jid));
   202 	return new PresenceAdapter(mAdaptee.getPresence(jid));
   198     }
   203     }
   199 
   204 
   200     /**
   205     private Contact getContactFromRosterEntry(RosterEntry entry) {
   201      * Listener for the roster events. It will call the remote listeners registered.
   206 	String user = StringUtils.parseBareAddress(entry.getUser());
       
   207 	Contact c = new Contact(user);
       
   208 	c.setStatus(mAdaptee.getPresence(user));
       
   209 	c.setGroups(entry.getGroups());
       
   210 	c.setName(entry.getName());
       
   211 	return c;
       
   212     }
       
   213 
       
   214     /**
       
   215      * Listener for the roster events. It will call the remote listeners
       
   216      * registered.
   202      * @author darisk
   217      * @author darisk
   203      */
   218      */
   204     private class RosterListenerAdapter implements RosterListener {
   219     private class RosterListenerAdapter implements RosterListener {
   205 
   220 
   206 	/**
   221 	/**
   219 	    final int n = mRemoteRosListeners.beginBroadcast();
   234 	    final int n = mRemoteRosListeners.beginBroadcast();
   220 
   235 
   221 	    List<String> tab = new ArrayList<String>();
   236 	    List<String> tab = new ArrayList<String>();
   222 	    tab.addAll(addresses);
   237 	    tab.addAll(addresses);
   223 	    for (int i = 0; i < n; i++) {
   238 	    for (int i = 0; i < n; i++) {
   224 		IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
   239 		IBeemRosterListener listener = mRemoteRosListeners
       
   240 			.getBroadcastItem(i);
   225 		try {
   241 		try {
   226 		    listener.onEntriesAdded(tab);
   242 		    listener.onEntriesAdded(tab);
   227 		} catch (RemoteException e) {
   243 		} catch (RemoteException e) {
   228 		    Log.w(TAG, "Error while adding roster entries", e);
   244 		    Log.w(TAG, "Error while adding roster entries", e);
   229 		}
   245 		}
   240 	    final int n = mRemoteRosListeners.beginBroadcast();
   256 	    final int n = mRemoteRosListeners.beginBroadcast();
   241 
   257 
   242 	    List<String> tab = new ArrayList<String>();
   258 	    List<String> tab = new ArrayList<String>();
   243 	    tab.addAll(addresses);
   259 	    tab.addAll(addresses);
   244 	    for (int i = 0; i < n; i++) {
   260 	    for (int i = 0; i < n; i++) {
   245 		IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
   261 		IBeemRosterListener listener = mRemoteRosListeners
       
   262 			.getBroadcastItem(i);
   246 		try {
   263 		try {
   247 		    listener.onEntriesDeleted(tab);
   264 		    listener.onEntriesDeleted(tab);
   248 		} catch (RemoteException e) {
   265 		} catch (RemoteException e) {
   249 		    Log.w(TAG, "Error while deleting roster entries", e);
   266 		    Log.w(TAG, "Error while deleting roster entries", e);
   250 		}
   267 		}
   261 	    final int n = mRemoteRosListeners.beginBroadcast();
   278 	    final int n = mRemoteRosListeners.beginBroadcast();
   262 
   279 
   263 	    List<String> tab = new ArrayList<String>();
   280 	    List<String> tab = new ArrayList<String>();
   264 	    tab.addAll(addresses);
   281 	    tab.addAll(addresses);
   265 	    for (int i = 0; i < n; i++) {
   282 	    for (int i = 0; i < n; i++) {
   266 		IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
   283 		IBeemRosterListener listener = mRemoteRosListeners
       
   284 			.getBroadcastItem(i);
   267 		try {
   285 		try {
   268 		    listener.onEntriesUpdated(tab);
   286 		    listener.onEntriesUpdated(tab);
   269 		} catch (RemoteException e) {
   287 		} catch (RemoteException e) {
   270 		    Log.w(TAG, "Error while updating roster entries", e);
   288 		    Log.w(TAG, "Error while updating roster entries", e);
   271 		}
   289 		}
   290 	    c.setName(mAdaptee.getEntry(user).getName());
   308 	    c.setName(mAdaptee.getEntry(user).getName());
   291 	    /* redispatch vers les IBeemRosterListener */
   309 	    /* redispatch vers les IBeemRosterListener */
   292 	    final int n = mRemoteRosListeners.beginBroadcast();
   310 	    final int n = mRemoteRosListeners.beginBroadcast();
   293 
   311 
   294 	    for (int i = 0; i < n; i++) {
   312 	    for (int i = 0; i < n; i++) {
   295 		IBeemRosterListener listener = mRemoteRosListeners.getBroadcastItem(i);
   313 		IBeemRosterListener listener = mRemoteRosListeners
       
   314 			.getBroadcastItem(i);
   296 		try {
   315 		try {
   297 		    listener.onPresenceChanged(new PresenceAdapter(presence));
   316 		    listener.onPresenceChanged(new PresenceAdapter(presence));
   298 		} catch (RemoteException e) {
   317 		} catch (RemoteException e) {
   299 		    // The RemoteCallbackList will take care of removing the
   318 		    // The RemoteCallbackList will take care of removing the
   300 		    // dead listeners.
   319 		    // dead listeners.