//
// GpsHelper.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.location.*;
import java.util.Calendar;
import java.util.Date;
public class GpsHelper implements LocationListener {
private LocationProvider locationProvider = null;
private Coordinates oldCoordinates = null, currentCoordinates = null;
private float distance = 0;
private int azimuth = 0;
private String uploadWebsite;
private GpsTracker midlet;
private int interval;
protected long sessionID;
public GpsHelper(GpsTracker Midlet, int Interval, String UploadWebsite){
sessionID = System.currentTimeMillis();
this.midlet = Midlet;
this.interval = Interval;
this.uploadWebsite = UploadWebsite;
}
// getting the gps location is based on an interval in seconds. for instance,
// the location is gotten once a minute, sent to the website to be stored in
// the DB (and then viewed on Google map) and used to retrieve a map tile (image)
// to be diplayed on the phone
public void startGPS() {
if (locationProvider == null) {
createLocationProvider();
Thread locationThread = new Thread() {
public void run(){
createLocationListener();
}
};
locationThread.start();
}
}
// this allows us to change how often the gps location is gotten
public void changeInterval(int Interval) {
if (locationProvider != null) {
locationProvider.setLocationListener(this, Interval, -1, -1);
}
}
private void createLocationProvider() {
Criteria cr = new Criteria();
try {
locationProvider = LocationProvider.getInstance(cr);
} catch (Exception e) {
midlet.log("GPS.createLocationProvider: " + e);
}
}
private void createLocationListener(){
// 2cd value is interval in seconds
try {
locationProvider.setLocationListener(this, interval, -1, -1);
} catch (Exception e) {
midlet.log("GPS.createLocationListener: " + e);
}
}
public void locationUpdated(LocationProvider provider, final Location location) {
// get new location from locationProvider
try {
Thread getLocationThread = new Thread(){
public void run(){
sendLocationToWebsite(location);
}
};
getLocationThread.start();
} catch (Exception e) {
midlet.log("GPS.locationUpdated: " + e);
}
}
public void providerStateChanged(LocationProvider provider, int newState) {}
private void sendLocationToWebsite(Location location){
float speed = 0;
try {
QualifiedCoordinates qualifiedCoordinates = location.getQualifiedCoordinates();
qualifiedCoordinates.getLatitude();
if (oldCoordinates == null){
oldCoordinates = new Coordinates(qualifiedCoordinates.getLatitude(),
qualifiedCoordinates.getLongitude(),
qualifiedCoordinates.getAltitude());
} else {
if (!Float.isNaN( qualifiedCoordinates.distance(oldCoordinates))) {
distance += qualifiedCoordinates.distance(oldCoordinates);
}
currentCoordinates = new Coordinates(qualifiedCoordinates.getLatitude(),
qualifiedCoordinates.getLongitude(),
qualifiedCoordinates.getAltitude());
azimuth = (int)oldCoordinates.azimuthTo(currentCoordinates);
oldCoordinates.setAltitude(qualifiedCoordinates.getAltitude());
oldCoordinates.setLatitude(qualifiedCoordinates.getLatitude());
oldCoordinates.setLongitude(qualifiedCoordinates.getLongitude());
}
if (qualifiedCoordinates != null){
// we are trying to get mySql datetime in the following format with a space (%20)
// 2008-04-17%2012:07:02
Calendar currentTime = Calendar.getInstance();
StringBuffer mySqlDateTimeString = new StringBuffer();
mySqlDateTimeString.append(currentTime.get(Calendar.YEAR)).append("-");
mySqlDateTimeString.append(currentTime.get(Calendar.DATE)).append("-");
mySqlDateTimeString.append(currentTime.get(Calendar.MONTH)+1).append("%20");
mySqlDateTimeString.append(currentTime.get(Calendar.HOUR_OF_DAY)).append(':');
mySqlDateTimeString.append(currentTime.get(Calendar.MINUTE)).append(':');
mySqlDateTimeString.append(currentTime.get(Calendar.SECOND));
if (!Float.isNaN(location.getSpeed())) {
speed = location.getSpeed();
}
String gpsData = "latitude=" + String.valueOf(qualifiedCoordinates.getLatitude())
+ "&longitude=" + String.valueOf(qualifiedCoordinates.getLongitude())
+ "&speed=" + String.valueOf((int)(speed/1609*3600)) // in miles per hour
+ "&direction=" + String.valueOf(azimuth)
+ "&date=" + mySqlDateTimeString
+ "&locationmethod=" + location.getLocationMethod()
+ "&distance=" + String.valueOf((int)(distance/1609)) // in miles
+ "&phonenumber=" + midlet.phoneNumber
+ "&sessionid=" + String.valueOf(sessionID) // System.currentTimeMillis();
+ "&accuracy=" + String.valueOf((int)(qualifiedCoordinates.getHorizontalAccuracy())) // in meters
+ "&locationisvalid=yes"
+ "&extrainfo=" + location.getExtraInfo("text/plain")
+ "&eventtype=javaMe";
// with our query string built, we create a networker object to send the
// gps data to our website and update the DB
NetWorker netWorker = new NetWorker(midlet, uploadWebsite);
netWorker.postGpsData(gpsData);
}
} catch (Exception e) {
midlet.log("GPS.getLocation: " + e);
}
}
}