1 package org.average.whereami;
3 import org.average.whereami.PersistentStore;
4 import org.average.whereami.SayWhen;
6 import java.io.IOException;
8 import com.google.api.client.googleapis.json.GoogleJsonResponseException;
9 import com.google.api.client.http.HttpResponseException;
10 import com.google.api.client.util.DateTime;
11 import com.google.api.services.calendar.Calendar;
12 import com.google.api.services.calendar.CalendarRequest;
13 import com.google.api.services.calendar.model.CalendarList;
14 import com.google.api.services.calendar.model.CalendarListEntry;
15 import com.google.api.services.calendar.model.Event;
16 import com.google.api.services.calendar.model.Events;
17 import com.google.common.collect.Lists;
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.text.format.Time;
22 import android.util.Log;
24 public final class PhoneLog extends Oracle {
26 final String TAG = getClass().getName();
28 private PersistentStore store;
29 private String calendar_name;
30 private String peer_name;
31 private String calendar_id;
32 private String nocalendar;
33 private String noevents;
34 private String last_call;
35 private String in_call;
36 private String out_call;
37 private String duration;
38 private String lessthan;
39 private String minutes1;
40 private String minutes2to4;
41 private String minutes5up;
42 private SayWhen sayWhen;
43 private Calendar calendar;
45 public PhoneLog(final Resources res, final PersistentStore store) {
48 nocalendar = res.getString(R.string.nocalendar);
49 noevents = res.getString(R.string.noevents);
50 last_call = res.getString(R.string.last_call);
51 in_call = res.getString(R.string.in_call);
52 out_call = res.getString(R.string.out_call);
53 duration = res.getString(R.string.duration);
54 lessthan = res.getString(R.string.lessthan);
55 minutes1 = res.getString(R.string.minutes1);
56 minutes2to4 = res.getString(R.string.minutes2to4);
57 minutes5up = res.getString(R.string.minutes5up);
58 sayWhen = new SayWhen(res);
59 calendar_name = store.get("calendar_name");
60 peer_name = store.get("peer_name");
61 calendar_id = store.get("calendar_id");
62 calendar = Calendar.builder(httpTransport, jsonFactory)
63 .setHttpRequestInitializer(
64 newMyAccessProtectedResource())
65 .setApplicationName("WhereAmI/1.0").build();
69 public final String getResult() {
71 Log.v(TAG, "entering getResult");
72 if (calendar_id == null || calendar_id == "") {
73 calendar_id = scanCalendars(calendar_name);
75 if (calendar_id == null || calendar_id == "") {
76 return nocalendar + " \"" +
79 store.put("calendar_id", calendar_id);
80 return scanEvents(calendar_id, peer_name);
82 } catch (GoogleJsonResponseException e) {
83 Log.e(TAG, "GoogleJsonResponseException: " + e);
84 if (e.getResponse().getStatusCode() == 401) {
85 return authErrorMessage;
87 return e.getMessage();
89 } catch (HttpResponseException e) {
90 Log.e(TAG, "HttpResponseException: " + e);
91 return e.getMessage();
92 } catch (IOException e) {
94 return e.getMessage();
98 private String scanCalendars(String calendar_name)
99 throws java.io.IOException {
101 Log.v(TAG, "Entering scanCalendars for \"" +
102 calendar_name + "\"");
104 CalendarList cl = calendar.calendarList().list().execute();
106 String pt = cl.getNextPageToken();
107 Log.v(TAG, "got cl with pt=" + pt);
108 for (CalendarListEntry le : cl.getItems()) {
109 Log.v(TAG, "entry " + le.getId() + ":\"" +
110 le.getSummary() + "\"");
111 if (le.getSummary().equals(calendar_name)) {
113 //break; // get all in the log
116 if (pt != null && pt != "") {
117 cl = calendar.calendarList().list()
118 .setPageToken(pt).execute();
127 private String scanEvents(String calendar_id, String peer_name)
128 throws java.io.IOException {
129 Log.v(TAG, "Entering scanEvents for \"" +
130 peer_name + "\" in \"" + calendar_id + "\"");
132 Time ago = new Time();
133 ago.set(System.currentTimeMillis() - 604800000L);
134 Long latestStartTime = 0L;
135 Long latestStopTime = 0L;
136 Boolean latestWasOutgoing = false;
137 Boolean wasFound = false;
139 Events events = calendar.events().list(calendar_id)
140 .setTimeMin(ago.format3339(false))
144 String pt = events.getNextPageToken();
145 Log.v(TAG, "got events with pt=" + pt);
146 for (Event event : events.getItems()) {
148 String evSummary = event.getSummary();
149 Long evStart = event.getStart()
150 .getDateTime().getValue();
151 Long evStop = event.getEnd()
152 .getDateTime().getValue();
153 Log.v(TAG, "event " + evStart +
155 " : \"" + evSummary + "\"");
156 if ((evSummary.startsWith("Call To ") ||
157 evSummary.startsWith("Call From ")) &&
158 evStart > latestStartTime) {
159 latestStartTime = evStart;
160 latestStopTime = evStop;
161 latestWasOutgoing = evSummary
162 .startsWith("Call To ");
166 if (count < 100 && pt != null && pt != "") {
167 events = calendar.events().list(calendar_id)
168 .setTimeMin(ago.format3339(false))
170 .setPageToken(pt).execute();
177 return makeMessage(latestStartTime, latestStopTime,
184 private String makeMessage(Long latestStartTime, Long latestStopTime,
185 Boolean latestWasOutgoing) {
186 Time stime = new Time();
187 stime.set(latestStartTime);
188 Long dur = (latestStopTime - latestStartTime) / 60000L;
189 Log.v(TAG, "Chosen event: start " + stime +
190 " for " + dur + " min");
192 String howlong = dur.toString();
195 minutes = minutes2to4;
196 } else if ((dur / 10) == 1) {
197 minutes = minutes5up;
198 } else if ((dur % 10) == 1) {
200 } else if ((dur % 10) < 5) {
201 minutes = minutes2to4;
203 minutes = minutes5up;
206 " " + (latestWasOutgoing?out_call:in_call) +
207 " " + sayWhen.say(latestStartTime) +
208 " " + duration + " " + howlong + " " + minutes;