/* Copyright (c) 2008 Bluendo S.r.L. * See about.html for details about license. * * $Id: MUCScreen.java 1586 2009-06-17 12:26:55Z luca $ */ package lampiro.screens; import it.yup.ui.UICanvas; import it.yup.ui.UICombobox; import it.yup.ui.UIItem; import it.yup.ui.UILabel; import it.yup.ui.UIMenu; import it.yup.ui.UIScreen; import it.yup.util.ResourceIDs; import it.yup.xml.Element; import it.yup.xmlstream.PacketListener; import it.yup.xmpp.Contact; import it.yup.xmpp.MUC; import it.yup.xmpp.XMPPClient; import it.yup.xmpp.packets.DataForm; import it.yup.xmpp.packets.Iq; import it.yup.xmpp.packets.Message; import it.yup.xmpp.packets.Presence; import java.util.Enumeration; import java.util.Vector; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class MUCScreen extends ChatScreen implements PacketListener { public static int unnamedMUCCounter = 0; UICombobox rosterCombo; private Vector mucCandidates = new Vector(); private UILabel cmd_topic = new UILabel(rm .getString(ResourceIDs.STR_SET_TOPIC)); private Vector orderedContacts; public MUCScreen(Contact u) { super(u, u.jid); chatLineStart = 1; //this.setFreezed(true); this.getMenu().insert(1, cmd_topic); this.getMenu().remove(this.cmd_capture_img); this.getMenu().remove(this.cmd_capture_aud); this.getMenu().remove(this.cmd_send_file); setTitle(rm.getString(ResourceIDs.STR_GROUP_CHAT) + " " + user.getPrintableName()); this.rosterCombo = new UICombobox(rm .getString(ResourceIDs.STR_ADD_USER), true); this.rosterCombo.setSubmenu(this.closeMenu); addUser.setText(rm .getString(ResourceIDs.STR_ADD_USER)); this.chatPanel.insertItemAt(rosterCombo, 0); this.rosterCombo.setSelected(false); if (chatPanel.getItems().size() > 5) { // remember the separator chatPanel.setSelectedIndex(chatPanel.getItems().size() - 2); } else { chatPanel.setSelectedItem(rosterCombo); } chatPanel.setDirty(true); UILabel mucName = (UILabel) header.getItem(0); mucName.setText(rm.getString(ResourceIDs.STR_TOPIC) + ": " + ((MUC) this.user).topic); //this.setFreezed(false); this.askRepaint(); } private void populateRosterCombo() { rosterCombo.removeAll(); mucCandidates.removeAllElements(); this.orderedContacts = RosterScreen.getOrderedContacts(); for (Enumeration en = orderedContacts.elements(); en.hasMoreElements();) { Contact c = (Contact) en.nextElement(); String printableName = c.getPrintableName(); Presence[] ps = c.getAllPresences(); if (ps.length == 1 && c.supportsMUC(ps[0])) { this.rosterCombo.append(printableName); this.mucCandidates.addElement(ps[0]); } else if (ps.length >= 2) { for (int i = 0; i < ps.length; i++) { if (c.supportsMUC(ps[1])) { this.rosterCombo.append(printableName + " " + Contact.resource(ps[i] .getAttribute(Message.ATT_FROM))); this.mucCandidates.addElement(ps[i]); } } } } } public boolean keyPressed(int kc) { if (this.popupList.size() == 0 && this.getMenu().isOpenedState() == false) { int ga = UICanvas.getInstance().getGameAction(kc); if (ga == Canvas.FIRE) { if (this.chatPanel.getItems().elementAt( chatPanel.getSelectedIndex()) == rosterCombo) { populateRosterCombo(); } } } return super.keyPressed(kc); } public void menuAction(UIMenu menu, UIItem c) { if (c == cmd_exit || c == this.closeLabel) { // for MUCs the conversation is downloaded again at any reconnection // conversations.remove(user.jid); closeMe(); } else if (c == topic_button) { String topicName = this.topic_name_field.getText(); XMPPClient client = XMPPClient.getInstance(); Message msg = new Message(Contact.userhost(this.user.jid), Message.GROUPCHAT); msg.addElement(null, "subject").addText(topicName); client.sendPacket(msg); this.topic_name_field.setText(""); return; } else if (c == cmd_topic) { askTopic(); return; } else if (c == addUser) { this.setSelectedIndex(this.indexOf(this.rosterCombo)); chatPanel.setSelected(false); chatPanel.setDirty(true); populateRosterCombo(); this.rosterCombo.openMenu(); return; } else if (c == cmd_clear) { super.menuAction(menu, c); this.chatPanel.insertItemAt(rosterCombo, 0); return; } super.menuAction(menu, c); } boolean needDisplay() { Vector allConvs = user.getAllConvs(); Enumeration en = allConvs.elements(); while (en.hasMoreElements()) { Object[] coupleConv = (Object[]) en.nextElement(); Vector messages = (Vector) coupleConv[1]; if (messages.size() > 0) { return true; } } return false; } boolean isMyPacket(Element e) { return Contact.userhost(e.getAttribute(Iq.ATT_FROM)).equals( preferredResource); } /** * * @param screen_width * @return true if new messages have been added */ boolean updateConversation() { return this.updateResConversation(this.user.jid); } void updateResource() { } static void handlePresence(MUC presenceMUC, Element e, String type) { String jidName = Contact.resource(e.getAttribute(Message.ATT_FROM)); // avoid printing myself data here boolean goingOffline = type != null && type.compareTo("unavailable") == 0; if (jidName.equals(Contact.user(XMPPClient.getInstance().my_jid)) && goingOffline) return; Message msg = null; msg = new Message(presenceMUC.jid, Message.HEADLINE); msg.setAttribute(Message.ATT_FROM, e.getAttribute(Message.ATT_FROM)); String msgText = ""; boolean send = false; String endString = " " + rm.getString(ResourceIDs.STR_GROUP_CHAT).toLowerCase() + "."; if (type == null) { send = true; msgText = jidName + " " + rm.getString(ResourceIDs.STR_JOINED_MUC) + endString; } else if (goingOffline) { send = true; msgText = jidName + " " + rm.getString(ResourceIDs.STR_LEFT_MUC) + endString; } if (send == true) { msg.setBody(msgText); presenceMUC.lastResource = null; presenceMUC .addMessageToHistory(e.getAttribute(Message.ATT_TO), msg); RosterScreen rs = RosterScreen.getInstance(); rs.updateContact(presenceMUC, Contact.CH_MESSAGE_NEW); rs.askRepaint(); UIScreen ms = (UIScreen) RosterScreen.getChatScreenList().get( presenceMUC.jid); if (ms != null) UICanvas.getInstance().askRepaint(ms); } } void sendInvite(String ithContact) { Message msg = new Message(user.jid, null); Element x = new Element(XMPPClient.NS_MUC_USER, DataForm.X); msg.addElement(x); Element invite = new Element("", "invite"); invite.setAttribute(Message.ATT_TO, ithContact); x.addElement(invite); XMPPClient.getInstance().sendPacket(msg); } protected void getPrintableHeight(Graphics g, int h) { super.getPrintableHeight(g, h); if (rosterCombo == null) { // this method could be called without rosterCombo // being initialized. this.rosterCombo = new UICombobox(rm .getString(ResourceIDs.STR_ADD_USER), true); } this.printableHeight -= this.rosterCombo.getHeight(g); } ConversationEntry wrapMessage(String text[]) { // #ifdef TIMING long t1 = System.currentTimeMillis(); // #endif byte type = (text[2] != null && Contact.resource(text[2]) != null && Contact .resource(text[2]).equals(Contact.user(text[0]))) ? ConversationEntry.ENTRY_TO : ConversationEntry.ENTRY_FROM; // #ifdef TIMING System.out.println("wrap conv: " + (System.currentTimeMillis() - t1)); // #endif String labelText = ""; labelText += text[1]; ConversationEntry convEntry = new ConversationEntry(labelText, type); if (type == ConversationEntry.ENTRY_FROM && text[2] != null) convEntry.from = text[2]; if (text[3] != null) convEntry.arriveTime = text[3]; convEntry.messageType = text[4]; return convEntry; } public void itemAction(UIItem c) { if (c == this.rosterCombo) { int[] selIndeces = this.rosterCombo.getSelectedIndeces(); for (int i = 0; i < selIndeces.length; i++) { int ithInt = selIndeces[i]; Presence p = (Presence) this.mucCandidates.elementAt(ithInt); this.sendInvite(p.getAttribute(Message.ATT_FROM)); } this.setSelectedIndex(this.indexOf(this.chatPanel)); boolean flags[] = new boolean[this.mucCandidates.size()]; for (int i = 0; i < flags.length; i++) flags[i] = false; this.rosterCombo.setSelectedFlags(flags); this.chatPanel .setSelectedIndex(this.chatPanel.getItems().size() - 2); rosterCombo.removeAll(); mucCandidates.removeAllElements(); if (orderedContacts != null) orderedContacts.removeAllElements(); this.askRepaint(); return; } super.itemAction(c); } String getLabelHeader(ConversationEntry entry) { String retString = ""; int fromLength = entry.from.length(); int arriveTimeLength = entry.arriveTime.length(); if (arriveTimeLength > 0 || fromLength > 0) { retString = "["; if (fromLength > 0) retString += Contact.resource(entry.from); if (fromLength > 0 && arriveTimeLength > 0) retString += " "; if (arriveTimeLength > 0) retString += entry.arriveTime; retString += "] "; } return retString; } }