OSDN Git Service

803e51a79b94c7d985701e2e8aef8a243720f079
[tokyorunners/tokyorunners.git] / src / net / kazhik / android / tokyorunners / RunningHistory.java
1 package net.kazhik.android.tokyorunners;
2
3 import java.io.FileOutputStream;
4 import java.io.IOException;
5 import java.io.OutputStreamWriter;
6 import java.text.ParseException;
7 import java.text.SimpleDateFormat;
8 import java.util.ArrayList;
9 import java.util.Date;
10 import java.util.HashMap;
11 import java.util.Iterator;
12
13 import android.app.ListActivity;
14 import android.content.Intent;
15 import android.database.Cursor;
16 import android.os.Bundle;
17 import android.os.Environment;
18 import android.util.Log;
19 import android.view.ContextMenu;
20 import android.view.Menu;
21 import android.view.MenuItem;
22 import android.view.View;
23 import android.view.ContextMenu.ContextMenuInfo;
24 import android.widget.AdapterView;
25 import android.widget.ArrayAdapter;
26 import android.widget.AdapterView.AdapterContextMenuInfo;
27 import android.widget.AdapterView.OnItemClickListener;
28
29 public class RunningHistory extends ListActivity implements OnItemClickListener {
30     private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
31     private HashMap<Long, Long> m_startTimeMap = new HashMap<Long, Long>();
32         
33         private static final int MENU_DELETE_THIS = Menu.FIRST + 200;
34         private static final int MENU_DELETE_ALL = Menu.FIRST + 201;
35         private static final int MENU_SAVE_GPX = Menu.FIRST + 202;
36         
37         private final static String LOGDIR = Environment
38                         .getExternalStorageDirectory().getPath()
39                         + "/tokyorunners/";
40         
41     @Override
42     public void onCreate(Bundle savedInstanceState) {
43         super.onCreate(savedInstanceState);
44         
45         setContentView(R.layout.history);
46
47         // 履歴データを読み込む
48         String[] columns = {
49                         RunningRecordProvider.START_TIME,
50                         RunningRecordProvider.DISTANCE};
51         String sortOrder = RunningRecordProvider.CURRENT_TIME + " desc";
52         Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns, null, null, sortOrder);
53
54         if (cursor == null || cursor.getCount() == 0) {
55                 return;
56         }
57         ArrayList<String> history = new ArrayList<String>();
58         long startTime = 0;
59         float distance = 0;
60         long prevStartTime = 0;
61         while (cursor.moveToNext()) {
62                 startTime = cursor.getLong(0);
63                 distance = (float)cursor.getLong(1);
64 //              Log.d(this.getClass().getName(), "startTime:" + startTime +  "; distance:" + distance);
65                 
66                 if (startTime == prevStartTime) {
67                         // I need "select distinct"!
68                         continue;
69                 }
70                 m_startTimeMap.put(startTime / 1000 * 1000, startTime);
71                 
72                 prevStartTime = startTime;
73                 StringBuffer rowStr = new StringBuffer();
74                 rowStr.append(m_startTimeFormatter.format(new Date(startTime)));
75                 rowStr.append("  ");
76
77                 rowStr.append(distance / 1000);
78                 history.add(rowStr.toString());
79         }
80         ArrayAdapter<String> historyArray = new ArrayAdapter<String>(this, R.layout.runningrecord, history);
81
82         setListAdapter(historyArray);
83
84   
85         // イベントリスナを登録
86         getListView().setOnItemClickListener(this);
87         
88                 getListView().setOnCreateContextMenuListener(this);
89     }
90
91         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
92         ArrayAdapter<String> historyArray = (ArrayAdapter<String>)getListAdapter();
93         
94                 Intent returnData = new Intent();
95                 try {
96                         String[] splitStr = historyArray.getItem(position).split(" ");
97                         String dateStr = splitStr[0] + " " + splitStr[1];
98                         Date startTime = m_startTimeFormatter.parse(dateStr);
99                         
100                         returnData.setAction(Intent.ACTION_VIEW);
101                         returnData.putExtra("startTime", m_startTimeMap.get(startTime.getTime()));
102                         
103                         setResult(RESULT_OK, returnData);
104                 } catch (ParseException e) {
105                         e.printStackTrace();
106                 }
107                 finish();
108                 
109         }
110
111         public void onCreateContextMenu(ContextMenu menu, View v,
112                         ContextMenuInfo menuInfo) {
113                 super.onCreateContextMenu(menu, v, menuInfo);
114         menu.add(0, MENU_DELETE_THIS, 0, R.string.contextmenu_deletethis);
115                 menu.add(0, MENU_DELETE_ALL, 0, R.string.contextmenu_deleteall);
116                 menu.add(0, MENU_SAVE_GPX, 0, R.string.contextmenu_save_gpx);
117         }
118
119         public boolean onContextItemSelected(MenuItem item) {
120                 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
121                                 .getMenuInfo();
122                 ArrayAdapter<String> historyArray = (ArrayAdapter<String>) getListAdapter();
123                 int position = info.position;
124                 String[] splitStr = historyArray.getItem(position).split(" ");
125                 String dateStr = splitStr[0] + " " + splitStr[1];
126                 long startTime = 0;
127                 try {
128                         startTime = m_startTimeFormatter.parse(dateStr).getTime();
129                         startTime = m_startTimeMap.get(startTime);
130                 } catch (ParseException e) {
131                         e.printStackTrace();
132                 }
133                 switch (item.getItemId()) {
134                 case MENU_DELETE_THIS:
135
136                         String selection = RunningRecordProvider.START_TIME + " = ?";
137                         String[] selectionArgs = { Long.toString(startTime) };
138
139                         getContentResolver().delete(RunningRecordProvider.REC_URI,
140                                         selection, selectionArgs);
141
142                         historyArray.remove(historyArray.getItem(position));
143                         break;
144                 case MENU_DELETE_ALL:
145                         getContentResolver().delete(RunningRecordProvider.REC_URI, null,
146                                         null);
147                         historyArray.clear();
148                         break;
149                 case MENU_SAVE_GPX:
150                         saveRecordAsGpxFile(startTime);
151                         break;
152                 default:
153                         break;
154                 }
155                 return super.onContextItemSelected(item);
156         }
157         
158         private void saveRecordAsGpxFile(long startTime) {
159                 String[] columns = { RunningRecordProvider.CURRENT_TIME,
160                                 RunningRecordProvider.LATITUDE,
161                                 RunningRecordProvider.LONGITUDE,
162                                 RunningRecordProvider.POINT_NAME };
163                 String selection = RunningRecordProvider.START_TIME + " = ?";
164                 String[] selectionArgs = { Long.toString(startTime) };
165                 String sortOrder = RunningRecordProvider.CURRENT_TIME + " asc";
166                 Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns,
167                                 selection, selectionArgs, sortOrder);
168                 if (cursor == null) {
169                         return;
170                 }
171                 
172                 SimpleDateFormat formatter = new SimpleDateFormat(
173                                 "yyyy-MM-dd_HH_mm_ss");
174                 String gpxFilePath = LOGDIR + formatter.format(new Date(startTime)) + ".xml";
175                 FileOutputStream gpxFile = null;
176                 OutputStreamWriter stWriter = null;
177                 try {
178                         gpxFile = new FileOutputStream(gpxFilePath);
179                         stWriter = new OutputStreamWriter(gpxFile);
180                         stWriter
181                                         .write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
182                                                         + "<gpx\n"
183                                                         + " version=\"1.0\"\n"
184                                                         + "creator=\"Tokyo Runners\"\n"
185                                                         + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
186                                                         + "xmlns=\"http://www.topografix.com/GPX/1/0\"\n"
187                                                         + "xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n");
188
189                         stWriter.write("<trk>\n" + "<trkseg>\n");
190
191                         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
192                         SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
193
194                         long currentTime = 0;
195                         int latitude = 0;
196                         int longitude = 0;
197                         String pointName = "";
198
199                         while (cursor.moveToNext()) {
200                                 currentTime = cursor.getLong(cursor
201                                                 .getColumnIndex(RunningRecordProvider.CURRENT_TIME));
202                                 latitude = cursor.getInt(cursor
203                                                 .getColumnIndex(RunningRecordProvider.LATITUDE));
204                                 longitude = cursor.getInt(cursor
205                                                 .getColumnIndex(RunningRecordProvider.LONGITUDE));
206                                 pointName = cursor.getString(cursor
207                                                 .getColumnIndex(RunningRecordProvider.POINT_NAME));
208
209                                 stWriter.write("<trkpt lat=\"" + (((float)latitude) / 1E6)
210                                                 + "\" lon=\"" + (((float)longitude) / 1E6) + "\">\n" + "<time>"
211                                                 + dateFormat.format(currentTime) + "T"
212                                                 + timeFormat.format(currentTime) + "Z</time>\n"
213                                                 + "<speed>" + 0 + "</speed>\n" + "<name>"
214                                                 + pointName + "</name>\n" + "<fix>none</fix>\n"
215                                                 + "</trkpt>\n");
216
217                         }
218                         
219                         stWriter.write("</trkseg>\n" + "</trk>\n" + "</gpx>\n");
220                         stWriter.flush();
221
222                 } catch (IOException e) {
223                 } finally {
224                         try {
225                                 if (stWriter != null) {
226                                         stWriter.close();
227                                 }
228                                 if (gpxFile != null) {
229                                         gpxFile.close();
230                                 }
231                         } catch (IOException e) {
232                         }
233                 }
234         }
235
236 }