/* Copyright (c) 2011, SaferMobile/MobileActive - https://safermobile.org */ /* See LICENSE for licensing information */ package org.safermobile.clear.micro.apps; import java.io.IOException; import java.util.Date; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.rms.RecordStoreException; import net.rim.device.api.system.SIMCardException; import org.safermobile.clear.micro.L10nConstants; import org.safermobile.clear.micro.L10nResources; import org.safermobile.clear.micro.apps.controllers.ShoutController; import org.safermobile.clear.micro.apps.controllers.WipeController; import org.safermobile.clear.micro.data.PhoneInfo; import org.safermobile.clear.micro.sms.SMSManager; import org.safermobile.clear.micro.ui.LargeStringCanvas; import org.safermobile.micro.ui.DisplayManager; import org.safermobile.micro.utils.Logger; import org.safermobile.micro.utils.Preferences; import org.safermobile.micro.utils.StringTokenizer; // hasLocationCapability=false //release.build = false public class PanicActivateMIDlet extends MIDlet implements CommandListener, Runnable { private DisplayManager _manager; private Display _display; private TextBox _tbMain; private LargeStringCanvas _lsCanvas; private Command _cmdCancel; private Command _cmdExit; L10nResources l10n = L10nResources.getL10nResources("en-US"); /* * the thread which manages the panic sending */ private Thread _thread; /* * used to cancel the panic loop */ private boolean _keepPanicing = false; /* * stores the user data between the config app and this one */ private Preferences _prefs = null; /** * Creates Panic Activate app */ public PanicActivateMIDlet() { _display = Display.getDisplay(this); _manager = new DisplayManager(_display); _cmdCancel = new Command(l10n.getString(L10nConstants.keys.KEY_PANIC_BTN_CANCEL), Command.SCREEN,1); _cmdExit = new Command("Exit", Command.EXIT,1); _tbMain = new TextBox(l10n.getString(L10nConstants.keys.KEY_PANIC_TITLE_MAIN), "", 500, TextField.ANY); _tbMain.setCommandListener(this); _tbMain.addCommand(_cmdCancel); } private void startPanic () { try { _prefs = new Preferences (PanicConstants.PANIC_PREFS_DB); String recipients = _prefs.get(PanicConstants.PREFS_KEY_RECIPIENT); if (recipients == null) { showMessage("Please run the 'Panic! Config' app first to enter your alert information."); _tbMain.removeCommand(_cmdCancel); _tbMain.addCommand(_cmdExit); } else { _keepPanicing = true; //startSmsServer(); _thread = new Thread(this); _thread.start(); } } catch (RecordStoreException e) { Logger.error(PanicConstants.TAG, "error access preferences", e); showAlert(l10n.getString(L10nConstants.keys.KEY_PANIC_TITLE_ERROR),l10n.getString(L10nConstants.keys.KEY_PANIC_ERROR_PREFS),null); } } private void stopPanic () { _keepPanicing = false; _thread.interrupt(); } /* (non-Javadoc) * @see javax.microedition.midlet.MIDlet#startApp() */ protected void startApp() throws MIDletStateChangeException { _manager.next(_tbMain); Thread thread = new Thread () { public void run () { startPanic(); } }; thread.start(); } public void showAlert (String title, String msg, Displayable next) { Alert alert = new Alert(title); alert.setString(msg); _manager.next(alert, next); } /* (non-Javadoc) * @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command, javax.microedition.lcdui.Displayable) */ public void commandAction(Command command, Displayable displayable) { if (command == _cmdCancel) { stopPanic (); try { destroyApp(false); } catch (MIDletStateChangeException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.notifyDestroyed(); } else if (command == _cmdExit) { try { destroyApp(false); } catch (MIDletStateChangeException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.notifyDestroyed(); } } /* (non-Javadoc) * @see javax.microedition.midlet.MIDlet#destroyApp(boolean) */ protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { } /* (non-Javadoc) * @see javax.microedition.midlet.MIDlet#pauseApp() */ protected void pauseApp() {} private void doSecPause (int secs) { try { Thread.sleep(secs * 1000);} catch(Exception e){} } public void run () { ShoutController sControl = new ShoutController(); WipeController wControl = new WipeController(); Logger.debug(PanicConstants.TAG, "starting panic run(); loading prefs..."); String recipients = _prefs.get(PanicConstants.PREFS_KEY_RECIPIENT); String userName = _prefs.get(PanicConstants.PREFS_KEY_NAME); String userMessage = _prefs.get(PanicConstants.PREFS_KEY_MESSAGE); String userLocation = _prefs.get(PanicConstants.PREFS_KEY_LOCATION); String panicMsg = sControl.buildShoutMessage(userName, userMessage, userLocation); String panicData = ""; try { panicData = sControl.buildShoutData (userName); } catch (SIMCardException e1) { e1.printStackTrace(); } showMessage ("PANIC MESSAGE: " + panicMsg + "\n\npreparing to send..."); doSecPause (5); _lsCanvas = new LargeStringCanvas(""); _lsCanvas.setCommandListener(this); _lsCanvas.addCommand(_cmdCancel); _manager.next(_lsCanvas); for (int i = 5; i > 0; i--) { showMessage("Sending in " + i + "..."); doSecPause (1); } int resendTimeout = PanicConstants.DEFAULT_RESEND_TIMEOUT; //one minute while (_keepPanicing) { try { showMessage ("Sending messages..."); sControl.sendSMSShout (recipients, panicMsg, panicData); showMessage ("Panic Sent!"); doSecPause (2); } catch (Exception e) { _display.setCurrent(_tbMain); doSecPause (1); showMessage("Error Sending: " + e.toString()); doSecPause (10); } int secs = resendTimeout/1000; while (secs > 0) { showMessage("Panic! again in " + secs + "secs..."); doSecPause (1); secs--; } //update message with new mobile cid, lac info panicMsg = sControl.buildShoutMessage(userName, userMessage, userLocation); } _manager.next(_tbMain); } private void showMessage (String msg) { Logger.debug(PanicConstants.TAG, "msg: " + msg); if (_display.getCurrent() == _tbMain) { try { _tbMain.setString(msg); } catch (Exception e) { e.printStackTrace(); } } else if (_display.getCurrent() == _lsCanvas) { _lsCanvas.setLargeString(msg); } } }