OSDN Git Service

gpx file
[tokyorunners/tokyorunners.git] / src / net / kazhik / android / tokyorunners / RunningRecord.java
1 package net.kazhik.android.tokyorunners;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.OutputStreamWriter;\r
5 import java.text.SimpleDateFormat;\r
6 import java.util.ArrayList;\r
7 import java.util.Date;\r
8 import java.util.Iterator;\r
9 \r
10 import android.content.ContentResolver;\r
11 import android.content.ContentValues;\r
12 import android.database.Cursor;\r
13 import android.location.Location;\r
14 import android.util.Log;\r
15 \r
16 public class RunningRecord {\r
17         private ArrayList<Record> m_recordList = new ArrayList<Record>();\r
18         private float m_distance = 0;\r
19         private Location m_prevLocation = null;\r
20         private int m_splitInterval = 0;\r
21         private int m_lastSplit = 0;\r
22         private long m_startTime = 0;\r
23         private String m_distanceUnit = "km";\r
24         private ContentResolver m_contentResolver;\r
25 \r
26         public RunningRecord() {\r
27                 \r
28         }\r
29         public RunningRecord(ContentResolver contentResolver) {\r
30                 m_contentResolver = contentResolver;\r
31         }\r
32         public String addRecord(Date date, Location loc, String pointName, boolean persistent) {\r
33                 // これまでの走行距離を計算\r
34                 if (m_prevLocation != null && loc != null) {\r
35                         float distance = m_prevLocation.distanceTo(loc);\r
36                         Log.d(this.getClass().getName(), "distance: " + distance);\r
37                         m_distance += m_prevLocation.distanceTo(loc);\r
38                 } else {\r
39                         m_startTime = date.getTime();\r
40                 }\r
41                 m_prevLocation = loc;\r
42                 \r
43                 // スプリットポイントを通過した場合     \r
44                 if (m_splitInterval > 0 && m_distance > m_lastSplit + m_splitInterval && pointName.length() == 0 ) {\r
45                         pointName = getDistanceString() + m_distanceUnit;\r
46                         m_lastSplit += m_splitInterval;\r
47                 }\r
48                 \r
49                 // リストに記録を保持\r
50                 Record newRecord = new Record(date, loc, m_distance, pointName);\r
51                 m_recordList.add(newRecord);\r
52                 \r
53                 // データベースに記録を保存\r
54                 if (persistent) {\r
55                 ContentValues values = new ContentValues();\r
56                 values.put(RunningRecordProvider.START_TIME, m_startTime);\r
57                 values.put(RunningRecordProvider.CURRENT_TIME, date.getTime());\r
58                 values.put(RunningRecordProvider.POINT_NAME, pointName);\r
59                 values.put(RunningRecordProvider.DISTANCE, (int)m_distance);\r
60                 values.put(RunningRecordProvider.LATITUDE, newRecord.getLatitudeE6());\r
61                 values.put(RunningRecordProvider.LONGITUDE, newRecord.getLongitudeE6());\r
62                 \r
63                 try {\r
64                         m_contentResolver.insert(RunningRecordProvider.REC_URI, values);\r
65                 } catch (IllegalArgumentException e) {\r
66                         Log.e(this.getClass().getName(), e.getMessage());\r
67                 }\r
68                         \r
69                 }\r
70                 \r
71                 return pointName;\r
72                 \r
73         }\r
74         public String addRecord(Date date, Location loc, String pointName) {\r
75                 return addRecord(date, loc, pointName, true);\r
76         }\r
77         public Location getPrevLocation() {\r
78                 return m_prevLocation;\r
79         }\r
80                 \r
81         \r
82         public void clearRecord() {\r
83                 m_distance = 0;\r
84                 m_lastSplit = 0;\r
85                 m_prevLocation = null;\r
86                 m_startTime = 0;\r
87                 m_recordList.clear();\r
88         }\r
89         \r
90         public Record getRecord(Date date) {\r
91                 Record rec = null;\r
92                 \r
93                 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {\r
94                         rec = (Record)it.next();\r
95                         \r
96                         if (rec.getDate().compareTo(date) == 0) {\r
97                                 return rec;\r
98                         }\r
99                 }\r
100                 \r
101                 return null;\r
102         }\r
103         public Record getNextRecord(Date date) {\r
104                 Record rec = null;\r
105                 \r
106                 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {\r
107                         rec = (Record)it.next();\r
108                         \r
109                         if (rec.getDate().compareTo(date) > 0) {\r
110                                 return rec;\r
111                         }\r
112                 }\r
113                 \r
114                 return null;\r
115         }\r
116         \r
117         public void setSplitInterval(int interval) {\r
118                 m_splitInterval = interval * 1000;\r
119         }\r
120 \r
121         public String getDistanceString() {\r
122                 // メートル以下を切り捨ててからキロメートルに変換\r
123                 int distance_m = (int)m_distance;\r
124                 return Float.toString((float)distance_m / 1000);\r
125         }\r
126         \r
127 \r
128         public String getDistanceUnit() {\r
129                 return m_distanceUnit;\r
130         }\r
131         \r
132         public void save(OutputStreamWriter stWriter) throws IOException {\r
133                 stWriter.write(\r
134                         "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +\r
135                         "<gpx\n" +\r
136                         " version=\"1.0\"\n" +\r
137                         "creator=\"Tokyo Runners\"\n" +\r
138                         "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +\r
139                         "xmlns=\"http://www.topografix.com/GPX/1/0\"\n" +\r
140                         "xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\"\n");\r
141 \r
142                 stWriter.write(\r
143                         "<trk>\n"+\r
144                         "<trkseg>\n");\r
145                 \r
146 \r
147             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");           \r
148             SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");             \r
149 \r
150                 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {\r
151                         Record rec = (Record)it.next();\r
152                         \r
153                         stWriter.write(\r
154                                 "<trkpt lat=\"" + rec.getLatitude() + "\" lon=\"" + rec.getLongitude()+"\">\n" +\r
155                                 "<time>" + dateFormat.format(rec.getTime()) + "T" + timeFormat.format(rec.getTime())+"Z</time>\n" +\r
156                                 "<speed>" + "speed" + "</speed>\n"+\r
157                                 "<name>" + "name" + "</name>\n"+\r
158                                 "<fix>none</fix>\n"+\r
159                                 "</trkpt>\n");\r
160 \r
161                 }\r
162                 \r
163                 stWriter.write(\r
164                         "</trkseg>\n"+\r
165                         "</trk>\n"+\r
166                         "</gpx>\n");\r
167                 \r
168                 stWriter.flush();\r
169                 \r
170                 \r
171         }\r
172         public void save() {\r
173         \r
174                 if (saved(m_startTime) == true) {\r
175                         return;\r
176                 }\r
177                 \r
178                 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {\r
179                         Record rec = (Record)it.next();\r
180                 ContentValues values = new ContentValues();\r
181                 values.put(RunningRecordProvider.START_TIME, m_startTime);\r
182                 values.put(RunningRecordProvider.CURRENT_TIME, rec.getTime());\r
183                 values.put(RunningRecordProvider.POINT_NAME, rec.getName());\r
184                 values.put(RunningRecordProvider.DISTANCE, (int)rec.getDistance());\r
185                 values.put(RunningRecordProvider.LATITUDE, rec.getLatitudeE6());\r
186                 values.put(RunningRecordProvider.LONGITUDE, rec.getLongitudeE6());\r
187                 \r
188                 try {\r
189                         m_contentResolver.insert(RunningRecordProvider.REC_URI, values);\r
190                 } catch (IllegalArgumentException e) {\r
191                         Log.e(this.getClass().getName(), e.getMessage());\r
192                 }\r
193                 }\r
194         }\r
195 \r
196         private boolean saved(long startTime) {\r
197                 String[] columns = { RunningRecordProvider.CURRENT_TIME };\r
198                 String selection = RunningRecordProvider.START_TIME + " = ?";\r
199                 String[] selectionArgs = { Long.toString(startTime) };\r
200                 Cursor cursor = m_contentResolver.query(RunningRecordProvider.REC_URI, columns,\r
201                                 selection, selectionArgs, null);\r
202                 \r
203                 return (cursor != null && cursor.getCount() > 0);\r
204                 \r
205         }\r
206         \r
207 }\r