Newer
Older
GpsTracker / phoneClients / javaMe / build / JavaMEPhone1 / preprocessed / com / websmithing / gpstracker / GpsTracker.java
//
//  GpsTracker.java
//  GpsTracker
//
//  Created by Nick Fox on 11/7/13.
//  Copyright (c) 2013 Nick Fox. All rights reserved.
//

package com.websmithing.gpstracker;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.Calendar;

public class GpsTracker extends MIDlet implements CommandListener {
    private Display display;
    private Form form;
    private Form settingsScreen;
    private Command exitCmd;
    private Command saveCmd;
    private Command zoomCmd;
    private Command settingsCmd;
    private Command backCmd;
    private TextField phoneNumberTextField;
    private TextField uploadWebsiteTextField;
    private ChoiceGroup updateIntervalCG;
    private String updateInterval;
    private int[] iTimes = {60, 300, 900};
    
    private RmsHelper rms;
    private GpsHelper gps;
    
    private String uploadWebsite;    
    private String defaultUploadWebsite = "https://www.websmithing.com/gpstracker/updatelocation.php";

    protected String phoneNumber;
    protected String zoomLevel;
    protected int height, width;   
    protected Calendar currentTime;    
    protected long sessionID;

    public GpsTracker(){
        form = new Form("GpsTracker");
        display = Display.getDisplay(this);
        exitCmd = new Command("Exit", Command.EXIT, 1); 
        settingsCmd = new Command("Settings", Command.SCREEN, 2);
        
        form.addCommand(exitCmd);
        form.addCommand(settingsCmd);
        form.setCommandListener(this);        
        
        display.setCurrent(form);
        currentTime = Calendar.getInstance();
        sessionID = System.currentTimeMillis();
        height = form.getHeight();
        width = form.getWidth();
        
        // RMS is the phone's built in storage, kind of like a database, but
        // it only stores name-value pairs (like an associative array or hashtable). 
        // eveything is stored as a string.
        getSettingsFromRMS();
        
        // the phone number field is the only empty field when the application is 
        // first loaded. it does not have to be a phone number, it can be any string,
        // but for uniqueness, it's best to use a phone number. this only has to be 
        // done once.
        if (hasPhoneNumber()) {
            startGPS();
            displayInterval();
        }
    } 
   
    public void startApp() {
        if ( form != null ) { 
            display.setCurrent(form); 
        } 
    }
 
    // let the user know how often map will be updated
    private void displayInterval() {
        int tempTime = iTimes[Integer.parseInt(updateInterval)]/60;
    
        display.setCurrent(form);
        form.deleteAll();
         
        if (tempTime == 1) {
            log("Getting map once a minute...");
        }
        else {
           log("Getting map every " + String.valueOf(tempTime) + " minutes..."); 
        }       
    }    

    private void loadSettingsScreen() {
        settingsScreen = new Form("Settings");

        phoneNumberTextField = new TextField("Phone number or user name", phoneNumber, 20, TextField.ANY);
        uploadWebsiteTextField = new TextField("Upload website", uploadWebsite, 100, TextField.ANY);
        settingsScreen.append(phoneNumberTextField);
        settingsScreen.append(uploadWebsiteTextField);

        String[] times = { "1 minute", "5 minutes", "15 minutes"};
        updateIntervalCG = new ChoiceGroup("Update map how often?", ChoiceGroup.EXCLUSIVE, times, null);
        updateIntervalCG.setSelectedIndex(Integer.parseInt(updateInterval), true);
        settingsScreen.append(updateIntervalCG);        

        saveCmd = new Command("Save", Command.SCREEN, 1);
        settingsScreen.addCommand(saveCmd);

        settingsScreen.setCommandListener(this);
        display.setCurrent(settingsScreen);
    }    
    
    // get the settings from the phone's storage and load 4 global variables
    public void getSettingsFromRMS() {
        try {
            rms = new RmsHelper(this, "GPSTracker");

            phoneNumber = rms.get("phoneNumber");
            uploadWebsite = rms.get("uploadWebsite");
            zoomLevel = rms.get("zoomLevel");
            updateInterval = rms.get("updateInterval");
        }
        catch (Exception e) {
            log("GPSTracker.getSettingsFromRMS: " + e);
        }
        
        if ((uploadWebsite == null) || (uploadWebsite.trim().length() == 0)) {
            uploadWebsite = defaultUploadWebsite;
        }        

        if ((zoomLevel == null) || (zoomLevel.trim().length() == 0)) {
            zoomLevel = "12";
        }
        if ((updateInterval == null) || (updateInterval.trim().length() == 0)) {
            updateInterval = "1";
        }        
    }    

    private boolean hasPhoneNumber() {
        if ((phoneNumber == null) || (phoneNumber.trim().length() == 0)) {
           log("Phone number required. Please go to settings.");
           return false;
        }
        else {
           return true;
      }
    }
  
    // gps is started with the update interval. the interval is the time in between
    // map updates
    private void startGPS() {
        if (gps == null) {
            gps = new GpsHelper(this, iTimes[Integer.parseInt(updateInterval)], uploadWebsite);
            gps.startGPS();
        }
    }
    
    // this is called when the user changes the interval in the settings screen
    private void changeInterval() {
        if (gps == null) {
            startGPS(); 
        }
        else {
            gps.changeInterval(iTimes[Integer.parseInt(updateInterval)]);
        }
    }
    
    // save settings back to phone memory
    private void saveSettingsToRMS() {
        try { 
            phoneNumber = phoneNumberTextField.getString();
            uploadWebsite = uploadWebsiteTextField.getString();
            updateInterval = String.valueOf(updateIntervalCG.getSelectedIndex());
            
            rms.put("phoneNumber", phoneNumber);
            rms.put("uploadWebsite", uploadWebsite);
            rms.put("updateInterval", updateInterval);

            rms.save(); 
        }
        catch (Exception e) {
            log("GPSTracker.saveSettings: " + e);
        } 
        display.setCurrent(form);
    }
    
    public void log(String text) {
        StringItem si = new StringItem(null, text);
        si.setLayout(Item.LAYOUT_NEWLINE_AFTER);
        form.append(si);
    }

    public void commandAction(Command cmd, Displayable screen) {		
        if (cmd == exitCmd) {
            shutDownApp();
        }
        else if (cmd == saveCmd) {
            saveSettingsToRMS();

            if (hasPhoneNumber()) {
                changeInterval();
                displayInterval();
            }
        }
        else if (cmd == settingsCmd) {
            loadSettingsScreen(); 
        }      
        else if (cmd == backCmd) {
            displayInterval();
        }
    }
     
    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

    protected void shutDownApp() {
        destroyApp(true);
        notifyDestroyed();   
    }
}