X-Git-Url: http://www.average.org/gitweb/?p=WhereAmI.git;a=blobdiff_plain;f=src%2Forg%2Faverage%2Fwhereami%2FLastLocation.java;h=b710e169f59bff77562076496d5dcdea5d0a3d20;hp=52b909894b0eebae750dd3e86a314160b313b10c;hb=b6c7f6d70cd87f9d3b8b7f6eaff05ea2d9efe816;hpb=4075fd74c86729ed0d774380f2c491a8e2a95c32 diff --git a/src/org/average/whereami/LastLocation.java b/src/org/average/whereami/LastLocation.java index 52b9098..b710e16 100644 --- a/src/org/average/whereami/LastLocation.java +++ b/src/org/average/whereami/LastLocation.java @@ -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,10 +27,26 @@ public final class LastLocation extends Oracle { private Latitude latitude; - public LastLocation(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 + + "\", refresh: \"" + token.refreshToken + + "\", client_id: \"" + ClientCredentials.CLIENT_ID + + "\", client_secret: \"" + + ClientCredentials.CLIENT_SECRET + + "\""); GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource( token.accessToken, @@ -38,12 +54,15 @@ public final class LastLocation extends Oracle { ClientCredentials.CLIENT_ID, ClientCredentials.CLIENT_SECRET, token.refreshToken) - //{ - //@Override - //public void onAccessToken(String accessToken) { - // store.updateAccessToken(accessToken); - // } - //} + { + @Override + public void onAccessToken( + String accessToken) { + Log.v(TAG, "Update access token to \"" + accessToken + "\""); + store.updateAccessToken( + accessToken); + } + } ; Latitude.Builder lbldr = Latitude.builder(transport, jsonFactory); @@ -55,20 +74,56 @@ public final class LastLocation extends Oracle { @Override public final String getResult() { try { + Log.v(TAG, "entering getResult"); 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(); return ex.getMessage(); } } - private String locationMessage(Location 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 = ""; + 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; } }