OSDN Git Service

several bugs fixed
authorkazhik <kazhik@gmail.com>
Tue, 20 Oct 2009 01:07:59 +0000 (10:07 +0900)
committerkazhik <kazhik@gmail.com>
Tue, 20 Oct 2009 01:07:59 +0000 (10:07 +0900)
12 files changed:
AndroidManifest.xml
res/layout/history.xml
res/layout/laptime.xml
res/layout/runningrecord.xml
res/layout/stopwatch.xml
res/values/strings.xml
src/net/kazhik/android/tokyorunners/Constants.java
src/net/kazhik/android/tokyorunners/MapMode.java
src/net/kazhik/android/tokyorunners/RunningHistory.java
src/net/kazhik/android/tokyorunners/RunningRecord.java
src/net/kazhik/android/tokyorunners/RunningRecordProvider.java
src/net/kazhik/android/tokyorunners/TokyoRunners.java

index 35d455f..0ae54bd 100755 (executable)
@@ -4,9 +4,10 @@
        android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name"
                android:debuggable="true">
-               <provider android:name="RunningRecordProvider"
+               <provider android:name=".RunningRecordProvider"
                        android:authorities="net.kazhik.android.tokyorunners.runningrecordprovider" />
                <activity android:name=".TokyoRunners" android:label="@string/app_name"
+                   android:launchMode="singleTask"
                        android:screenOrientation="portrait">
                        <intent-filter>
                                <action android:name="android.intent.action.MAIN" />
@@ -25,5 +26,6 @@
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
+       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-sdk android:minSdkVersion="3" />
 </manifest> 
\ No newline at end of file
index 5760ef6..84fd5a6 100644 (file)
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
+  android:background="#696969"
   android:layout_width="wrap_content"
-  android:layout_height="wrap_content">
+  android:layout_height="fill_parent">
   
   <ListView
       android:id="@+id/android:list"
index 80c4ace..a0880de 100755 (executable)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <TextView
   xmlns:android="http://schemas.android.com/apk/res/android"
+  android:background="#696969"
   android:textSize="24dp"
   android:textColor="#7CFC00"
   android:gravity="right"
index 744c33f..57253df 100644 (file)
@@ -3,6 +3,7 @@
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:textSize="24dp"
   android:layout_width="fill_parent"
+  android:textColor="#7CFC00"
   
   android:layout_height="50dp">
 </TextView>
index e69e5bd..e7c3a39 100755 (executable)
@@ -56,7 +56,7 @@
                android:layout_height="fill_parent" android:layout_width="fill_parent"
                android:paddingLeft="5dp" android:paddingRight="5dp"
                android:scrollbarSize="5dp" android:scrollbarStyle="outsideOverlay"
-               android:choiceMode="none" android:clickable="false" />
+               android:choiceMode="none" android:clickable="false" android:longClickable="true" />
 
 
 </RelativeLayout>
index fcdd037..84781a0 100755 (executable)
     <string name="menu_setting">Settings</string>
     <string name="menu_save">Save</string>
     <string name="menu_history">History</string>
+    
+    <string name="contextmenu_deletethis">Delete this</string>
+    <string name="contextmenu_deleteall">Delete all</string>
+    
     <string name="dialog_save_title">Save record</string>
     <string name="dialog_save_message">Do you want to save the current record?</string>
+    <string name="dialog_exit_title">Exit</string>
+    <string name="dialog_exit_message">Do you want to exit?</string>
     <string name="dialog_yes">Yes</string>
     <string name="dialog_no">No</string>
     <string name="provider_record">net.kazhik.android.tokyorunners.runningrecordprovider</string>
index c856a13..060f200 100755 (executable)
@@ -10,6 +10,7 @@ public class Constants {
        public static final int MENU_HISTORY = Menu.FIRST + 5;\r
 \r
        public static final int DIALOG_SAVE_ID = 4000;\r
+       public static final int DIALOG_EXIT_ID = 4001;\r
        \r
        public static final int REQUEST_CODE_SETTINGS = 1000;\r
        public static final int REQUEST_CODE_HISTORY = 1001;\r
index 16d45bc..f6b13f6 100755 (executable)
@@ -16,9 +16,6 @@ import android.graphics.Paint;
 import android.graphics.Path;\r
 import android.graphics.Point;\r
 import android.graphics.drawable.Drawable;\r
-import android.location.Location;\r
-import android.location.LocationListener;\r
-import android.location.LocationManager;\r
 import android.os.Bundle;\r
 import android.preference.PreferenceManager;\r
 import android.util.Log;\r
@@ -26,6 +23,8 @@ import android.view.GestureDetector;
 import android.view.Menu;\r
 import android.view.MenuItem;\r
 import android.view.MotionEvent;\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
@@ -38,10 +37,8 @@ import com.google.android.maps.Overlay;
 import com.google.android.maps.OverlayItem;\r
 import com.google.android.maps.Projection;\r
 \r
-public class MapMode extends MapActivity implements\r
-       LocationListener, GestureDetector.OnGestureListener {\r
+public class MapMode extends MapActivity {\r
        \r
-       private LocationManager m_locMgr;\r
        private MapController m_controller;\r
        private GestureDetector m_gestureDetector;\r
        private List<Overlay> m_mapOverlays;\r
@@ -81,7 +78,6 @@ public class MapMode extends MapActivity implements
                        }\r
                }\r
        }\r
-\r
        private class SplitPoints extends ItemizedOverlay<OverlayItem> {\r
 \r
                private ArrayList<OverlayItem> m_splitpoints = new ArrayList<OverlayItem>();\r
@@ -116,6 +112,22 @@ public class MapMode extends MapActivity implements
         }\r
 \r
        }\r
+       private class GestureListener extends GestureDetector.SimpleOnGestureListener {\r
+               public void onLongPress(MotionEvent arg0) {\r
+                       Log.d(this.getClass().getName(), "onLongPress():" );\r
+                       \r
+                       finish();\r
+                       \r
+               }\r
+\r
+               public boolean onDoubleTap(MotionEvent arg0) {\r
+                       Log.d(this.getClass().getName(), "onDoubleTap():" );\r
+                       return false;\r
+               }\r
+\r
+               \r
+       }\r
+\r
 \r
        private BroadcastReceiver m_runningRecordReceiver = new BroadcastReceiver() {\r
                @Override\r
@@ -167,20 +179,15 @@ public class MapMode extends MapActivity implements
     @Override\r
     public void onCreate(Bundle savedInstanceState) {\r
         super.onCreate(savedInstanceState);\r
+        \r
+        m_gestureDetector = new GestureDetector(new GestureListener());\r
+        \r
         setContentView(R.layout.map);\r
 \r
-        m_gestureDetector = new GestureDetector(this, this);\r
-\r
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r
         \r
-        /*\r
-        String strGpsFreq = prefs.getString("gps_frequency", "0");\r
-        int gps_freq =Integer.parseInt(strGpsFreq);\r
+        m_userName = prefs.getString("your_name", "Koike Kazuhiko");\r
         \r
-        m_locMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE);\r
-       m_locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, gps_freq * 1000, 1, this);\r
-       */\r
-       \r
         MapView m = (MapView)findViewById(R.id.mapview);\r
         m.setBuiltInZoomControls(true);\r
 \r
@@ -197,7 +204,15 @@ public class MapMode extends MapActivity implements
 \r
         m_mapOverlays.add(myLocationOverlay);\r
         \r
-        m_userName = prefs.getString("your_name", "Koike Kazuhiko");\r
+               m.setOnLongClickListener(new OnLongClickListener() {\r
+                       @Override\r
+                       public boolean onLongClick(View v) {\r
+                               Log.d(this.getClass().getName(), "onLongClick():" );\r
+                               finish();\r
+                               return false;\r
+                       }\r
+               });\r
+\r
         \r
         long recTime = 0;\r
         Record rec;\r
@@ -229,7 +244,6 @@ public class MapMode extends MapActivity implements
     \r
     @Override\r
     public void onStop() {\r
-               //m_locMgr.removeUpdates(this);\r
                super.onStop();\r
     }\r
     @Override\r
@@ -268,58 +282,5 @@ public class MapMode extends MapActivity implements
         }\r
         return false;\r
     }       \r
-       public void onLocationChanged(Location location) {\r
-               Log.d(this.getClass().getName(),\r
-                               "onLocationChanged(): latitude: " + location.getLatitude() + \r
-                               "; longitude: " + location.getLongitude() );\r
-               \r
-               GeoPoint gp = new GeoPoint((int)(location.getLatitude()*1E6),\r
-                                        (int)(location.getLongitude()*1E6));\r
-               m_controller.animateTo(gp);\r
 \r
-               if (m_prevPoint != null) {\r
-                       RunningRoute route = new RunningRoute(m_prevPoint, gp);\r
-                       m_mapOverlays.add(route);\r
-               }\r
-               m_prevPoint = gp;\r
-       }\r
-\r
-       public void onProviderDisabled(String provider) {\r
-       }\r
-\r
-       public void onProviderEnabled(String provider) {\r
-       }\r
-\r
-       public void onStatusChanged(String provider, int status, Bundle extras) {\r
-       }\r
-\r
-       public boolean onDown(MotionEvent e) {\r
-               return false;\r
-       }\r
-\r
-       public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,\r
-                       float velocityY) {\r
-               return false;\r
-       }\r
-\r
-       public void onLongPress(MotionEvent e) {\r
-               Log.d(this.getClass().getName(), "onLongPress()" );\r
-       Intent intent = new Intent(this, TokyoRunners.class);\r
-       intent.setAction(Intent.ACTION_VIEW);\r
-       startActivity(intent);\r
-               \r
-       }\r
-\r
-       public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,\r
-                       float distanceY) {\r
-               return false;\r
-       }\r
-\r
-       public void onShowPress(MotionEvent e) {\r
-               \r
-       }\r
-\r
-       public boolean onSingleTapUp(MotionEvent e) {\r
-               return false;\r
-       }\r
 }\r
index 6773d75..ccc581c 100644 (file)
@@ -9,29 +9,58 @@ import java.util.HashMap;
 import android.app.ListActivity;
 import android.content.Intent;
 import android.database.Cursor;
-import android.net.Uri;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.ContextMenu;
+import android.view.GestureDetector;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.View.OnCreateContextMenuListener;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
+import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.AdapterView.OnItemClickListener;
 
 public class RunningHistory extends ListActivity implements OnItemClickListener {
-    SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-    HashMap<Long, Long> m_startTimeMap = new HashMap<Long, Long>();
+    private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+    private HashMap<Long, Long> m_startTimeMap = new HashMap<Long, Long>();
+       private GestureDetector m_gestureDetector;
+       
+       private static final int MENU_DELETE_THIS = Menu.FIRST + 200;
+       private static final int MENU_DELETE_ALL = Menu.FIRST + 201;
+       
+       private class GestureListener extends GestureDetector.SimpleOnGestureListener {
+               public void onLongPress(MotionEvent arg0) {
+                       Log.d(this.getClass().getName(), "onLongPress():" );
+                       
+                       
+               }
+
+               public boolean onDoubleTap(MotionEvent arg0) {
+                       Log.d(this.getClass().getName(), "onDoubleTap():" );
+                       return false;
+               }
+
+               
+       }
+    
+    
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        
+        m_gestureDetector = new GestureDetector(new GestureListener());
+        
         setContentView(R.layout.history);
 
-        Uri uri = Uri.parse(
-                       "content://net.kazhik.android.tokyorunners.runningrecordprovider/runningrecords");
         String[] columns = {
                        RunningRecordProvider.START_TIME,
                        RunningRecordProvider.DISTANCE};
         String sortOrder = RunningRecordProvider.CURRENT_TIME + " desc";
-        Cursor cursor = managedQuery(uri, columns, null, null, sortOrder);
+        Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns, null, null, sortOrder);
 
         if (cursor == null) {
                return;
@@ -58,13 +87,12 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                history.add(rowStr.toString());
         }
         ArrayAdapter<String> historyArray = new ArrayAdapter<String>(this, R.layout.runningrecord, history);
-/*
-        String[] files = getIntent().getStringArrayExtra("files");
-        ArrayAdapter<String> historyArray = new ArrayAdapter<String>(this, R.layout.runningrecord, files);
-*/
+
         setListAdapter(historyArray);
         
         getListView().setOnItemClickListener(this);
+        
+               getListView().setOnCreateContextMenuListener(this);
     }
 
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@@ -81,7 +109,9 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                        String dateStr = splitStr[0] + " " + splitStr[1];
                        Date startTime = m_startTimeFormatter.parse(dateStr);
                        
+                       returnData.setAction(Intent.ACTION_VIEW);
                        returnData.putExtra("startTime", m_startTimeMap.get(startTime.getTime()));
+                       
                        setResult(RESULT_OK, returnData);
                } catch (ParseException e) {
                        e.printStackTrace();
@@ -89,6 +119,50 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                finish();
                
        }
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+               Log.d(this.getClass().getName(), "onTouchEvent():" + event.getAction() );
+        if (m_gestureDetector.onTouchEvent(event)) {
+               return true;
+        }
+        return super.onTouchEvent(event);
+    }
 
+       public void onCreateContextMenu(ContextMenu menu, View v,
+                       ContextMenuInfo menuInfo) {
+               super.onCreateContextMenu(menu, v, menuInfo);
+        menu.add(0, MENU_DELETE_THIS, 0, R.string.contextmenu_deletethis);
+               menu.add(0, MENU_DELETE_ALL, 0, R.string.contextmenu_deleteall);
+       }
+
+       public boolean onContextItemSelected(MenuItem item) {
+               AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
+        ArrayAdapter<String> historyArray = (ArrayAdapter<String>)getListAdapter();
+        int position = info.position;
+               switch (item.getItemId()) {
+               case MENU_DELETE_THIS:
+                       try {
+                               String[] splitStr = historyArray.getItem(position).split(" ");
+                               String dateStr = splitStr[0] + " " + splitStr[1];
+                               Date startTime = m_startTimeFormatter.parse(dateStr);
+                               
+                       String selection = RunningRecordProvider.START_TIME + " = ?";
+                       String[] selectionArgs = {Long.toString(startTime.getTime())};
+                       
+                       getContentResolver().delete(RunningRecordProvider.REC_URI, selection, selectionArgs);
+
+                               historyArray.remove(historyArray.getItem(position));
+                       } catch (ParseException e) {
+                               e.printStackTrace();
+                       }
+                       return true;
+               case MENU_DELETE_ALL:
+               getContentResolver().delete(RunningRecordProvider.REC_URI, null, null);
+                       historyArray.clear();
+                       return true;
+               default:
+                       return super.onContextItemSelected(item);
+               }
+       }
 
 }
index 763ca5f..c4c8e72 100755 (executable)
@@ -11,6 +11,7 @@ import android.content.ContentResolver;
 import android.content.ContentValues;\r
 import android.location.Location;\r
 import android.net.Uri;\r
+import android.util.Log;\r
 \r
 public class RunningRecord {\r
        private ArrayList<Record> m_recordList = new ArrayList<Record>();\r
@@ -43,6 +44,13 @@ public class RunningRecord {
                return pointName;\r
        }\r
        \r
+       public void clearRecord() {\r
+               m_distance = 0;\r
+               m_lastSplit = 0;\r
+               m_prevLocation = null;\r
+               m_recordList.clear();\r
+       }\r
+       \r
        public Record getRecord(Date date) {\r
                Record rec = null;\r
                \r
@@ -128,20 +136,24 @@ public class RunningRecord {
        \r
                for (Iterator<Record> it = m_recordList.iterator(); it.hasNext();) {\r
                        Record rec = (Record)it.next();\r
-                       \r
                ContentValues values = new ContentValues();\r
-               values.put("start_datetime", startTime);\r
-               values.put("current_datetime", rec.getTime());\r
-               values.put("point_name", rec.getName());\r
+               values.put(RunningRecordProvider.START_TIME, startTime);\r
+               values.put(RunningRecordProvider.CURRENT_TIME, rec.getTime());\r
+               values.put(RunningRecordProvider.POINT_NAME, rec.getName());\r
                if (rec.hasLocation()) {\r
                        if (prevLocation != null) {\r
                                distance += prevLocation.distanceTo(rec.getLocation());\r
                        }\r
-                       values.put("distance", distance);\r
-                       values.put("latitude", rec.getLatitudeE6());\r
-                       values.put("longitude", rec.getLongitudeE6());\r
+                       values.put(RunningRecordProvider.DISTANCE, distance);\r
+               }\r
+               values.put(RunningRecordProvider.LATITUDE, rec.getLatitudeE6());\r
+               values.put(RunningRecordProvider.LONGITUDE, rec.getLongitudeE6());\r
+               \r
+               try {\r
+                       m_contentResolver.insert(RunningRecordProvider.REC_URI, values);\r
+               } catch (IllegalArgumentException e) {\r
+                       Log.e(this.getClass().getName(), e.getMessage());\r
                }\r
-               m_contentResolver.insert(Uri.parse("content://net.kazhik.android.tokyorunners.runningrecordprovider/runningrecords"), values);\r
                }\r
        }\r
 \r
index fc15e07..077a91d 100755 (executable)
@@ -23,6 +23,13 @@ public class RunningRecordProvider extends ContentProvider {
        public static final String LATITUDE = "latitude";\r
        public static final String LONGITUDE = "longitude";\r
        \r
+    private static final String AUTHORITY = "net.kazhik.android.tokyorunners.runningrecordprovider";\r
+    private static final String REC_PATH = "runningrecords";\r
+    public static final Uri REC_URI = Uri.parse("content://" + AUTHORITY + "/" + REC_PATH);\r
+    private static final int RUNNING_RECORDS = 1;\r
+    private DatabaseHelper m_databaseHelper;\r
+    private UriMatcher m_uriMatcher;\r
+\r
     private static class DatabaseHelper extends SQLiteOpenHelper {\r
         DatabaseHelper(Context context) {\r
             super(context, DB_NAME, null, 1);\r
@@ -48,16 +55,12 @@ public class RunningRecordProvider extends ContentProvider {
         }\r
     }\r
     \r
-    private static final String AUTHORITY = "net.kazhik.android.tokyorunners.runningrecordprovider";\r
-    private static final int RUNNING_RECORDS = 1;\r
-    private DatabaseHelper m_databaseHelper;\r
-    private UriMatcher m_uriMatcher;\r
 \r
        @Override\r
        public boolean onCreate() {\r
         m_databaseHelper = new DatabaseHelper(getContext());\r
         m_uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);\r
-        m_uriMatcher.addURI(AUTHORITY, TABLE_NAME, RUNNING_RECORDS);\r
+        m_uriMatcher.addURI(AUTHORITY, REC_PATH, RUNNING_RECORDS);\r
         return true;\r
        }\r
 \r
index 63723f5..df75e79 100755 (executable)
@@ -1,6 +1,5 @@
 package net.kazhik.android.tokyorunners;
 
-import java.util.ArrayList;
 import java.util.Date;
 
 import android.app.Activity;
@@ -11,23 +10,26 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.database.Cursor;
+import android.location.GpsStatus;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.location.LocationProvider;
-import android.net.Uri;
 import android.os.Bundle;
+import android.os.Debug;
 import android.os.SystemClock;
 import android.preference.PreferenceManager;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.GestureDetector;
+import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
 import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.Chronometer;
@@ -36,7 +38,6 @@ import android.widget.TextView;
 
 
 public class TokyoRunners extends Activity implements
-//     LocationListener, GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener  {
        LocationListener {
        
        private SharedPreferences m_prefs;
@@ -52,14 +53,11 @@ public class TokyoRunners extends Activity implements
        
        private static RunningRecord m_runningRecord;
        
-       class GestureListener extends GestureDetector.SimpleOnGestureListener {
+       private class GestureListener extends GestureDetector.SimpleOnGestureListener {
                public void onLongPress(MotionEvent arg0) {
                        Log.d(this.getClass().getName(), "onLongPress():" );
                        
-               Intent intent = new Intent(TokyoRunners.this, MapMode.class);
-               intent.setAction(Intent.ACTION_VIEW);
-               startActivity(intent);
-                       
+                       showMap();
                }
 
                public boolean onDoubleTap(MotionEvent arg0) {
@@ -93,34 +91,47 @@ public class TokyoRunners extends Activity implements
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         
-//        m_gestureDetector = new GestureDetector(this);
         m_gestureDetector = new GestureDetector(new GestureListener());
         
-        if (m_gestureDetector.isLongpressEnabled() == false) {
-               Log.d(this.getClass().getName(), "Longpress disabled");
-        } else {
-               Log.d(this.getClass().getName(), "Longpress enabled");
-        }
-        
-        
         setContentView(R.layout.stopwatch);
         
+        Debug.startMethodTracing("tokyorunners");
+        
         m_runningRecord = new RunningRecord(getContentResolver());
        
         m_prefs = PreferenceManager.getDefaultSharedPreferences(this);
         m_useGPS = m_prefs.getBoolean("use_gps", true);
         if (m_useGPS) {
                m_locMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
+
+            String strGpsFreq = m_prefs.getString("gps_frequency", "0");
+            int gps_freq =Integer.parseInt(strGpsFreq);
+               m_locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, gps_freq * 1000, 0, this);
                
                m_autosplit = m_prefs.getBoolean("auto_split", false);
             if (m_autosplit) {
-               
                 int interval = Integer.parseInt(m_prefs.getString("split_interval", "5"));
-                //int interval = m_prefs.getInt("split_interval", 5);
-                
                m_runningRecord.setSplitInterval(interval);
-               
             }
+            
+                       m_locMgr.addGpsStatusListener(new GpsStatus.Listener() {
+                               @Override
+                               public void onGpsStatusChanged(int event) {
+                                       switch (event) {
+                                       case GpsStatus.GPS_EVENT_STARTED:
+                                               Log.d(this.getClass().getName(), "GPS_EVENT_STARTED" );
+                                               break;
+                                       case GpsStatus.GPS_EVENT_STOPPED:
+                                               Log.d(this.getClass().getName(), "GPS_EVENT_STOPPED" );
+                                               break;
+                                       case GpsStatus.GPS_EVENT_FIRST_FIX:
+                                               Log.d(this.getClass().getName(), "GPS_EVENT_FIRST_FIX" );
+                                               break;
+                                       default:
+                                               break;
+                                       }
+                               }
+                       });
 
         }
         
@@ -138,12 +149,20 @@ public class TokyoRunners extends Activity implements
         ArrayAdapter<String> arrayAdapter
                = new ArrayAdapter<String>(this, R.layout.laptime);
         lvLaptime.setAdapter(arrayAdapter);
+        
+               lvLaptime.setOnLongClickListener(new OnLongClickListener() {
+                       @Override
+                       public boolean onLongClick(View v) {
+                               Log.d(this.getClass().getName(), "onLongClick():" );
+                               showMap();
+                               return false;
+                       }
+               });
 
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);        
         
         
     }
-    
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
@@ -162,18 +181,25 @@ public class TokyoRunners extends Activity implements
         }
     }
     
+    private void showMap() {
+       Intent intent = new Intent(TokyoRunners.this, MapMode.class);
+       intent.setAction(Intent.ACTION_VIEW);
+       startActivity(intent);
+               
+       
+    }
+
     private void readHistory(long startTime) {
 
-        Uri uri = Uri.parse(
-                       "content://net.kazhik.android.tokyorunners.runningrecordprovider/runningrecords");
         String[] columns = {
                        RunningRecordProvider.CURRENT_TIME,
                        RunningRecordProvider.LATITUDE,
-                       RunningRecordProvider.LONGITUDE};
+                       RunningRecordProvider.LONGITUDE,
+                       RunningRecordProvider.POINT_NAME};
         String selection = RunningRecordProvider.START_TIME + " = ?";
         String[] selectionArgs = {Long.toString(startTime)};
         String sortOrder = RunningRecordProvider.CURRENT_TIME + " desc";
-        Cursor cursor = managedQuery(uri, columns, selection, selectionArgs, sortOrder);
+        Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns, selection, selectionArgs, sortOrder);
         if (cursor == null) {
                return;
         }
@@ -182,33 +208,36 @@ public class TokyoRunners extends Activity implements
                ListView listLaptime = (ListView)findViewById(R.id.lap_history);
                ArrayAdapter<String> lapHistory = (ArrayAdapter<String>)listLaptime.getAdapter();
         
-        ArrayList<String> history = new ArrayList<String>();
        long currentTime = 0;
        int latitude = 0;
        int longitude = 0;
+       String pointName = "";
        long prevTime = startTime;
        
                TextView elapsedTimeView = (TextView)findViewById(R.id.elapsed_time);
                TextView lapTimeView = (TextView)findViewById(R.id.lap_time);
                TextView distanceView = (TextView)findViewById(R.id.distance); 
        
-               String laptimeLabel = "";
-               String laptimeValue = "";
         while (cursor.moveToNext()) {
                currentTime = cursor.getLong(cursor.getColumnIndex(RunningRecordProvider.CURRENT_TIME));
                latitude = cursor.getInt(cursor.getColumnIndex(RunningRecordProvider.LATITUDE));
                longitude = cursor.getInt(cursor.getColumnIndex(RunningRecordProvider.LONGITUDE));
+               pointName = cursor.getString(cursor.getColumnIndex(RunningRecordProvider.POINT_NAME));
                
                // Laptime History
                Location loc = new Location(LocationManager.GPS_PROVIDER);
                loc.setLatitude(latitude);
                loc.setLongitude(longitude);
-               m_runningRecord.addRecord(new Date(currentTime), loc, "");
-               if (currentTime != startTime) {
-                       int historyCount = lapHistory.getCount() + 1;
-                       laptimeLabel = "laptime " + historyCount + ": ";
-                       laptimeValue = DateUtils.formatElapsedTime((currentTime - prevTime) / 1000);
-                       lapHistory.insert(laptimeLabel + laptimeValue, 0);
+               m_runningRecord.addRecord(new Date(currentTime), loc, pointName);
+                       if (pointName.length() == 0) {
+                       } else if (currentTime != startTime) {
+                       StringBuffer strBuff = new StringBuffer();
+                               strBuff.append(pointName);
+                       strBuff.append(": ");
+                       strBuff.append(DateUtils.formatElapsedTime((currentTime - startTime) / 1000));
+                       strBuff.append("/");
+                       strBuff.append(DateUtils.formatElapsedTime((currentTime - prevTime) / 1000));
+                       lapHistory.insert(strBuff.toString(), 0);
                }
                
                prevTime = currentTime;
@@ -216,7 +245,7 @@ public class TokyoRunners extends Activity implements
        // Elapsed Time
                elapsedTimeView.setText(DateUtils.formatElapsedTime((currentTime - startTime) / 1000));
        // Latest Laptime
-               lapTimeView.setText(laptimeValue);
+               lapTimeView.setText(DateUtils.formatElapsedTime((currentTime - prevTime) / 1000));
                // Distance
                distanceView.setText(Float.toString(m_runningRecord.getDistance()));
        
@@ -226,6 +255,15 @@ public class TokyoRunners extends Activity implements
     @Override
     public void onDestroy() {
         getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        
+        m_runningRecord = null;
+        
+        Debug.stopMethodTracing();
+        
+        if (m_useGPS) {
+               m_locMgr.removeUpdates(this);
+        }
+
         super.onDestroy();
        
     }
@@ -269,6 +307,25 @@ public class TokyoRunners extends Activity implements
                        });
 
                break;
+       case Constants.DIALOG_EXIT_ID:
+               builder.setTitle(R.string.dialog_exit_title);
+               builder.setMessage(R.string.dialog_exit_message);
+               builder.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {
+                               @Override
+                               public void onClick(DialogInterface dialog, int which) {
+                                       finish();
+
+                               }
+                       });
+               builder.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {
+                               @Override
+                               public void onClick(DialogInterface dialog, int which) {
+                                       dialog.cancel();
+                                       
+                               }
+                       });
+
+               break;
                default:
                        break;
        }
@@ -305,12 +362,16 @@ public class TokyoRunners extends Activity implements
         return false;
     }       
        public void onLocationChanged(Location location) {
-               Log.d(this.getClass().getName(),
-                               "onLocationChanged(): latitude: " + location.getLatitude() + 
-                               "; longitude: " + location.getLongitude() );
+               ExLog.put(location.toString());
                
-               Date currentDate = new Date();
-               String pointName = m_runningRecord.addRecord(currentDate, location, "");
+               // 走行中なら記録を追加
+               if (m_running == false) {
+                       return;
+               }
+               Date recDate = new Date(location.getTime());
+               String pointName = m_runningRecord.addRecord(recDate, location, "");
+               
+               // ラップタイム履歴
                if (pointName.length() > 0) {
                        String laptimeStr = calculateSplitAndLap();
                        
@@ -321,24 +382,28 @@ public class TokyoRunners extends Activity implements
                        
                        lapHistory.insert(strLaptime, 0);
                }
-               
+
+               // 距離
         float distance_km = m_runningRecord.getDistance();
         
         TextView distanceView = (TextView)findViewById(R.id.distance);
         distanceView.setText(Float.toString(distance_km));
-               
+
+        // MapModeに通知
        Intent intent = new Intent("RunningRecord");
-       intent.putExtra("RunningRecord", currentDate.getTime());
+       intent.putExtra("RunningRecord", location.getTime());
        sendBroadcast(intent);
 
        }
 
        public void onProviderDisabled(String provider) {
-               
+               Log.d(this.getClass().getName(), "onProviderDisabled()");
+               m_locMgr.removeUpdates(this);
+
        }
 
        public void onProviderEnabled(String provider) {
-               
+               Log.d(this.getClass().getName(), "onProviderEnabled()");
        }
 
        public void onStatusChanged(String provider, int status, Bundle extras) {
@@ -368,8 +433,7 @@ public class TokyoRunners extends Activity implements
         if (m_useGPS) {
             String strGpsFreq = m_prefs.getString("gps_frequency", "0");
             int gps_freq =Integer.parseInt(strGpsFreq);
-               //int gps_freq = m_prefs.getInt("gps_frequency", 0);
-               m_locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, gps_freq * 1000, 1, this);
+               m_locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, gps_freq * 1000, 0, this);
                
         }
                m_runningRecord.addRecord(new Date(), null, "");                
@@ -385,15 +449,11 @@ public class TokyoRunners extends Activity implements
                m_running = true;
        }
        private void stop() {
-               lap();
+               m_runningRecord.addRecord(new Date(), null, "");
                
                m_elapsedTime.stop();
                m_lapTime.stop();
                
-        if (m_useGPS) {
-               m_locMgr.removeUpdates(this);
-        }
-
         Button startStopButton = (Button)findViewById(R.id.button_start_stop);
         Button resetLapButton = (Button)findViewById(R.id.button_reset_lap);
                startStopButton.setText(R.string.button_start);
@@ -413,6 +473,8 @@ public class TokyoRunners extends Activity implements
                ListView listLaptime = (ListView)findViewById(R.id.lap_history);
                ArrayAdapter<String> lapHistory = (ArrayAdapter<String>)listLaptime.getAdapter();
                lapHistory.clear();
+               
+               m_runningRecord.clearRecord();
        }
        private String calculateSplitAndLap() {
                long elapsedRealTime = SystemClock.elapsedRealtime();
@@ -431,18 +493,13 @@ public class TokyoRunners extends Activity implements
                
                ListView listLaptime = (ListView)findViewById(R.id.lap_history);
                
-               m_runningRecord.addRecord(new Date(), null, "");                
-               
                ArrayAdapter<String> lapHistory = (ArrayAdapter<String>)listLaptime.getAdapter();
                
-               int historyCount = lapHistory.getCount() + 1;
+               String strLapNo = Integer.toString(lapHistory.getCount() + 1);
                
-               String strLaptime = "---: " + laptimeStr;
-               if (m_autosplit) {
-//                     strLaptime = "laptime " + historyCount + ": " + laptimeStr; // TODO: i18n
-               }
+               lapHistory.insert(strLapNo + ": " + laptimeStr, 0);
                
-               lapHistory.insert(strLaptime, 0);
+               m_runningRecord.addRecord(new Date(), null, strLapNo);
                
        }
 
@@ -462,29 +519,33 @@ public class TokyoRunners extends Activity implements
                }
                m_runningRecord.save();
                
-/*
-               FileOutputStream outFile = null;
-               OutputStreamWriter stWriter = null;
-               try {
-                   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");   
-                       outFile = openFileOutput(formatter.format(new Date(m_startTime)) + ".xml", MODE_PRIVATE);
-                       stWriter = new OutputStreamWriter(outFile);
-                       m_runningRecord.save(stWriter);
-               } catch (IOException e) {
-               } finally {
-                       try {
-                               if (stWriter != null) {
-                                       stWriter.close();
-                               }
-                               if (outFile != null) {
-                                       outFile.close();
-                               }
-                       } catch (IOException e) {
+       }
+       
+       @Override
+       public boolean dispatchKeyEvent(KeyEvent event) {
+               Log.d(this.getClass().getName(), "dispatchKeyEvent():"
+                               + event.toString());
+               if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER
+                               && event.getAction() == KeyEvent.ACTION_DOWN) {
+                       if (m_running == true) {
+                               stop();
+                       } else {
+                               start();
                        }
                }
-*/
+               return super.dispatchKeyEvent(event);
+       }
+    @Override
+       public boolean onKeyDown(int keyCode, KeyEvent event) {
+               Log.d(this.getClass().getName(), "onKeyDown():" + keyCode );
+               if (keyCode == KeyEvent.KEYCODE_BACK){
+                       showDialog(Constants.DIALOG_EXIT_ID);
+                       return true;
+               }
+               
+       return super.onKeyDown(keyCode, event);
+               
        }
-       
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
@@ -495,50 +556,4 @@ public class TokyoRunners extends Activity implements
         return super.onTouchEvent(event);
     }
     
-       /*
-       public boolean onDown(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onDown():" );
-               return false;
-       }
-       public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
-                       float arg3) {
-               Log.d(this.getClass().getName(), "onFling():" );
-               return false;
-       }
-       public void onLongPress(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onLongPress():" );
-               
-       Intent intent = new Intent(TokyoRunners.this, MapMode.class);
-       intent.setAction(Intent.ACTION_VIEW);
-       startActivity(intent);
-               
-       }
-       public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
-                       float arg3) {
-               Log.d(this.getClass().getName(), "onScroll():" );
-               return false;
-       }
-       public void onShowPress(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onShowPress():" );
-       }
-       public boolean onSingleTapUp(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onSingleTapUp():" );
-               return false;
-       }
-
-       public boolean onDoubleTap(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onDoubleTap():" );
-               return false;
-       }
-
-       public boolean onDoubleTapEvent(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onDoubleTapEvent():" );
-               return false;
-       }
-
-       public boolean onSingleTapConfirmed(MotionEvent arg0) {
-               Log.d(this.getClass().getName(), "onSingleTapConfirmed():" );
-               return false;
-       }
-       */
 }
\ No newline at end of file