]> www.average.org Git - WhereAmI.git/blobdiff - src/org/average/whereami/PhoneLog.java
make accessProtectedResource a method
[WhereAmI.git] / src / org / average / whereami / PhoneLog.java
index cf157a4b3cabb9ebfae70748d2a233cb6b262c26..6e13f2f4422248e5899c41f56259652d4fc2df57 100644 (file)
 package org.average.whereami;
 
-import com.google.api.client.extensions.android2.AndroidHttp;
-import com.google.api.client.googleapis.GoogleHeaders;
-import com.google.api.client.http.HttpRequest;
-import com.google.api.client.http.HttpResponse;
+import org.average.whereami.PersistentStore;
+import org.average.whereami.SayWhen;
+
+import java.io.IOException;
+
+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.util.DateTime;
+import com.google.api.services.calendar.Calendar;
+import com.google.api.services.calendar.CalendarRequest;
+import com.google.api.services.calendar.model.CalendarList;
+import com.google.api.services.calendar.model.CalendarListEntry;
+import com.google.api.services.calendar.model.Event;
+import com.google.api.services.calendar.model.Events;
+import com.google.common.collect.Lists;
 
-//import com.google.api.services.calendar.CalendarClient;
-//import com.google.api.services.calendar.CalendarRequestInitializer;
-//import com.google.api.services.calendar.CalendarUrl;
-//import com.google.api.services.calendar.model.CalendarEntry;
-//import com.google.api.services.calendar.model.CalendarFeed;
-//import com.google.common.collect.Lists;
-
+import android.content.Context;
+import android.content.res.Resources;
+import android.text.format.Time;
 import android.util.Log;
-import android.os.SystemClock;
 
 public final class PhoneLog extends Oracle {
 
        final String TAG = getClass().getName();
 
+       private Calendar calendar;
+
+       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");
+       }
+
        @Override
        public final String getResult() {
-               SystemClock.sleep(5000);
-               return "Response from PhoneLog.getResult";
+               calendar = Calendar.builder(httpTransport, jsonFactory)
+                       .setHttpRequestInitializer(accessProtectedResource())
+                       .setApplicationName("WhereAmI/1.0").build();
+               try {
+                       Log.v(TAG, "entering getResult");
+                       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("Call To ") ||
+                                    evSummary.startsWith("Call From ")) &&
+                                   evStart > latestStartTime) {
+                                               latestStartTime = evStart;
+                                               latestStopTime = evStop;
+                                               latestWasOutgoing = evSummary
+                                                       .startsWith("Call To ");
+                                               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;
        }
 }