package org.safermobile.clear.micro.apps.controllers; import java.util.Enumeration; import javax.microedition.io.file.FileSystemRegistry; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import org.safermobile.clear.micro.apps.ITCConstants; import org.safermobile.clear.micro.apps.LocaleManager; 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.clear.micro.L10nResources; import org.safermobile.clear.micro.L10nConstants; public class PanicController implements Runnable { public final static int PANIC_COUNTDOWN_TIME = 3; /* * stores the user data between the config app and this one */ private Preferences _prefs; private CommandListener _cmdListener; private WipeListener _wipeListener; private DisplayManager _dManager; private LargeStringCanvas _lsCanvas; private Command _cmdCancel; /* * used to cancel the panic loop */ private boolean _keepPanicing = false; private static L10nResources l10n = LocaleManager.getResources(); public PanicController (Preferences prefs, WipeListener wipeListener, CommandListener cmdListener, DisplayManager dManager, Command cmdCancel) { _prefs = prefs; _wipeListener = wipeListener; _cmdListener = cmdListener; _dManager = dManager; _cmdCancel = cmdCancel; } public void stopPanic () { _keepPanicing = false; } public void run () { _keepPanicing = true; try { _lsCanvas = new LargeStringCanvas(""); _lsCanvas.setCommandListener(_cmdListener); _lsCanvas.addCommand(_cmdCancel); _dManager.next(_lsCanvas); ShoutController sControl = new ShoutController(); Logger.debug(ITCConstants.TAG, "starting panic run(); loading prefs..."); String recipients = _prefs.get(ITCConstants.PREFS_KEY_RECIPIENT); String userName = _prefs.get(ITCConstants.PREFS_KEY_NAME); String userMessage = _prefs.get(ITCConstants.PREFS_KEY_MESSAGE); String userLocation = _prefs.get(ITCConstants.PREFS_KEY_LOCATION); String panicMsg = sControl.buildShoutMessage(userName, userMessage, userLocation); String panicData = sControl.buildDataMessage (userName); _lsCanvas.setLargeString(l10n.getString(L10nConstants.keys.KEY_PANIC_START)); doSecPause (PANIC_COUNTDOWN_TIME); if (!_keepPanicing) return; for (int i = PANIC_COUNTDOWN_TIME; i > 0; i--) { _lsCanvas.setLargeString(l10n.getString(L10nConstants.keys.KEY_SENDING) + ' ' + i + l10n.getString(L10nConstants.keys.KEY_ELLIPSE)); doSecPause (1); } int resendTimeout = ITCConstants.DEFAULT_RESEND_TIMEOUT; //one minute boolean wipeComplete = false; while (_keepPanicing) { try { _lsCanvas.setLargeString (l10n.getString(L10nConstants.keys.KEY_SENDING_MESSAGES)); sControl.sendSMSShout (recipients, panicMsg, panicData); _lsCanvas.setLargeString (l10n.getString(L10nConstants.keys.KEY_MESSAGE_SENT)); doSecPause (2); } catch (Exception e) { doSecPause (1); _lsCanvas.setLargeString(l10n.getString(L10nConstants.keys.KEY_ERROR_SENDING) + e.toString()); doSecPause (10); } //now that first shout has been sent, time to wipe if (!wipeComplete) { String prefBool = _prefs.get(ITCConstants.PREFS_KEY_WIPE_CONTACTS); boolean wipeContacts = (prefBool != null && prefBool.equals("true")); prefBool = _prefs.get(ITCConstants.PREFS_KEY_WIPE_EVENTS); boolean wipeEvents = (prefBool != null && prefBool.equals("true")); prefBool = _prefs.get(ITCConstants.PREFS_KEY_WIPE_PHOTOS); boolean wipePhotos = (prefBool != null && prefBool.equals("true")); prefBool = _prefs.get(ITCConstants.PREFS_KEY_WIPE_ALL_FILES); boolean wipeAllFiles = (prefBool != null && prefBool.equals("true")); WipeController.doWipe (wipeContacts, wipeEvents, wipePhotos, wipeAllFiles, _lsCanvas, _wipeListener); wipeComplete = true; } int secs = resendTimeout/1000; while (secs > 0) { _lsCanvas.setLargeString(l10n.getString(L10nConstants.keys.KEY_PANIC_AGAIN) + secs + l10n.getString(L10nConstants.keys.KEY_SECONDS)); doSecPause (1); secs--; } //update message with new mobile cid, lac info panicMsg = sControl.buildShoutMessage(userName, userMessage, userLocation); } } catch (Exception ie) { //do nothing Logger.error("PanicController", "error in run thread", ie); } } private static void doSecPause (int secs) { try { Thread.sleep(secs * 1000);} catch(Exception e){} } }