import java.text.SimpleDateFormat;\r
import java.util.ArrayList;\r
import java.util.Date;\r
+import java.util.Iterator;\r
import java.util.List;\r
\r
import android.app.AlertDialog;\r
import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
-import android.content.SharedPreferences;\r
import android.graphics.Canvas;\r
import android.graphics.Color;\r
import android.graphics.Paint;\r
import android.graphics.Point;\r
import android.graphics.drawable.Drawable;\r
import android.os.Bundle;\r
-import android.preference.PreferenceManager;\r
+import android.os.Debug;\r
import android.util.Log;\r
import android.view.KeyEvent;\r
-import android.view.Menu;\r
import android.view.MenuItem;\r
-import android.view.View;\r
-import android.view.View.OnLongClickListener;\r
import android.widget.Toast;\r
\r
import com.google.android.maps.GeoPoint;\r
private SplitPoints m_overlaySplitpoints;\r
private GeoPoint m_prevPoint = null;\r
private long m_startTime = 0;\r
+ private final SimpleDateFormat m_timeFormatter = new SimpleDateFormat("HH:mm:ss");\r
\r
public class RunningRoute extends Overlay {\r
\r
\r
@Override\r
public void onResume() {\r
- Log.d(this.getClass().getName(), "onResume()");\r
super.onResume();\r
IntentFilter filter = new IntentFilter();\r
filter.addAction("NewRunningRecord");\r
Drawable runner = getResources().getDrawable(R.drawable.runner);\r
m_overlaySplitpoints = new SplitPoints(runner);\r
\r
+ long time1 = System.currentTimeMillis();\r
drawOverlays(mapView);\r
+ Log.d(this.getClass().getName(), "drawOverlays() -- " + (System.currentTimeMillis() - time1));\r
}\r
\r
private void drawOverlays(MapView mapView) {\r
\r
m_overlaySplitpoints.clearItem();\r
\r
- long recTime = 0;\r
- Record rec;\r
- while ((rec = TokyoRunners.getNextRecord(recTime)) != null) {\r
+ Iterator<Record> it = TokyoRunners.getRecordIterator();\r
+ while (it.hasNext()) {\r
+ Record rec = it.next();\r
if (rec.hasLocation()) {\r
GeoPoint gp = new GeoPoint(rec.getLatitudeE6(), rec\r
.getLongitudeE6());\r
drawSplitPoint(gp, rec.getName(), rec.getDate());\r
}\r
}\r
- recTime = rec.getDate().getTime();\r
if (m_startTime == 0) {\r
- m_startTime = recTime;\r
+ m_startTime = rec.getDate().getTime();\r
}\r
}\r
\r
}\r
\r
private void drawSplitPoint(GeoPoint gp, String pointName, Date recDate) {\r
- SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");\r
- String snippet = pointName + "[" + formatter.format(recDate) + "]";\r
+ String snippet = pointName + "[" + m_timeFormatter.format(recDate) + "]";\r
OverlayItem ovItem = new OverlayItem(gp, "", snippet);\r
m_overlaySplitpoints.addSplitpoint(ovItem);\r
if (m_overlaySplitpoints.size() == 1) {\r
}\r
\r
public boolean onKeyDown(int keyCode, KeyEvent event) {\r
- Log.d(this.getClass().getName(), "onKeyDown():" + keyCode);\r
if (keyCode == KeyEvent.KEYCODE_BACK) {\r
showDialog(Constants.DIALOG_EXIT_ID);\r
return true;\r
new DialogInterface.OnClickListener() {\r
@Override\r
public void onClick(DialogInterface dialog, int which) {\r
+ Debug.stopMethodTracing();\r
finish();\r
\r
}\r
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
+import java.util.Formatter;
import java.util.HashMap;
-import java.util.Iterator;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Environment;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView.OnItemClickListener;
public class RunningHistory extends ListActivity implements OnItemClickListener {
- private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+ private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
private HashMap<Long, Long> m_startTimeMap = new HashMap<Long, Long>();
private static final int MENU_DELETE_THIS = Menu.FIRST + 200;
// 履歴データを読み込む
String[] columns = {
RunningRecordProvider.START_TIME,
+ RunningRecordProvider.CURRENT_TIME,
RunningRecordProvider.DISTANCE};
String sortOrder = RunningRecordProvider.CURRENT_TIME + " desc";
Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns, null, null, sortOrder);
}
ArrayList<String> history = new ArrayList<String>();
long startTime = 0;
+ long currentTime = 0;
float distance = 0;
long prevStartTime = 0;
while (cursor.moveToNext()) {
startTime = cursor.getLong(0);
- distance = (float)cursor.getLong(1);
+ currentTime = cursor.getLong(1);
+ distance = (float)cursor.getLong(2);
// Log.d(this.getClass().getName(), "startTime:" + startTime + "; distance:" + distance);
if (startTime == prevStartTime) {
rowStr.append(" ");
rowStr.append(distance / 1000);
+ rowStr.append("km"); // TODO: i18n
+ rowStr.append(" ");
+
+ long finalTime = currentTime - startTime;
+ Formatter finalTimeFormatter = new Formatter();
+ rowStr.append(finalTimeFormatter.format("%d:%02d:%02d",
+ finalTime / 1000 / 60 / 60,
+ finalTime / 1000 / 60 % 60,
+ finalTime / 1000 % 60));
history.add(rowStr.toString());
}
ArrayAdapter<String> historyArray = new ArrayAdapter<String>(this, R.layout.runningrecord, history);
String[] splitStr = historyArray.getItem(position).split(" ");
String dateStr = splitStr[0] + " " + splitStr[1];
long startTime = 0;
- try {
- startTime = m_startTimeFormatter.parse(dateStr).getTime();
- startTime = m_startTimeMap.get(startTime);
- } catch (ParseException e) {
- e.printStackTrace();
- }
switch (item.getItemId()) {
case MENU_DELETE_THIS:
+ try {
+ startTime = m_startTimeFormatter.parse(dateStr).getTime();
+ startTime = m_startTimeMap.get(startTime);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
String selection = RunningRecordProvider.START_TIME + " = ?";
String[] selectionArgs = { Long.toString(startTime) };
historyArray.clear();
break;
case MENU_SAVE_GPX:
+ try {
+ startTime = m_startTimeFormatter.parse(dateStr).getTime();
+ startTime = m_startTimeMap.get(startTime);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
saveRecordAsGpxFile(startTime);
break;
default:
m_contentResolver = contentResolver;\r
}\r
public String addRecord(Date date, Location loc, String pointName, boolean persistent) {\r
+ //Log.d(this.getClass().getName(), date.toLocaleString());\r
// これまでの走行距離を計算\r
if (m_prevLocation != null && loc != null) {\r
float distance = m_prevLocation.distanceTo(loc);\r
- Log.d(this.getClass().getName(), "distance: " + distance);\r
+// Log.d(this.getClass().getName(), "distance: " + distance);\r
m_distance += m_prevLocation.distanceTo(loc);\r
- } else {\r
+ }\r
+ if (m_startTime == 0) {\r
m_startTime = date.getTime();\r
}\r
m_prevLocation = loc;\r
\r
return null;\r
}\r
+ public Iterator<Record> getIterator() {\r
+ return m_recordList.iterator();\r
+ }\r
+ \r
public Record getNextRecord(Date date) {\r
Record rec = null;\r
\r
package net.kazhik.android.tokyorunners;
import java.util.Date;
+import java.util.Iterator;
import android.app.AlertDialog;
import android.app.Dialog;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
+import android.media.AudioManager;
+import android.media.ToneGenerator;
import android.os.Bundle;
+import android.os.Debug;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.text.format.DateUtils;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-// Debug.startMethodTracing("tokyorunners");
+ Debug.startMethodTracing("tokyorunners");
setContentView(R.layout.stopwatch);
@Override
public void onDestroy() {
+ Log.d(this.getClass().getName(), "onDestroy():");
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
m_runningRecord = null;
-// Debug.stopMethodTracing();
-
if (m_useGPS) {
m_locMgr.removeUpdates(this);
}
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
+ Debug.stopMethodTracing();
finish();
}
return;
}
+ // 音声出力でスタートを知らせる
+ Location prevLocation = m_runningRecord.getPrevLocation();
+ if (prevLocation == null) {
+ ToneGenerator toneGenerator = new ToneGenerator(
+ AudioManager.STREAM_SYSTEM,
+ ToneGenerator.MAX_VOLUME);
+ toneGenerator.startTone(ToneGenerator.TONE_PROP_BEEP);
+ toneGenerator.stopTone();
+ }
+
+
// 精度が低いデータは無視
// 移動距離が精度より小さい場合も無視
if (location.hasAccuracy()) {
ExLog.put("Accuracy low: " + location.getAccuracy() + ";" + m_minAccuracy);
return;
}
- Location prevLocation = m_runningRecord.getPrevLocation();
if (prevLocation != null && prevLocation.distanceTo(location) < location.getAccuracy()) {
ExLog.put("Move not enough: " + location.getAccuracy() + ";" + prevLocation.distanceTo(location));
return;
m_elapsedTime.start();
m_lapTime.start();
- m_runningRecord.addRecord(new Date(), null, "");
+ Location startPoint = m_locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+
+ m_runningRecord.addRecord(new Date(), startPoint, "start");
Button startStopButton = (Button) findViewById(R.id.button_start_stop);
Button resetLapButton = (Button) findViewById(R.id.button_reset_lap);
}
private void stop() {
- m_runningRecord.addRecord(new Date(), null, "");
+ Location finishPoint = m_locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+
+ m_runningRecord.addRecord(new Date(), finishPoint, "finish");
m_elapsedTime.stop();
m_lapTime.stop();
return m_runningRecord.getNextRecord(new Date(recordTime));
}
+ public static Iterator<Record> getRecordIterator() {
+ return m_runningRecord.getIterator();
+ }
@Override
public boolean dispatchKeyEvent(KeyEvent event) {