OSDN Git Service

4e5eff899748fef82854a652be4833cd6d72ddb3
[train-delayed/source.git] / workspace / TrainDelayed / src / com / td / service / TrainTwitterAdapter.java
1 package com.td.service;\r
2 \r
3 import java.util.Calendar;\r
4 import java.util.Date;\r
5 import java.util.List;\r
6 \r
7 import twitter4j.QueryResult;\r
8 import twitter4j.Tweet;\r
9 import twitter4j.TwitterAdapter;\r
10 import twitter4j.TwitterException;\r
11 import twitter4j.TwitterMethod;\r
12 import android.content.ContentValues;\r
13 import android.content.Context;\r
14 import android.net.Uri;\r
15 \r
16 import com.td.HistoryContentProvider;\r
17 import com.td.db.Keyword;\r
18 import com.td.db.Train;\r
19 import com.td.utility.ConfUtil;\r
20 import com.td.utility.DateUtil;\r
21 import com.td.utility.Debug;\r
22 import com.td.utility.Delay;\r
23 import com.td.utility.EditPrefUtil;\r
24 \r
25 public class TrainTwitterAdapter extends TwitterAdapter {\r
26         public static final long START_ID = Long.MAX_VALUE;\r
27         public static final long ERROR_ID = START_ID - 1;\r
28         public static final long DELAY_ID = START_ID - 2;\r
29 \r
30         private TrainDelayedService impl;\r
31         private EditPrefUtil pref;\r
32 \r
33         private Calendar cal;\r
34 \r
35         public TrainTwitterAdapter(TrainDelayedService impl) {\r
36                 this.impl = impl;\r
37                 pref = new EditPrefUtil(impl.getContext());\r
38         }\r
39 \r
40         public void setCalender(Calendar cal) {\r
41                 this.cal = cal;\r
42         }\r
43 \r
44         @Override\r
45         public void searched(QueryResult result) {\r
46                 super.searched(result);\r
47 \r
48                 try {\r
49                         int len = ConfUtil.getLen(pref);\r
50 \r
51                         long min = Long.MAX_VALUE;\r
52                         long max = 0;\r
53 \r
54                         Date minDate = null;\r
55                         Date maxDate = null;\r
56                         Date curDate = cal.getTime();\r
57 \r
58                         long cur = curDate.getTime();\r
59                         long from = cur - len * 60 * 1000;\r
60                         int count = 0;\r
61                         long diff = 0;\r
62 \r
63                         List<Tweet> tweets = result.getTweets();\r
64                         for (Tweet tweet : tweets) {\r
65                                 String text = tweet.getText();\r
66                                 Date at = tweet.getCreatedAt();\r
67                                 long l = at.getTime();\r
68 \r
69                                 if (l < from) {\r
70                                         continue;\r
71                                 }\r
72                                 if (!filter(text)) {\r
73                                         // \92x\89\84\88È\8aO\82Ì\8f\91\82«\8d\9e\82Ý\r
74                                         // Debug.d(this, "NO MATCH:" + text);\r
75                                         continue;\r
76                                 }\r
77                                 if (l < min) {\r
78                                         min = l;\r
79                                         minDate = at;\r
80                                 }\r
81                                 if (l > max) {\r
82                                         max = l;\r
83                                         maxDate = at;\r
84                                 }\r
85 \r
86                                 count++;\r
87                         }\r
88                         diff = 0;\r
89                         if (minDate != null && maxDate != null) {\r
90                                 diff = len;\r
91                         }\r
92 \r
93                         String query = result.getQuery();\r
94                         long routeId = -1;\r
95                         List<Train> trains = impl.getTrains();\r
96                         if (trains != null) {\r
97                                 Train train = null;\r
98                                 for (Train t : trains) {\r
99                                         if (query.equals(t.getSearchText())) {\r
100                                                 train = t;\r
101                                                 routeId = t.getId();\r
102                                                 break;\r
103                                         }\r
104                                 }\r
105                                 if (train == null) {\r
106                                         return;\r
107                                 }\r
108 \r
109                                 if (minDate != null && maxDate != null) {\r
110                                         Debug.d(this, minDate.toString(), "-", maxDate.toString());\r
111                                 }\r
112                                 Debug.d(this, "routeId=" + routeId);\r
113                                 Debug.d(this, "diff=" + diff);\r
114                                 Debug.d(this, "count=" + count);\r
115 \r
116                                 checkDelay(train, cal, count, len);\r
117 \r
118                                 insert(routeId, diff, count, 0);\r
119                         }\r
120                 } catch (Exception e) {\r
121                         Debug.d(this, null, e);\r
122                 }\r
123         }\r
124 \r
125         public boolean checkDelay(Train train, Calendar curCal, int count, int len) {\r
126                 int cntpmi = count / len;\r
127                 int h = ConfUtil.getHeight(pref);\r
128 \r
129                 if (cntpmi < h) {\r
130                         return false;\r
131                 }\r
132                 \r
133                 boolean isDelay = true;\r
134 \r
135                 String data = ConfUtil.getDelay(pref);\r
136                 Delay[] delays = Delay.getInstances(data);\r
137                 Delay newDelay = null;\r
138 \r
139                 Delay delay = Delay.search(delays, train.getId());\r
140                 if (delay != null) {\r
141                         Calendar dCal = DateUtil.getCalendar(delay.getYmd(), delay.getHm());\r
142                         long t = dCal.getTimeInMillis();\r
143                         int w = ConfUtil.getWidth(pref);\r
144                         long cur = curCal.getTimeInMillis();\r
145                         if (cur - t < w * 60 * 1000) {\r
146                                 // \8dÅ\8cã\82Ì\92x\89\84\82©\82ç\8e\9e\8aÔ\82ª\8co\82Á\82Ä\82¢\82È\82¢(\92x\89\84\82Ì\8e\9e\8aÔ\82Í\8dX\90V\82·\82é)\r
147                                 Debug.t(impl.getContext(), train.getName() + " \8dÅ\8cã\82Ì\92x\89\84\82©\82ç\8e\9e\8aÔ\82ª\8co\82Á\82Ä\82¢\82È\82¢");\r
148                         \r
149                                 isDelay = false;\r
150                         } else {\r
151                                 // \91O\89ñ\82Ì\92x\89\84\82©\82ç\81A\8dÄ\93x\92x\89\84\82ª\94­\90\r
152                                 Debug.t(impl.getContext(), train.getName() + " \91O\89ñ\82Ì\92x\89\84\82©\82ç\81A\8dÄ\93x\92x\89\84\82ª\94­\90¶");\r
153                         }\r
154                         Date d = curCal.getTime();\r
155                         delay.setYmd(DateUtil.getYmd(d));\r
156                         delay.setHm(DateUtil.getHm(d));\r
157                 } else {\r
158                         // \90V\8bK\93o\98^(\92x\89\84\94­\90¶)\r
159                         Date d = curCal.getTime();\r
160                         int ymd = DateUtil.getYmd(d);\r
161                         int hm = DateUtil.getHm(d);\r
162                         newDelay = new Delay(train.getId(), ymd, hm, 0, true);\r
163 \r
164                         Debug.t(impl.getContext(), train.getName() + " \90V\8bK\93o\98^(\92x\89\84\94­\90¶)");\r
165                         \r
166                         TrainTwitterAdapter.insert(\r
167                                         impl.getContext(),\r
168                                         curCal,\r
169                                         TrainTwitterAdapter.DELAY_ID, -1, (int)train.getId(),\r
170                                         -1);\r
171                 }\r
172                 //\r
173                 StringBuffer sb = Delay.getData(delays);\r
174                 if (newDelay != null) {\r
175                         Delay.setData(sb, newDelay);\r
176                 }\r
177                 ConfUtil.setDelay(pref, sb.toString());\r
178 \r
179                 if (isDelay) {\r
180                         // \92x\89\84\82ð\92Ê\92m\r
181                         if (impl != null) {\r
182                                 impl.notificate(train.getName());\r
183                         }\r
184                 }\r
185                 pref.update();\r
186                 return isDelay;\r
187         }\r
188 \r
189         private boolean filter(String text) {\r
190                 List<Keyword> keywords = impl.getKeywords();\r
191                 if (keywords == null) {\r
192                         return false;\r
193                 }\r
194 \r
195                 for (Keyword keyword : keywords) {\r
196                         if (text.indexOf(keyword.getText()) >= 0) {\r
197                                 return true;\r
198                         }\r
199                 }\r
200                 return false;\r
201         }\r
202 \r
203         private void insert(long routeId, long diff, int count, int status) {\r
204                 insert(impl.getContext(), cal, routeId, diff, count, status);\r
205         }\r
206 \r
207         public static void insert(Context context, Calendar cal, long routeId,\r
208                         long diff, long count, int status) {\r
209                 Date date = cal.getTime();\r
210 \r
211                 int ymd = DateUtil.getYmd(date);\r
212                 int hm = DateUtil.getHm(date);\r
213                 int w = cal.get(Calendar.DAY_OF_WEEK) - 1;\r
214 \r
215                 Debug.d(context, "insert " + ymd, "/" + hm, "/" + w);\r
216 \r
217                 ContentValues values = new ContentValues();\r
218                 values.put(HistoryContentProvider.Fields.ROUTE_ID, routeId);\r
219                 values.put(HistoryContentProvider.Fields.YMD, ymd);\r
220                 values.put(HistoryContentProvider.Fields.HM, hm);\r
221                 values.put(HistoryContentProvider.Fields.WEEK, w);\r
222                 values.put(HistoryContentProvider.Fields.PERIOD, diff);\r
223                 values.put(HistoryContentProvider.Fields.NUM, count);\r
224                 values.put(HistoryContentProvider.Fields.STATUS, status);\r
225 \r
226                 Uri uri = context.getContentResolver().insert(\r
227                                 HistoryContentProvider.CONTENT_URI, values);\r
228                 Debug.d(context, uri.toString());\r
229         }\r
230 \r
231         @Override\r
232         public void onException(TwitterException e, TwitterMethod method) {\r
233                 Debug.d(this, null, e);\r
234                 if (Debug.isDebug()) {\r
235                         insert(ERROR_ID, -1, -1, -1);\r
236                 }\r
237         }\r
238 }\r