/* Copyright (c) 2008 Bluendo S.r.L.
* See about.html for details about license.
*
* $Id: RosterScreen.java 1377 2009-04-21 14:17:38Z luca $
*/
package it.yup.screens;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import lampiro.LampiroMidlet;
import it.yup.screens.DataFormScreen;
import it.yup.screens.DataResultScreen;
import it.yup.util.ResourceIDs;
import it.yup.util.ResourceManager;
import it.yup.util.Utils;
// #ifdef SCREENSAVER
import java.util.TimerTask;
// #endif
import it.yup.xml.Element;
import it.yup.xmpp.Config;
import it.yup.xmpp.Contact;
import it.yup.xmpp.DataFormListener;
import it.yup.xmpp.IQResultListener;
import it.yup.xmpp.Task;
import it.yup.xmpp.XMPPClient;
import it.yup.xmpp.XMPPClient.XmppListener;
import it.yup.xmpp.packets.DataForm;
import it.yup.xmpp.packets.Iq;
public class RosterScreen extends Canvas implements CommandListener,
XmppListener {
/*
* a mask used to playing tones
*/
private boolean play_flags[];
/*
* the volume for playing tones
*/
private int volume;
/** reference to the possible alert screen */
private Alert alert;
private static ResourceManager rm = ResourceManager.getManager("common",
"en");
private Command cmd_send = new Command(rm
.getString(ResourceIDs.STR_SEND_MESSAGE), Command.EXIT, 1);
private Command cmd_chat = new Command(rm.getString(ResourceIDs.STR_CHAT),
Command.ITEM, 2);
// XXX info delayed
// private Command cmd_info = new Command(rm.getString(ResourceIDs.STR_EDIT_CONTACT), Command.SCREEN, 3);
private Command cmd_state = new Command(rm
.getString(ResourceIDs.STR_CHANGE_STATUS), Command.SCREEN, 4);
private Command cmd_addc = new Command(rm
.getString(ResourceIDs.STR_ADD_CONTACT), Command.SCREEN, 5);
private Command cmd_delc = new Command(rm
.getString(ResourceIDs.STR_DELETE_CONTACT), Command.ITEM, 6);
// XXX update delayed
// private Command cmd_reload = new Command(rm.getString(ResourceIDs.STR_RELOAD_CONTACT), Command.SCREEN, 6);
private Command cmd_exit = new Command(rm.getString(ResourceIDs.STR_EXIT),
Command.SCREEN, 99);
// #debug
private Command cmd_debug = new Command(rm.getString(ResourceIDs.STR_DEBUG), Command.SCREEN, 100);
private Command cmd_about = new Command(
rm.getString(ResourceIDs.STR_ABOUT), Command.SCREEN, 98);
private Command cmd_querycmd = new Command(rm
.getString(ResourceIDs.STR_QUERYCMD), Command.ITEM, 10);
private Command cmd_listcmd = new Command(rm
.getString(ResourceIDs.STR_LISTCMD), Command.ITEM, 11);
private Command cmd_options = new Command(rm
.getString(ResourceIDs.STR_OPTIONS_SETUP), Command.SCREEN, 12);
private Command cmd_tasks = new Command(rm
.getString(ResourceIDs.STR_PENDINGTASK), Command.ITEM, 1);
private Vector active_contacts = new Vector();
private Vector shown_contacts = null;
private Image img_msg;
private Image img_cmd;
private Image img_task;
private Image img_arrow;
private Image img_traffic;
private int paint_calls = 0;
// #ifdef TIMING
private long paint_time = 0;
// #endif
/** fount used for the conversation */
public static Font f_u;
// drawing constants
// /** true when some conversation has pending messages */
// private boolean unread_messages = ;
/** the line from which the roster is drawn */
private int start_line;
/** the highlighted line */
private int selected_line;
/** the line that will be highligther after a repaint */
private int new_selected_line;
private Contact selected_contact = null;
/** roster line height */
private int line_height = 0;
private int display_lines = -1;
private int width = 0;
private int height = 0;
/** when true repaint only the selection */
private boolean repaint_selection = false;
/** enabled scroll commands */
private byte scroll_enable;
private static final byte SCROLL_DOWN = 1;
private static final byte SCROLL_UP = 2;
/** singleton */
private static RosterScreen _instance;
private char[][] itu_keys = { { ' ', '0' }, { '1' },
{ 'a', 'b', 'c', 'x', '2' }, { 'd', 'e', 'f', 'x', 'x', '3' },
{ 'g', 'h', 'i', 'x', '4' }, { 'j', 'k', 'l', '5' },
{ 'm', 'n', 'o', 'x', '6' }, { 'p', 'q', 'r', 's', '7' },
{ 't', 'u', 'v', 'x', '8' }, { 'w', 'x', 'y', 'z', '9' } };
private String sel_pattern = "";
private long sel_last_ts = 0;
private int sel_last_key = -1;
private int sel_key_offset = 0;
// #ifdef SCREENSAVER
private long last_key_time;
private static long SCREENSAVER_DELAY = 10000;
private TimerTask screensaver_starter = null;
// #endif
/* Style constants (should be moved to Config) */
private int bg_color = 0xCBDBE3;
private int fg_color = 0x000000;
private int line_color = 0xCCCCCC;
private int scroll_color = 0x444444;
private int header_bg = 0x5590AD;
private int header_fg = 0xDDE7EC;
// #ifdef SCREENSAVER
class ScreenSaverStarter extends TimerTask {
public void run() {
if(isShown() && (System.currentTimeMillis()- last_key_time)>SCREENSAVER_DELAY) {
LampiroMidlet.disp.setCurrent(new ScreenSaver(RosterScreen.this));
}
}
}
// #endif
private RosterScreen() {
Config cfg = Config.getInstance();
volume = Integer.parseInt(cfg.getProperty(Config.TONE_VOLUME, "50"));
play_flags = Utils.str2flags(cfg.getProperty(
Config.VIBRATION_AND_TONE_SETTINGS, "1"), 0, 4);
addCommand(cmd_addc);
addCommand(cmd_exit);
addCommand(cmd_state);
// addCommand(cmd_reload);
// #debug
addCommand(cmd_debug);
addCommand(cmd_about);
addCommand(cmd_options);
setCommandListener(this);
f_u = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN,
Font.SIZE_SMALL);
shown_contacts = active_contacts;
start_line = 0;
selected_line = new_selected_line = -1;
scroll_enable = 0;
try {
img_msg = Image.createImage("/icons/message.png");
} catch (IOException e) {
img_msg = Image.createImage(16, 16);
}
try {
img_cmd = Image.createImage("/icons/gear.png");
} catch (IOException e) {
img_cmd = Image.createImage(16, 16);
}
try {
img_task = Image.createImage("/icons/task.png");
} catch (IOException e) {
img_task = Image.createImage(16, 16);
}
try {
img_arrow = Image.createImage("/icons/rightarrow.png");
} catch (IOException e) {
img_arrow = Image.createImage(16, 16);
}
try {
img_traffic = Image.createImage("/icons/traffic.png");
} catch (IOException e) {
img_traffic = Image.createImage(16, 16);
}
if (img_msg.getHeight() > f_u.getHeight()) {
line_height = img_msg.getHeight() + 2;
} else {
line_height = f_u.getHeight() + 2;
}
}
public static RosterScreen getInstance() {
if (_instance == null) {
_instance = new RosterScreen();
}
return _instance;
}
protected void sizeChanged(int w, int h) {
this.width = w;
this.height = h;
display_lines = (h - line_height) / line_height;
repaint();
}
// #ifdef SCREENSAVER
protected void showNotify() {
last_key_time = System.currentTimeMillis();
if(screensaver_starter == null) {
screensaver_starter = new ScreenSaverStarter();
Utils.tasks.scheduleAtFixedRate(screensaver_starter, SCREENSAVER_DELAY, SCREENSAVER_DELAY);
}
}
protected void hideNotify() {
if(screensaver_starter != null) {
screensaver_starter.cancel();
screensaver_starter = null;
}
}
// #endif
/**
* Repaint the component
* @param g the used graphic context
*/
protected synchronized void paint(Graphics g) {
// #ifdef TIMING
long t1 = System.currentTimeMillis();
// #endif
// #ifdef SEND_DEBUG1
boolean flag = repaint_selection;
long t2 = System.currentTimeMillis();
// #endif
paint_calls++;
if (display_lines < 0) {
sizeChanged(g.getClipWidth(), g.getClipHeight());
}
if (repaint_selection) {
paintHeader(g);
paintSelection(g);
repaint_selection = false;
} else {
// external event, redraw all
g.setColor(bg_color);
g.fillRect(0, 0, width, height);
g.setFont(f_u);
paintRoster(g);
paintHeader(g);
}
selected_line = new_selected_line;
toggleMenus();
// #ifdef TIMING
paint_time += (System.currentTimeMillis() - t1);
System.out.println("Roster: " + (System.currentTimeMillis() - t1));
// #endif
// #ifdef SEND_DEBUG1
XMPPClient.getInstance();
XMPPClient.getInstance().sendDebug("repaint: " + flag + " " + (System.currentTimeMillis() - t2));
// #endif
}
// private void paintContactInfo(Graphics g) {
// g.setColor(bg_color);
// Contact c = selected_contact;
// }
/**
* Paint only the selection icon
* @param g
*/
private void paintSelection(Graphics g) {
g.setColor(bg_color);
int hpos;
if (selected_line != -1) {
Contact c;
if (selected_line != new_selected_line) {
c = (Contact) shown_contacts.elementAt(selected_line);
} else {
c = selected_contact;
}
Image img = XMPPClient.getInstance().getPresenceIcon(c,null,
c.getAvailability());
hpos = (selected_line - start_line + 1) * line_height;
g.fillRect(0, hpos + 1, 16, 16);
g.drawImage(img, 0, hpos + 1, Graphics.TOP | Graphics.LEFT);
}
hpos = (new_selected_line - start_line + 1) * line_height;
g.fillRect(0, hpos + 1, 16, 16);
g.drawImage(img_arrow, 0, hpos + 1, Graphics.TOP | Graphics.LEFT);
}
private void paintRoster(Graphics g) {
XMPPClient xmpp = XMPPClient.getInstance();
setTitle(rm.getString(ResourceIDs.STR_ROSTER_TITLE) + "("
+ active_contacts.size() + ")");
int hpos = line_height;
g.setColor(fg_color);
for (int i = start_line; (i < start_line + display_lines)
&& (i < shown_contacts.size()); i++) {
Contact u = (Contact) shown_contacts.elementAt(i);
String uname = u.getPrintableName();
Image pimg = xmpp.getPresenceIcon(u,null, u.getAvailability());
Image cimg = null;
if (u.cmdlist != null) {
cimg = img_cmd;
}
if (u.pending_tasks) {
cimg = img_task;
} else if (u.unread_msg()) {
cimg = img_msg;
} else if (u.cmdlist != null) {
cimg = img_cmd;
}
if (new_selected_line == i) {
pimg = img_arrow;
}
g.setColor(line_color);
g.drawLine(0, hpos, width, hpos);
g.drawImage(pimg, 0, hpos + 1, Graphics.TOP | Graphics.LEFT);
int offset = 17;
if (cimg != null) {
g.drawImage(cimg, offset, hpos + 1, Graphics.TOP
| Graphics.LEFT);
offset = 34;
}
g.setColor(fg_color);
g.drawString(uname, offset, hpos + 1, Graphics.TOP | Graphics.LEFT);
hpos += line_height;
}
// there is something above
scroll_enable = 0;
if (start_line > 0) {
// g.setColor(0x222222);
// g.drawRect(width-13, 2, 13, 13);
g.setColor(scroll_color);
g.fillTriangle(width - 13, 13 + line_height, width - 2,
13 + line_height, width - 8, 4 + line_height);
scroll_enable |= SCROLL_UP;
}
if (start_line + display_lines < shown_contacts.size()) {
// g.setColor(0x00222222);
// g.drawRect(width-13, height-15, 13, 13);
g.setColor(scroll_color);
g.fillTriangle(width - 13, height - 14, width - 2, height - 14,
width - 8, height - 4);
scroll_enable |= SCROLL_DOWN;
}
//setTitle("" + line_height + ", " + hpos + ", " + display_lines + ", " + shown_contacts.size() + ", " + test);
}
private void toggleMenus() {
// add or remove commands only if there is a selected user
Contact c = selected_contact;
removeCommand(cmd_querycmd);
removeCommand(cmd_listcmd);
removeCommand(cmd_tasks);
if (c == null) {
removeCommand(cmd_delc);
removeCommand(cmd_send);
// removeCommand(cmd_info);
removeCommand(cmd_chat);
} else {
addCommand(cmd_delc);
addCommand(cmd_send);
// addCommand(cmd_info);
addCommand(cmd_chat);
/* requested command list, has commands */
if (c.cmdlist != null) {
addCommand(cmd_listcmd);
} else {
addCommand(cmd_querycmd);
}
if (c.pending_tasks) {
addCommand(cmd_tasks);
}
}
}
private void paintHeader(Graphics g) {
int w = g.getClipWidth();
g.setColor(header_bg);
g.fillRect(0, 0, width, line_height);
g.setColor(header_fg);
XMPPClient client = XMPPClient.getInstance();
int bytes[] = XMPPClient.getTraffic();
// #ifndef TIMING
g.drawImage(img_traffic, 0, 0, Graphics.TOP | Graphics.LEFT);
if (sel_pattern.length() > 0) {
g.drawString("sel: " + sel_pattern, 17, 0, Graphics.TOP
| Graphics.LEFT);
} else {
g.drawString(bytes[0] + "/" + bytes[1], 17, 0, Graphics.TOP
| Graphics.LEFT);
}
Contact myContact = client.getMyContact();
Image pimg = client.getPresenceIcon(myContact,null, myContact
.getAvailability());
g.drawImage(pimg, w, 0, Graphics.TOP | Graphics.RIGHT);
// contacts with unread messages are always at the top
if (active_contacts.size() > 0
&& ((Contact) active_contacts.elementAt(0)).unread_msg()) {
g.drawImage(img_msg, w - 16, 0, Graphics.TOP | Graphics.RIGHT);
}
// #endif
// #ifdef TIMING
Runtime rt = Runtime.getRuntime().getRuntime();
g.drawString("" + paint_time + "/" + paint_calls + "-" + rt.freeMemory() + "/" + rt.totalMemory(), g.getClipWidth() / 2, 0, Graphics.TOP | Graphics.HCENTER);
// #endif
}
private void filter_contacts(boolean reuse) {
if (!reuse) {
shown_contacts = active_contacts;
}
Vector new_contacts = new Vector();
Enumeration en = shown_contacts.elements();
while (en.hasMoreElements()) {
Contact c = (Contact) en.nextElement();
if (c.getPrintableName().toLowerCase().indexOf(sel_pattern) == 0) {
new_contacts.addElement(c);
}
}
shown_contacts = new_contacts;
}
/**
* Handle key events
* @param kc the pressed key
*/
protected synchronized void keyPressed(int kc) {
// #ifdef SCREENSAVER
last_key_time = System.currentTimeMillis();
// #endif
// switch(kc) {
// // case Canvas.UP:
// case Canvas.KEY_NUM2: {
// if( (scroll_enable & SCROLL_UP) == 0 ) {
// // no scrolling
// return;
// }
// if(start_line>0) {
// start_line -= display_lines/2;
// if(start_line<0) start_line = 0;
// repaint();
// }
// return;
// }
// case Canvas.KEY_NUM5: {
// // XXX is this useful?
// selected_line = display_lines -1;
// // removeCommand(cmd_info);
// removeCommand(cmd_send);
// removeCommand(cmd_chat);
// return;
// }
// // case Canvas.DOWN:
// case Canvas.KEY_NUM8: {
// if( (scroll_enable & SCROLL_DOWN) == 0) {
// return;
// }
// int contact_size = shown_contacts.size();
// if(start_line + display_lines <= contact_size) {
// start_line += display_lines/2;
// if(start_line + display_lines > contact_size){
// start_line = contact_size - display_lines;
// }
// repaint();
// }
// return;
// }
// }
switch (kc) {
case Canvas.KEY_NUM0:
case Canvas.KEY_NUM1:
case Canvas.KEY_NUM2:
case Canvas.KEY_NUM3:
case Canvas.KEY_NUM4:
case Canvas.KEY_NUM5:
case Canvas.KEY_NUM6:
case Canvas.KEY_NUM7:
case Canvas.KEY_NUM8:
case Canvas.KEY_NUM9:
int key_num = kc - Canvas.KEY_NUM0;
long t = System.currentTimeMillis();
if ((key_num != sel_last_key) || t - sel_last_ts > 2000) {
// new key
sel_key_offset = 0;
sel_last_key = key_num;
sel_pattern = sel_pattern
+ itu_keys[key_num][sel_key_offset];
filter_contacts(true);
} else {
// shifted key
sel_key_offset += 1;
if (sel_key_offset >= itu_keys[key_num].length) sel_key_offset = 0;
sel_pattern = sel_pattern.substring(0,
sel_pattern.length() - 1)
+ itu_keys[key_num][sel_key_offset];
filter_contacts(false);
}
sel_last_ts = t;
if (shown_contacts.size() > 0) {
selected_line = new_selected_line = start_line = 0;
selected_contact = (Contact) shown_contacts.elementAt(0);
} else {
selected_line = new_selected_line = -1;
start_line = 0;
selected_contact = null;
}
repaint();
return;
case Canvas.KEY_STAR:
// rest the selection
sel_pattern = "";
shown_contacts = active_contacts;
for (int i = 0; i < shown_contacts.size(); i++) {
Contact c = (Contact) shown_contacts.elementAt(i);
if (c.equals(selected_contact)) {
selected_line = new_selected_line = start_line = i;
break;
}
}
repaint();
return;
case Canvas.KEY_POUND:
LampiroMidlet.disp.setCurrent(new ContactInfoScreen(
selected_contact));
return;
}
int ga = getGameAction(kc);
switch (ga) {
case Canvas.DOWN: {
int contact_size = shown_contacts.size();
if (contact_size == 0) {
break;
}
if (selected_line == -1) {
selected_line = new_selected_line = start_line;
selected_contact = (Contact) shown_contacts
.elementAt(start_line);
repaint();
break;
}
if (selected_line < contact_size - 1) {
new_selected_line++;
selected_contact = (Contact) shown_contacts
.elementAt(new_selected_line);
repaint_selection = true;
if (new_selected_line - start_line >= display_lines) {
start_line += display_lines / 2;
if (start_line + display_lines >= contact_size) {
start_line = contact_size - display_lines;
}
repaint_selection = false;
}
repaint();
}
break;
}
case Canvas.UP: {
int contact_size = shown_contacts.size();
if (contact_size == 0) {
break;
}
if (selected_line == -1) {
selected_line = new_selected_line = start_line;
selected_contact = (Contact) shown_contacts
.elementAt(start_line);
repaint();
break;
}
if (selected_line > 0) {
new_selected_line--;
selected_contact = (Contact) shown_contacts
.elementAt(new_selected_line);
repaint_selection = true;
if (new_selected_line < start_line) {
start_line -= display_lines / 2;
if (start_line < 0) {
start_line = 0;
}
repaint_selection = false; // also scrolled, reset repaint selection
}
repaint();
}
break;
}
case Canvas.RIGHT: {
Contact c = selected_contact;
if (c != null) {
chatWithSelected(true);
}
break;
}
case Canvas.FIRE: {
Contact c = selected_contact;
if (c != null) {
chatWithSelected(false);
}
break;
}
case Canvas.LEFT: {
if (sel_pattern.length() > 0) {
sel_pattern = sel_pattern.substring(0,
sel_pattern.length() - 1);
if (sel_pattern.length() > 0) {
filter_contacts(false);
} else {
shown_contacts = active_contacts;
}
} else {
// go to the top
start_line = selected_line = new_selected_line = 0;
selected_contact = (Contact) shown_contacts.elementAt(0);
}
repaint();
break;
}
default: {
break;
}
}
}
/**
* Handle a command
* @param c the selected command
* @param d the object on which the command has been ivoked
*/
public void commandAction(Command c, Displayable d) {
Display disp = LampiroMidlet.disp;
if (c == cmd_exit) {
LampiroMidlet.exit();
} else if (c == cmd_delc) {
DeleteContactAlert a = new DeleteContactAlert(selected_contact);
disp.setCurrent(a);
} else if (c == cmd_addc) {
AddContactScreen acs = new AddContactScreen();
disp.setCurrent(acs);
// } else if(c == cmd_info) {
// Contact user = getSelectedContact();
// AddContactScreen acs = new AddContactScreen(user);
// disp.setCurrent(acs);
} else if (c == cmd_send) {
Contact user = selected_contact;
MessageComposerScreen ms = new MessageComposerScreen(user, this,
MessageComposerScreen.MESSAGE);
disp.setCurrent(ms);
} else if (c == cmd_chat) {
chatWithSelected(false);
// } else if (c == cmd_reload) {
// Roster.getInstance().updateRoster();
} else if (c == cmd_state) {
StatusScreen ssc = new StatusScreen();
disp.setCurrent(ssc);
// #mdebug
} else if(c == cmd_debug) {
DebugScreen debugScreen = new DebugScreen();
debugScreen.setReturnScreen(this);
disp.setCurrent(debugScreen);
// #enddebug
} else if (c == cmd_querycmd) {
Contact usr = selected_contact;
usr.cmdlist = null;
Iq iq = new Iq(usr.getFullJid(), Iq.T_GET);
Element query = iq.addElement(
"http://jabber.org/protocol/disco#items", Iq.QUERY);
query.setAttribute("node", "http://jabber.org/protocol/commands");
AdHocCommandsHandler handler = new AdHocCommandsHandler();
XMPPClient.getInstance().sendIQ(iq, handler);
} else if (c == cmd_listcmd) {
CommandListScreen cmdscr = new CommandListScreen(selected_contact,
selected_contact.getFullJid());
disp.setCurrent(cmdscr);
} else if (c == cmd_about) {
AboutScreen as = new AboutScreen();
LampiroMidlet.disp.setCurrent(as);
} else if (c == cmd_options) {
OptionsScreen os = new OptionsScreen();
LampiroMidlet.disp.setCurrent(os);
} else if (c == cmd_tasks) {
Contact usr = selected_contact;
Task tasks[] = usr.getTasks();
if (tasks.length == 1) {
// #ifndef UI
tasks[0].display(disp, this);
// #endif
} else if (tasks.length > 1) {
TaskListScreen taskListScreen = new TaskListScreen(tasks);
disp.setCurrent(taskListScreen);
}
}
}
// private Contact getSelectedContact() {
// if(selected_line < 0 || selected_line >= shown_contacts.size()) {
// return null;
// }
// return (Contact) shown_contacts.elementAt(selected_line);
// }
private void chatWithSelected(boolean force_chat) {
Display disp = LampiroMidlet.disp;
Contact user = selected_contact;
ChatScreen ms = new ChatScreen(user);
if (user.unread_msg() || force_chat) {
disp.setCurrent(ms);
} else {
SimpleComposerScreen cs = new SimpleComposerScreen(ms, user);
LampiroMidlet.disp.setCurrent(cs);
}
}
private class AdHocCommandsHandler extends IQResultListener {
public void handleError(Element e) {
// simply ingnore -> XXX we could add an alert
}
public void handleResult(Element e) {
XMPPClient.getInstance().handleClientCommands(e, true);
}
}
/**
* Update the (global) status of a contact and repaint the roster accordingly to the new situation
* @param c
*/
public synchronized void updateContact(Contact c, int reason) {
// #ifdef TIMING
long t1 = System.currentTimeMillis();
// #endif
boolean removed = active_contacts.removeElement(c);
if (removed || c.isVisible()) {
// reinsert if it is visible
int i = 0;
if (c.isVisible()) {
while (i < active_contacts.size()
&& c.compareTo((Contact) active_contacts.elementAt(i)) < 0)
i++;
active_contacts.insertElementAt(c, i);
}
if (reason == Contact.CH_MESSAGE_NEW
|| reason == Contact.CH_TASK_NEW) {
// set the correct selection to the just updated task
shown_contacts = active_contacts;
sel_pattern = "";
start_line = new_selected_line = selected_line = i;
} else {
// preserve the current selection and keep it visible
if (selected_contact != null) {
int index = shown_contacts.indexOf(selected_contact);
if (index != -1) {
selected_line = new_selected_line = index;
} else {
selected_line = new_selected_line = 0;
}
// make sure the selection is visible
if (selected_line < start_line
|| start_line + display_lines <= selected_line) {
start_line = selected_line;
}
}
}
repaint();
}
// #ifdef TIMING
System.out.println("New sort time: " + (System.currentTimeMillis() - t1));
// #endif
}
public synchronized void removeContact(Contact c) {
active_contacts.removeElement(c);
// XXX we could repaint only if this contact is really displayed
repaint();
}
public synchronized void removeAllContacts() {
active_contacts.removeAllElements();
repaint();
}
public void authenticated() {
}
public void rosterXsubscription(Element e) {
}
public void playSmartTone() {
boolean shown = RosterScreen.getInstance().isShown();
boolean vibrate = (shown && play_flags[1])
|| ((!shown) && play_flags[0]);
boolean play = (shown && play_flags[3]) || ((!shown) && play_flags[2]);
if (vibrate) {
LampiroMidlet.disp.vibrate(200);
}
if (play) {
try {
Manager.playTone(40, 100, volume);
Manager.playTone(50, 100, volume);
Manager.playTone(30, 100, volume);
} catch (MediaException e1) {
}
}
}
public void askSubscription(Contact u) {
Display d = Display.getDisplay(LampiroMidlet._lampiro);
SubscriptionConfirmAlert scf = new SubscriptionConfirmAlert(u, d
.getCurrent());
d.setCurrent(scf);
}
public void handleCommand(Contact c, String chosenResource) {
CommandListScreen cmdscr = new CommandListScreen(c, chosenResource);
LampiroMidlet.disp.setCurrent(cmdscr);
}
public void connectionLost() {
removeAllContacts();
RegisterScreen rgs = RegisterScreen.getInstance();
LampiroMidlet.disp.setCurrent(rgs);
}
public void showAlert(AlertType type, String title, String text,
Object next_screen) {
Displayable cur = LampiroMidlet.disp.getCurrent();
if (cur.equals(alert)) {
alert.setString(alert.getString() + "\n" + text);
return;
}
Image img;
try {
if (AlertType.INFO.equals(type)) {
img = Image.createImage("/icons/warning.png");
} else if (AlertType.ERROR.equals(type)) {
img = Image.createImage("/icons/error.png");
} else {
img = Image.createImage("/icons/error.png");
}
} catch (IOException e) {
img = null;
}
alert = new Alert(title, text, img, type);
alert.setType(type);
alert.setTimeout(Alert.FOREVER);
LampiroMidlet.disp.setCurrent(alert, (Displayable) next_screen);
}
public void handleTask(Task task, boolean display) {
// Display a task only if no other task is currently displayed
Displayable cur = LampiroMidlet.disp.getCurrent();
Class klass = cur.getClass();
if (display && !DataFormScreen.class.equals(klass)
&& !DataResultScreen.class.equals(klass)) {
// #ifndef UI
task.display(LampiroMidlet.disp, cur);
// #endif
}
}
public Object handleDataForm(DataForm df, byte type, DataFormListener dfl,
int cmds) {
Displayable scr = null;
if (type == Task.CMD_INPUT) {
scr = new DataFormScreen(df, dfl);
} else if (type == Task.CMD_FINISHED) {
scr = new DataResultScreen(df, dfl);
}
if (cmds > 0) ((DataFormScreen) scr).setActions(cmds);
LampiroMidlet.disp.setCurrent(scr);
return scr;
}
public void commandExecuted(Object screenToclose) {
RosterScreen next_display = RosterScreen.getInstance();
LampiroMidlet.disp.setCurrent(next_display);
}
public void showCommand(Object screen) {
LampiroMidlet.disp.setCurrent((Displayable) screen);
}
public void rosterRetrieved() {
}
}