X-Git-Url: http://www.average.org/gitweb/?p=WhereAmI.git;a=blobdiff_plain;f=src%2Forg%2Faverage%2Fwhereami%2FPhoneLog.java;h=00de54578c712e35b2674c8811022a38afcfc579;hp=8522e841b05df02c524bf0975c8dcecb16b83969;hb=3de0348c8df17da7708961f002c4a964321284be;hpb=97933c816c37fb8860eb4e980cde3967ea6bb3ad diff --git a/src/org/average/whereami/PhoneLog.java b/src/org/average/whereami/PhoneLog.java index 8522e84..00de545 100644 --- a/src/org/average/whereami/PhoneLog.java +++ b/src/org/average/whereami/PhoneLog.java @@ -1,17 +1,12 @@ package org.average.whereami; -import org.average.whereami.CredentialStore; +import org.average.whereami.PersistentStore; +import org.average.whereami.SayWhen; -//import java.lang.Long; +import java.io.IOException; -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.googleapis.json.GoogleJsonResponseException; 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; -import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.client.util.DateTime; import com.google.api.services.calendar.Calendar; import com.google.api.services.calendar.CalendarRequest; @@ -22,7 +17,8 @@ import com.google.api.services.calendar.model.Events; import com.google.common.collect.Lists; import android.content.Context; -import android.content.SharedPreferences; +import android.content.res.Resources; +import android.text.format.Time; import android.util.Log; public final class PhoneLog extends Oracle { @@ -31,49 +27,185 @@ public final class PhoneLog extends Oracle { private Calendar calendar; - public PhoneLog(final CredentialStore store) { - 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, - transport, jsonFactory, - ClientCredentials.CLIENT_ID, - ClientCredentials.CLIENT_SECRET, - token.refreshToken) - { - @Override - public void onAccessToken( - String accessToken) { - Log.v(TAG, "Update access token to \"" + accessToken + "\""); - store.updateAccessToken( - accessToken); - } - } - ; - Calendar.Builder cbldr = Calendar.builder(transport, - jsonFactory); - cbldr.setHttpRequestInitializer(accessProtectedResource); - cbldr.setApplicationName("WhereAmI/1.0"); - calendar = cbldr.build(); + private PersistentStore store; + private String calendar_name; + private String peer_name; + private String calendar_id; + private String nocalendar; + private String noevents; + private String last_call; + private String in_call; + private String out_call; + private String duration; + private String lessthan; + private String minutes1; + private String minutes2to4; + private String minutes5up; + private SayWhen sayWhen; + + public PhoneLog(final Resources res, final PersistentStore store) { + super(res, store); + this.store = store; + nocalendar = res.getString(R.string.nocalendar); + noevents = res.getString(R.string.noevents); + last_call = res.getString(R.string.last_call); + in_call = res.getString(R.string.in_call); + out_call = res.getString(R.string.out_call); + duration = res.getString(R.string.duration); + lessthan = res.getString(R.string.lessthan); + minutes1 = res.getString(R.string.minutes1); + minutes2to4 = res.getString(R.string.minutes2to4); + minutes5up = res.getString(R.string.minutes5up); + sayWhen = new SayWhen(res); + calendar_name = store.get("calendar_name"); + peer_name = store.get("peer_name"); + calendar_id = store.get("calendar_id"); + + calendar = Calendar.builder(httpTransport, jsonFactory) + .setHttpRequestInitializer(accessProtectedResource) + .setApplicationName("WhereAmI/1.0").build(); } @Override public final String getResult() { try { Log.v(TAG, "entering getResult"); - return TAG + " complete"; - } catch (Exception ex) { - Log.v(TAG, "exception in getResult: " + ex); - ex.printStackTrace(); - return ex.getMessage(); - } + if (calendar_id == null || calendar_id == "") { + calendar_id = scanCalendars(calendar_name); + } + if (calendar_id == null || calendar_id == "") { + return nocalendar + " \"" + + calendar_name + "\""; + } else { + store.put("calendar_id", calendar_id); + return scanEvents(calendar_id, peer_name); + } + } catch (GoogleJsonResponseException e) { + Log.e(TAG, "GoogleJsonResponseException: " + e); + if (e.getResponse().getStatusCode() == 401) { + return authErrorMessage; + } else { + return e.getMessage(); + } + } catch (HttpResponseException e) { + Log.e(TAG, "HttpResponseException: " + e); + return e.getMessage(); + } catch (IOException e) { + e.printStackTrace(); + return e.getMessage(); + } + } + + private String scanCalendars(String calendar_name) + throws java.io.IOException { + String res = ""; + Log.v(TAG, "Entering scanCalendars for \"" + + calendar_name + "\""); + + CalendarList cl = calendar.calendarList().list().execute(); + while (true) { + String pt = cl.getNextPageToken(); + Log.v(TAG, "got cl with pt=" + pt); + for (CalendarListEntry le : cl.getItems()) { + Log.v(TAG, "entry " + le.getId() + ":\"" + + le.getSummary() + "\""); + if (le.getSummary().equals(calendar_name)) { + res = le.getId(); + //break; // get all in the log + } + } + if (pt != null && pt != "") { + cl = calendar.calendarList().list() + .setPageToken(pt).execute(); + } else { + break; + } + } + + return res; + } + + private String scanEvents(String calendar_id, String peer_name) + throws java.io.IOException { + Log.v(TAG, "Entering scanEvents for \"" + + peer_name + "\" in \"" + calendar_id + "\""); + Integer count = 0; + Time ago = new Time(); + ago.set(System.currentTimeMillis() - 604800000L); + Long latestStartTime = 0L; + Long latestStopTime = 0L; + Boolean latestWasOutgoing = false; + Boolean wasFound = false; + + Events events = calendar.events().list(calendar_id) + .setTimeMin(ago.format3339(false)) + .setQ(peer_name) + .execute(); + while (true) { + String pt = events.getNextPageToken(); + Log.v(TAG, "got events with pt=" + pt); + for (Event event : events.getItems()) { + count++; + String evSummary = event.getSummary(); + Long evStart = event.getStart() + .getDateTime().getValue(); + Long evStop = event.getEnd() + .getDateTime().getValue(); + Log.v(TAG, "event " + evStart + + " - " + evStop + + " : \"" + evSummary + "\""); + if ((evSummary.startsWith("Called ") || + evSummary.startsWith("Call from ")) && + evStart > latestStartTime) { + latestStartTime = evStart; + latestStopTime = evStop; + latestWasOutgoing = evSummary + .startsWith("Called "); + wasFound = true; + } + } + if (count < 100 && pt != null && pt != "") { + events = calendar.events().list(calendar_id) + .setTimeMin(ago.format3339(false)) + .setQ(peer_name) + .setPageToken(pt).execute(); + } else { + break; + } + } + + if (wasFound) { + return makeMessage(latestStartTime, latestStopTime, + latestWasOutgoing); + } else { + return noevents; + } + } + + private String makeMessage(Long latestStartTime, Long latestStopTime, + Boolean latestWasOutgoing) { + Time stime = new Time(); + stime.set(latestStartTime); + Long dur = (latestStopTime - latestStartTime) / 60000L; + Log.v(TAG, "Chosen event: start " + stime + + " for " + dur + " min"); + String minutes; + String howlong = dur.toString(); + if (dur == 0) { + howlong = lessthan; + minutes = minutes2to4; + } else if ((dur / 10) == 1) { + minutes = minutes5up; + } else if ((dur % 10) == 1) { + minutes = minutes1; + } else if ((dur % 10) < 5) { + minutes = minutes2to4; + } else { + minutes = minutes5up; + } + return last_call + + " " + (latestWasOutgoing?out_call:in_call) + + " " + sayWhen.say(latestStartTime) + + " " + duration + " " + howlong + " " + minutes; } }