]> www.average.org Git - WhereAmI.git/blobdiff - src/org/average/whereami/LastLocation.java
compute distance works
[WhereAmI.git] / src / org / average / whereami / LastLocation.java
index bd25283111bb1c2e48bfd70401229045d45b0f25..b710e169f59bff77562076496d5dcdea5d0a3d20 100644 (file)
@@ -1,14 +1,13 @@
 package org.average.whereami;
 
 import org.average.whereami.CredentialStore;
-//import org.average.whereami.WhereAmIAccessResource;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.lang.Math;
 
+import com.google.api.client.extensions.android2.AndroidHttp;
 import com.google.api.client.auth.oauth2.draft10.AccessTokenResponse;
 import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAccessProtectedResource;
+import com.google.api.client.http.HttpResponseException;
 import com.google.api.client.http.HttpTransport;
 import com.google.api.client.http.javanet.NetHttpTransport;
 import com.google.api.client.json.JsonFactory;
@@ -19,6 +18,7 @@ import com.google.api.services.latitude.model.Location;
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.util.Log;
 
 public final class LastLocation extends Oracle {
@@ -27,8 +27,18 @@ public final class LastLocation extends Oracle {
 
        private Latitude latitude;
 
-       public LastLocation(final CredentialStore store) {
-               HttpTransport transport = new NetHttpTransport();
+       private String[] loc_names;
+       private String[] loc_lats;
+       private String[] loc_lons;
+       private String[] loc_dists;
+
+       public LastLocation(final Resources res, final CredentialStore store) {
+               loc_names = res.getStringArray(R.array.loc_names);
+               loc_lats = res.getStringArray(R.array.loc_lats);
+               loc_lons = res.getStringArray(R.array.loc_lons);
+               loc_dists = res.getStringArray(R.array.loc_dists);
+
+               HttpTransport transport = AndroidHttp.newCompatibleTransport();
                JsonFactory jsonFactory = new JacksonFactory();
                AccessTokenResponse token = store.read();
                Log.v(TAG, "tokens - access: \"" + token.accessToken +
@@ -68,8 +78,14 @@ public final class LastLocation extends Oracle {
                        Latitude.CurrentLocation.Get request =
                                latitude.currentLocation().get();
                        request.setGranularity("best");
-                       Location currentLocation = request.execute();
-                       return locationMessage(currentLocation);
+                       Location cloc = request.execute();
+                       Double lat = Double.parseDouble(
+                                       cloc.getLatitude().toString());
+                       Double lon = Double.parseDouble(
+                                       cloc.getLongitude().toString());
+                       Long tsm = Long.parseLong(
+                                       cloc.getTimestampMs().toString());
+                       return locationMessage(lat, lon, tsm);
                 } catch (Exception ex) {
                        Log.v(TAG, "exception in getResult: " + ex);
                        ex.printStackTrace();
@@ -77,12 +93,37 @@ public final class LastLocation extends Oracle {
                 }
        }
 
-       private String locationMessage(Location currentLocation) {
-               Log.v(TAG, "entering locationMessage: " +
-                       currentLocation);
-               // lat = currentLocation.getLatitude();
-               // lon = currentLocation.getLongitude();
-               // tsm = currentLocation.getTimestampMs();
-               return "Current location: " + currentLocation;
+       private String locationMessage(Double lat, Double lon, Long tsm) {
+               Log.v(TAG, "entering locationMessage(" + lat +
+                               "," + lon + "," + tsm + ")");
+               String locmsg = "<UNSET>";
+               for (int i = 0; i < loc_names.length; i++) {
+                       Double dist = haversine(lat, lon,
+                                       Double.parseDouble(loc_lats[i]),
+                                       Double.parseDouble(loc_lons[i]));
+                       Log.v(TAG, "Dist from " + loc_names[i] +
+                               " is " + dist);
+                       if ((loc_dists[i] == "0") ||
+                           (dist < Double.parseDouble(loc_dists[i]))) {
+                               locmsg = loc_names[i];
+                               break;
+                       }
+               }
+               return locmsg;
+       }
+
+       private Double toRad(Double deg) {
+               return deg * 3.14159265 / 180;
+       }
+
+       private Double haversine(Double lat1, Double lon1,
+                               Double lat2, Double lon2) {
+               Double dlat = toRad(lat2 - lat1);
+               Double dlon = toRad(lon2 - lon1);
+               Double a = Math.sin(dlat / 2) * Math.sin(dlat / 2) +
+                       Math.sin(dlon / 2) * Math.sin(dlon / 2) *
+                       Math.cos(toRad(lat1)) * Math.cos(toRad(lat2));
+               Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
+               return 6371 * c;
        }
 }