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 |
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. |