]> www.average.org Git - WhereAmI.git/blob - src/org/average/whereami/PhoneLog.java
708b88ef3d072d4f6213a3af82f3b481167d7986
[WhereAmI.git] / src / org / average / whereami / PhoneLog.java
1 package org.average.whereami;
2
3 import org.average.whereami.PersistentStore;
4
5 import java.io.IOException;
6
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;
17
18 import android.content.Context;
19 import android.content.res.Resources;
20 import android.text.format.Time;
21 import android.util.Log;
22
23 public final class PhoneLog extends Oracle {
24
25         final String TAG = getClass().getName();
26
27         private Calendar calendar;
28
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;
42
43         public PhoneLog(final Resources res, final PersistentStore store) {
44                 super(res, store);
45                 this.store = 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");
58
59                 calendar = Calendar.builder(httpTransport, jsonFactory)
60                         .setHttpRequestInitializer(accessProtectedResource)
61                         .setApplicationName("WhereAmI/1.0").build();
62         }
63
64         @Override
65         public final String getResult() {
66                 try {
67                         Log.v(TAG, "entering getResult");
68                         if (calendar_id == null || calendar_id == "") {
69                                 calendar_id = scanCalendars(calendar_name);
70                         }
71                         if (calendar_id == null || calendar_id == "") {
72                                 return nocalendar + " \"" +
73                                         calendar_name + "\"";
74                         } else {
75                                 store.put("calendar_id", calendar_id);
76                                 return scanEvents(calendar_id, peer_name);
77                         }
78                 } catch (GoogleJsonResponseException e) {
79                         Log.e(TAG, "GoogleJsonResponseException: " + e);
80                         if (e.getResponse().getStatusCode() == 401) {
81                                 return authErrorMessage;
82                         } else {
83                                 return e.getMessage();
84                         }
85                 } catch (HttpResponseException e) {
86                         Log.e(TAG, "HttpResponseException: " + e);
87                         return e.getMessage();
88                 } catch (IOException e) {
89                         e.printStackTrace();
90                         return e.getMessage();
91                 }
92         }
93
94         private String scanCalendars(String calendar_name)
95                                                 throws java.io.IOException {
96                 String res = "";
97                 Log.v(TAG, "Entering scanCalendars for \"" +
98                         calendar_name + "\"");
99
100                 CalendarList cl = calendar.calendarList().list().execute();
101                 while (true) {
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)) {
108                                         res = le.getId();
109                                         //break; // get all in the log
110                                 }
111                         }
112                         if (pt != null && pt != "") {
113                                 cl = calendar.calendarList().list()
114                                         .setPageToken(pt).execute();
115                         } else {
116                                 break;
117                         }
118                 }
119
120                 return res;
121         }
122
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 + "\"");
127                 Integer count = 0;
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;
134
135                 Events events = calendar.events().list(calendar_id)
136                         .setTimeMin(ago.format3339(false))
137                         .setQ(peer_name)
138                         .execute();
139                 while (true) {
140                         String pt = events.getNextPageToken();
141                         Log.v(TAG, "got events with pt=" + pt);
142                         for (Event event : events.getItems()) {
143                                 count++;
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 +
150                                         " - " + evStop +
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 ");
159                                                 wasFound = true;
160                                 }
161                         }
162                         if (count < 100 && pt != null && pt != "") {
163                                 events = calendar.events().list(calendar_id)
164                                         .setTimeMin(ago.format3339(false))
165                                         .setQ(peer_name)
166                                         .setPageToken(pt).execute();
167                         } else {
168                                 break;
169                         }
170                 }
171
172                 if (wasFound) {
173                         return makeMessage(latestStartTime, latestStopTime,
174                                                 latestWasOutgoing);
175                 } else {
176                         return noevents;
177                 }
178         }
179
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");
187                 String minutes;
188                 if (dur == 1) {
189                         minutes = minutes1;
190                 } else if (dur < 5) {
191                         minutes = minutes2to4;
192                 } else {
193                         minutes = minutes5up;
194                 }
195                 return last_call + " " +
196                         (latestWasOutgoing?out_call:in_call) +
197                         " " + duration + " " + dur + " " + minutes +
198                         " " + stime.format("%H:%M");
199         }
200 }