/******************************************************************************* Jimm - Mobile Messaging - J2ME ICQ clone Copyright (C) 2003-05 Jimm Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ******************************************************************************** File: src/jimm/Jimm.java Version: ###VERSION### Date: ###DATE### Author(s): Manuel Linsmayer, Andreas Rossbacher, Vladimir Kryukov *******************************************************************************/ package jimm; import java.io.*; import javax.microedition.io.*; import jimmui.SplashCanvas; import jimmui.updater.ChatUpdater; import jimm.cl.*; import jimm.comm.*; import jimm.modules.*; import jimm.search.Search; import jimmui.view.*; import jimmui.view.base.*; import jimm.util.JLocale; import protocol.Protocol; import protocol.ui.MessageEditor; import protocol.ui.StatusView; public class Jimm { private boolean locked = false; private long lastLockTime = 0; private boolean paused = true; private Display display; public JimmModel jimmModel; public SplashCanvas splash; private ContactList cl; private MessageEditor editor; private StatusView statusView; public UIUpdater uiUpdater; private ChatUpdater chatUpdater = new ChatUpdater(); public PhoneInfo phone = new PhoneInfo(); public final String VERSION = "###VERSION###"; public String lastDate; // Application main object private static final Jimm instance = new Jimm(); /****************************************************************************/ private void platformRequestUrl(String url) throws ConnectionNotFoundException { // #sijapp cond.if protocols_JABBER is "true" # if (-1 == url.indexOf(':')) { url = "xmpp:" + url; } if (url.startsWith("xmpp:")) { Search search = cl.getManager().getCurrentProtocol().getSearchForm(); search.show(Util.getUrlWithoutProtocol(url)); return; } // #sijapp cond.end # if (url.equals("jimm:update")) { url = "http://jimm.net.ru/go.xhtml?act=update&lang=" + JLocale.getCurrUiLanguage() + "&protocols=###PROTOCOLS###&cdata=" + Tokenizer.loadResource("build.dat"); } JimmMidlet.getMidlet().platformRequest(url.trim()); } public void openUrl(String url, boolean exit) { try { platformRequestUrl(url); // #sijapp cond.if modules_ANDROID isnot "true" # if (exit) quit(); // #sijapp cond.end # } catch (Exception e) { /* Do nothing */ } } private void restore(Object screen) { if (null == screen) { return; } // #sijapp cond.if modules_ABSENCE is "true" # AutoAbsence.instance.online(); // #sijapp cond.end # wakeUp(); // #sijapp cond.if target is "MIDP2"# if (phone.isS60v5()) { display.hide(); } if (phone.isPhone(PhoneInfo.PHONE_SE)) { display.hideIfNeed(); } // #sijapp cond.end# display.restore(screen); } public Display getDisplay() { return display; } public void restoreJimm() { if (!paused) { return; } // #sijapp cond.if modules_ANDROID is "true" # restoreUI(); // #sijapp cond.end # wakeUp(); restore(display.getCurrentDisplay()); // #sijapp cond.if modules_ANDROID is "true" # cl.getUpdater().updateModel(); // #sijapp cond.end # } // Start Jimm public void startJimm() { if (!paused) { return; } display = new Display(); display.updateDisplay(); locked = false; wakeUp(); initDaemonPhase1(); initUiPhase2(); try { splash = new SplashCanvas(); // #sijapp cond.if modules_ANDROID isnot "true" # splash.setMessage(JLocale.getString("loading")); splash.show(); // #sijapp cond.end # initDaemonPhase3(); initUiPhase4(); // phase 5 cl.startUp(); // phase 6 if (0 < Options.getAccountCount()) { autoConnect(); } uiUpdater.refreshClock(); } catch (Exception e) { // #sijapp cond.if modules_DEBUGLOG is "true"# DebugLog.panic("init", e); DebugLog.activate(); // #sijapp cond.end# } } public void hideApp() { Object currentScreen = display.getCurrentDisplay(); if (currentScreen instanceof InputTextBox) { return; } paused = true; //currentScreen = null; locked = false; // #sijapp cond.if modules_ABSENCE is "true" # AutoAbsence.instance.away(); // #sijapp cond.end # } public void quit() { boolean wait; try { wait = jimmModel.disconnect(); } catch (Exception e) { return; } try { Thread.sleep(100); } catch (InterruptedException e1) { /* Do nothing */ } jimmModel.safeSave(); if (wait) { try { Thread.sleep(500); } catch (InterruptedException e1) { /* Do nothing */ } } // #sijapp cond.if modules_ANDROID is "true" # ru.net.jimm.JimmActivity.getInstance().service.quit(); // #sijapp cond.end # try { JimmMidlet.getMidlet().destroyApp(true); } catch (Exception e) { /* Do nothing */ } } /** * Destroy Jimm */ public void destroyJimm() { chatUpdater.saveUnreadMessages(); // #sijapp cond.if modules_TRAFFIC is "true" # // Save traffic Traffic.getInstance().safeSave(); // #sijapp cond.end# display.hide(); } public boolean isPaused() { return paused || display.isPaused(); } public boolean isLocked() { return locked; } public void lockJimm() { final long now = Jimm.getCurrentGmtTime(); final int WAITING_INTERVAL = 3; // sec if (lastLockTime + WAITING_INTERVAL < now) { locked = true; splash.lockJimm(); // #sijapp cond.if modules_ABSENCE is "true" # AutoAbsence.instance.away(); // #sijapp cond.end # } } public void unlockJimm() { lastLockTime = Jimm.getCurrentGmtTime(); locked = false; cl.activate(); uiUpdater.refreshClock(); // #sijapp cond.if modules_ABSENCE is "true" # AutoAbsence.instance.online(); // #sijapp cond.end # } public void maximize() { restore(display.getCurrentDisplay()); wakeUp(); } public void maximize(CanvasEx screen) { restore(screen); wakeUp(); } // Set the minimize state of midlet public void minimize() { hideApp(); display.hide(); } public void wakeUp() { paused = false; } public static java.io.InputStream getResourceAsStream(String name) { InputStream in; // #sijapp cond.if modules_ANDROID is "true" # in = jimm.modules.fs.FileSystem.openJimmFile(name); if (null == in) { try { in = ru.net.jimm.JimmActivity.getInstance().getAssets().open(name.substring(1)); } catch (Exception ignored) { } } // #sijapp cond.else # //# in = name.getClass().getResourceAsStream(name); // #sijapp cond.end # return in; } public static Jimm getJimm() { return instance; } public static long getCurrentGmtTime() { return System.currentTimeMillis() / 1000 + Options.getInt(Options.OPTION_LOCAL_OFFSET) * 3600; } public static void gc() { System.gc(); try { Thread.sleep(50); } catch (Exception ignored) { } } public ContactList getCL() { return cl; } public MessageEditor getMessageEditor() { return editor; } public StatusView getStatusView() { return statusView; } public void autoConnect() { // #sijapp cond.if modules_ANDROID is "true" # if (!ru.net.jimm.JimmActivity.getInstance().isNetworkAvailable()) { return; } // #sijapp cond.end# int count = Jimm.getJimm().jimmModel.protocols.size(); for (int i = 0; i < count; ++i) { Protocol p = (Protocol) Jimm.getJimm().jimmModel.protocols.elementAt(i); if (!"".equals(p.getPassword()) && p.getProfile().isConnected()) { p.connect(); } } } private void initDaemonPhase1() { // phase #1: daemon // #sijapp cond.if modules_ANDROID is "true" # ru.net.jimm.config.HomeDirectory.init(); // #sijapp cond.end# JLocale.loadLanguageList(); Options.loadOptions(); // #sijapp cond.if modules_ANDROID is "true" # new ru.net.jimm.config.Options().load(); // #sijapp cond.end# } private void initUiPhase2() { // phase #2; ui Scheme.load(); JLocale.setCurrUiLanguage(Options.getString(Options.OPTION_UI_LANGUAGE)); Scheme.setColorScheme(Options.getInt(Options.OPTION_COLOR_SCHEME)); GraphicsEx.setFontScheme(Options.getInt(Options.OPTION_FONT_SCHEME)); CanvasEx.updateUI(); } private void initDaemonPhase3() { // phase #3: daemon Options.loadAccounts(); jimmModel = new JimmModel(); jimmModel.updateAccounts(); } private void initUiPhase4() { splash.setProgress(10); cl = new ContactList(); statusView = new StatusView(); // back loading (traffic, sounds and light) // #sijapp cond.if modules_TRAFFIC is "true" # // Create traffic Object (and update progress indicator) Traffic.getInstance().load(); // #sijapp cond.end# // #sijapp cond.if modules_SOUND is "true"# Notify.getSound().initSounds(); // #sijapp cond.end# // #sijapp cond.if modules_LIGHT is "true" # CustomLight.switchOn(Options.getInt(Options.OPTION_LIGHT_THEME)); // #sijapp cond.end# Jimm.gc(); // init message editor // #sijapp cond.if modules_SMILES is "true" # //splash.setProgress(10); Emotions.instance.load(); // #sijapp cond.end# //splash.setProgress(25); StringUtils.load(); //splash.setProgress(35); Templates.getInstance().load(); editor = new MessageEditor(); Jimm.gc(); // #sijapp cond.if modules_DEBUGLOG is "true"# DebugLog.startTests(); // #sijapp cond.end# // init contact list splash.setProgress(20); splash.setProgress(50); cl.initUI(); splash.setProgress(60); cl.updateCl(); if (null != uiUpdater) uiUpdater.stop(); uiUpdater = new UIUpdater(); uiUpdater.startUIUpdater(); // #sijapp cond.if modules_ANDROID is "true" # ru.net.jimm.JimmActivity.getInstance().service.started(); // #sijapp cond.end # } public void releaseUI() { uiUpdater.stop(); uiUpdater = null; paused = true; } private void restoreUI() { splash = new SplashCanvas(); display.updateDisplay(); if (null != uiUpdater) uiUpdater.stop(); initUiPhase2(); uiUpdater = new UIUpdater(); uiUpdater.startUIUpdater(); uiUpdater.refreshClock(); } public ChatUpdater getChatUpdater() { return chatUpdater; } }