1 package net.kazhik.android.tokyorunners;
\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
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
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
26 public RunningRecord() {
\r
29 public RunningRecord(ContentResolver contentResolver) {
\r
30 m_contentResolver = contentResolver;
\r
32 public String addRecord(Date date, Location loc, String pointName, boolean persistent) {
\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
39 m_startTime = date.getTime();
\r
41 m_prevLocation = loc;
\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
50 Record newRecord = new Record(date, loc, m_distance, pointName);
\r
51 m_recordList.add(newRecord);
\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
64 m_contentResolver.insert(RunningRecordProvider.REC_URI, values);
\r
65 } catch (IllegalArgumentException e) {
\r
66 Log.e(this.getClass().getName(), e.getMessage());
\r
74 public String addRecord(Date date, Location loc, String pointName) {
\r
75 return addRecord(date, loc, pointName, true);
\r
77 public Location getPrevLocation() {
\r
78 return m_prevLocation;
\r
82 public void clearRecord() {
\r
85 m_prevLocation = null;
\r
87 m_recordList.clear();
\r
90 public Record getRecord(Date date) {
\r
93 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {
\r
94 rec = (Record)it.next();
\r
96 if (rec.getDate().compareTo(date) == 0) {
\r
103 public Record getNextRecord(Date date) {
\r
106 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {
\r
107 rec = (Record)it.next();
\r
109 if (rec.getDate().compareTo(date) > 0) {
\r
117 public void setSplitInterval(int interval) {
\r
118 m_splitInterval = interval * 1000;
\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
128 public String getDistanceUnit() {
\r
129 return m_distanceUnit;
\r
132 public void save(OutputStreamWriter stWriter) throws IOException {
\r
134 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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
147 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
\r
148 SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
\r
150 for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {
\r
151 Record rec = (Record)it.next();
\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
172 public void save() {
\r
174 if (saved(m_startTime) == true) {
\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
189 m_contentResolver.insert(RunningRecordProvider.REC_URI, values);
\r
190 } catch (IllegalArgumentException e) {
\r
191 Log.e(this.getClass().getName(), e.getMessage());
\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
203 return (cursor != null && cursor.getCount() > 0);
\r