1 package org.average.whereami;
3 import org.average.whereami.PersistentStore;
5 import java.io.IOException;
7 import com.google.api.client.googleapis.json.GoogleJsonResponseException;
8 import com.google.api.client.http.HttpResponseException;
9 import com.google.api.client.util.DateTime;
10 import com.google.api.services.calendar.Calendar;
11 import com.google.api.services.calendar.CalendarRequest;
12 import com.google.api.services.calendar.model.CalendarList;
13 import com.google.api.services.calendar.model.CalendarListEntry;
14 import com.google.api.services.calendar.model.Event;
15 import com.google.api.services.calendar.model.Events;
16 import com.google.common.collect.Lists;
18 import android.content.Context;
19 import android.content.res.Resources;
20 import android.text.format.Time;
21 import android.util.Log;
23 public final class PhoneLog extends Oracle {
25 final String TAG = getClass().getName();
27 private Calendar calendar;
29 private PersistentStore store;
30 private String calendar_name;
31 private String peer_name;
32 private String calendar_id;
33 private String nocalendar;
34 private String noevents;
35 private String last_call;
36 private String in_call;
37 private String out_call;
38 private String duration;
39 private String minutes1;
40 private String minutes2to4;
41 private String minutes5up;
43 public PhoneLog(final Resources res, final PersistentStore store) {
46 nocalendar = res.getString(R.string.nocalendar);
47 noevents = res.getString(R.string.noevents);
48 last_call = res.getString(R.string.last_call);
49 in_call = res.getString(R.string.in_call);
50 out_call = res.getString(R.string.out_call);
51 duration = res.getString(R.string.duration);
52 minutes1 = res.getString(R.string.minutes1);
53 minutes2to4 = res.getString(R.string.minutes2to4);
54 minutes5up = res.getString(R.string.minutes5up);
55 calendar_name = store.get("calendar_name");
56 peer_name = store.get("peer_name");
57 calendar_id = store.get("calendar_id");
59 calendar = Calendar.builder(httpTransport, jsonFactory)
60 .setHttpRequestInitializer(accessProtectedResource)
61 .setApplicationName("WhereAmI/1.0").build();
65 public final String getResult() {
67 Log.v(TAG, "entering getResult");
68 if (calendar_id == null || calendar_id == "") {
69 calendar_id = scanCalendars(calendar_name);
71 if (calendar_id == null || calendar_id == "") {
72 return nocalendar + " \"" +
75 store.put("calendar_id", calendar_id);
76 return scanEvents(calendar_id, peer_name);
78 } catch (GoogleJsonResponseException e) {
79 Log.e(TAG, "GoogleJsonResponseException: " + e);
80 if (e.getResponse().getStatusCode() == 401) {
81 return authErrorMessage;
83 return e.getMessage();
85 } catch (HttpResponseException e) {
86 Log.e(TAG, "HttpResponseException: " + e);
87 return e.getMessage();
88 } catch (IOException e) {
90 return e.getMessage();
94 private String scanCalendars(String calendar_name)
95 throws java.io.IOException {
97 Log.v(TAG, "Entering scanCalendars for \"" +
98 calendar_name + "\"");
100 CalendarList cl = calendar.calendarList().list().execute();
102 String pt = cl.getNextPageToken();
103 Log.v(TAG, "got cl with pt=" + pt);
104 for (CalendarListEntry le : cl.getItems()) {
105 Log.v(TAG, "entry " + le.getId() + ":\"" +
106 le.getSummary() + "\"");
107 if (le.getSummary().equals(calendar_name)) {
109 //break; // get all in the log
112 if (pt != null && pt != "") {
113 cl = calendar.calendarList().list()
114 .setPageToken(pt).execute();
123 private String scanEvents(String calendar_id, String peer_name)
124 throws java.io.IOException {
125 Log.v(TAG, "Entering scanEvents for \"" +
126 peer_name + "\" in \"" + calendar_id + "\"");
128 Time ago = new Time();
129 ago.set(System.currentTimeMillis() - 604800000L);
130 Long latestStartTime = 0L;
131 Long latestStopTime = 0L;
132 Boolean latestWasOutgoing = false;
133 Boolean wasFound = false;
135 Events events = calendar.events().list(calendar_id)
136 .setTimeMin(ago.format3339(false))
140 String pt = events.getNextPageToken();
141 Log.v(TAG, "got events with pt=" + pt);
142 for (Event event : events.getItems()) {
144 String evSummary = event.getSummary();
145 Long evStart = event.getStart()
146 .getDateTime().getValue();
147 Long evStop = event.getEnd()
148 .getDateTime().getValue();
149 Log.v(TAG, "event " + evStart +
151 " : \"" + evSummary + "\"");
152 if ((evSummary.startsWith("Called ") ||
153 evSummary.startsWith("Call from ")) &&
154 evStart > latestStartTime) {
155 latestStartTime = evStart;
156 latestStopTime = evStop;
157 latestWasOutgoing = evSummary
158 .startsWith("Called ");
162 if (count < 100 && pt != null && pt != "") {
163 events = calendar.events().list(calendar_id)
164 .setTimeMin(ago.format3339(false))
166 .setPageToken(pt).execute();
173 return makeMessage(latestStartTime, latestStopTime,
180 private String makeMessage(Long latestStartTime, Long latestStopTime,
181 Boolean latestWasOutgoing) {
182 Time stime = new Time();
183 stime.set(latestStartTime);
184 Long dur = (latestStopTime - latestStartTime) / 60000L;
185 Log.v(TAG, "Chosen event: start " + stime +
186 " for " + dur + " sec");
190 } else if (dur < 5) {
191 minutes = minutes2to4;
193 minutes = minutes5up;
195 return last_call + " " +
196 (latestWasOutgoing?out_call:in_call) +
197 " " + duration + " " + dur + " " + minutes +
198 " " + stime.format("%H:%M");