OSDN Git Service

2009/09/24
[tokyorunners/tokyorunners.git] / src / net / kazhik / android / tokyorunners / TokyoRunners.java
1 package net.kazhik.android.tokyorunners;
2
3 import java.util.Date;
4
5 import android.app.Activity;
6 import android.app.AlertDialog;
7 import android.app.Dialog;
8 import android.content.ContentValues;
9 import android.content.Context;
10 import android.content.DialogInterface;
11 import android.content.Intent;
12 import android.content.SharedPreferences;
13 import android.database.Cursor;
14 import android.location.Location;
15 import android.location.LocationListener;
16 import android.location.LocationManager;
17 import android.location.LocationProvider;
18 import android.net.Uri;
19 import android.os.Bundle;
20 import android.os.SystemClock;
21 import android.preference.PreferenceManager;
22 import android.text.format.DateUtils;
23 import android.util.Log;
24 import android.view.GestureDetector;
25 import android.view.Menu;
26 import android.view.MenuItem;
27 import android.view.MotionEvent;
28 import android.view.View;
29 import android.view.WindowManager;
30 import android.view.View.OnClickListener;
31 import android.widget.ArrayAdapter;
32 import android.widget.Button;
33 import android.widget.Chronometer;
34 import android.widget.ListView;
35 import android.widget.TextView;
36
37 public class TokyoRunners extends Activity implements
38         LocationListener, GestureDetector.OnGestureListener {
39         
40         private SharedPreferences m_prefs;
41         private LocationManager m_locMgr;
42         private long m_startTime;
43         private Chronometer m_elapsedTime;
44         private Chronometer m_lapTime;
45         private boolean m_running = false;
46         
47         private boolean m_useGPS = false;
48         private boolean m_autosplit = false;
49         
50         private GestureDetector m_gestureDetector;
51         
52         private RunningRecord m_runningRecord;
53         
54     class StartStopButton implements OnClickListener {
55                 public void onClick(View v) {
56                         if (m_running == true) {
57                                 stop();
58                         } else {
59                                 start();
60                         }
61                 }
62     };  
63     class ResetLapButton implements OnClickListener {
64                 public void onClick(View v) {
65                         if (m_running == true) {
66                                 lap();
67                         } else {
68                                 reset();
69                         }
70                 }
71     };  
72     /** Called when the activity is first created. */
73     @Override
74     public void onCreate(Bundle savedInstanceState) {
75         super.onCreate(savedInstanceState);
76         
77         m_gestureDetector = new GestureDetector(this, this);
78         
79         if (m_gestureDetector.isLongpressEnabled() == false) {
80                 Log.d(this.getClass().getName(), "Longpress disabled");
81         }
82         setContentView(R.layout.stopwatch);
83
84         m_prefs = PreferenceManager.getDefaultSharedPreferences(this);
85         
86         m_useGPS = m_prefs.getBoolean("use_gps", true);
87         
88         if (m_useGPS) {
89                 m_locMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
90                 
91                 m_autosplit = m_prefs.getBoolean("auto_split", false);
92             if (m_autosplit) {
93                 int interval = m_prefs.getInt("split_interval", 5);
94             }
95
96         }
97         
98         m_elapsedTime = (Chronometer)findViewById(R.id.elapsed_time);
99         m_lapTime = (Chronometer)findViewById(R.id.lap_time);
100
101         m_runningRecord = new RunningRecord(getContentResolver());
102         
103         
104         Button btnStartStop = (Button)findViewById(R.id.button_start_stop);
105             btnStartStop.setOnClickListener(new StartStopButton());
106             
107         Button btnResetLap = (Button)findViewById(R.id.button_reset_lap);
108             btnResetLap.setOnClickListener(new ResetLapButton());
109             
110                 ListView lvLaptime = (ListView)findViewById(R.id.lap_history);
111         ArrayAdapter<String> arrayAdapter
112                 = new ArrayAdapter<String>(this, R.layout.laptime);
113         lvLaptime.setAdapter(arrayAdapter);
114
115         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);        
116         
117     }
118     
119     @Override
120     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
121         super.onActivityResult(requestCode, resultCode, data);
122
123         switch (requestCode) {
124         case Constants.REQUEST_CODE_SETTINGS:
125             m_useGPS = m_prefs.getBoolean("use_gps", true);
126             break;
127         case Constants.REQUEST_CODE_HISTORY:
128                 break;
129         }
130     }
131     
132     
133     @Override
134     public void onDestroy() {
135         getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);    
136         
137     }
138     @Override
139     public boolean onCreateOptionsMenu(Menu menu) {
140         menu.add(Menu.NONE, Constants.MENU_SAVE, Menu.NONE, R.string.menu_save).setIcon(android.R.drawable.ic_menu_save);
141         menu.add(Menu.NONE, Constants.MENU_HISTORY, Menu.NONE, R.string.menu_history).setIcon(R.drawable.history2);
142         menu.add(Menu.NONE, Constants.MENU_MAP, Menu.NONE, R.string.menu_map).setIcon(android.R.drawable.ic_menu_mapmode);
143         menu.add(Menu.NONE, Constants.MENU_SETTING, Menu.NONE, R.string.menu_setting).setIcon(android.R.drawable.ic_menu_preferences);
144         
145         return super.onCreateOptionsMenu(menu);
146     }
147     @Override
148     public boolean onPrepareOptionsMenu(Menu menu) {
149         menu.findItem(Constants.MENU_MAP).setEnabled(m_useGPS);
150         
151         return super.onPrepareOptionsMenu(menu);
152     }
153     
154     @Override
155     public Dialog onCreateDialog (int id) {
156         
157         AlertDialog.Builder builder = new AlertDialog.Builder(this);
158         switch (id) {
159         case Constants.DIALOG_SAVE_ID:
160                 builder.setTitle(R.string.dialog_save_title);
161                 builder.setMessage(R.string.dialog_save_message);
162                 builder.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {
163 //                              @Override
164                                 public void onClick(DialogInterface dialog, int which) {
165                                         saveRecord();
166                                         // TODO Auto-generated method stub
167                                 }
168                         });
169                 builder.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {
170 //                              @Override
171                                 public void onClick(DialogInterface dialog, int which) {
172                                         dialog.cancel();
173                                         
174                                 }
175                         });
176
177                 break;
178                 default:
179                         break;
180         }
181         
182         AlertDialog alertDialog = builder.create();
183         return alertDialog;
184     }
185
186     @Override
187     public boolean onOptionsItemSelected(MenuItem item) {
188         Intent intent;
189         switch (item.getItemId()) {
190         case Constants.MENU_SAVE:
191                 showDialog(Constants.DIALOG_SAVE_ID);
192                 break;
193         case Constants.MENU_HISTORY:
194                 intent = new Intent(this, RunningHistory.class);
195                 intent.setAction(Intent.ACTION_VIEW);
196                 intent.putExtra("files", fileList());
197                 startActivityForResult(intent, Constants.REQUEST_CODE_HISTORY);
198                 break;
199         case Constants.MENU_MAP:
200                 intent = new Intent(this, MapMode.class);
201                 intent.setAction(Intent.ACTION_VIEW);
202                 startActivity(intent);
203                 break;
204         case Constants.MENU_SETTING:
205                 intent = new Intent(this, Config.class);
206                 intent.setAction(Intent.ACTION_VIEW);
207                 startActivityForResult(intent, Constants.REQUEST_CODE_SETTINGS);
208                 break;
209         default:
210             break;
211         }
212         return false;
213     }       
214         public void onLocationChanged(Location location) {
215                 Log.d(this.getClass().getName(),
216                                 "onLocationChanged(): latitude: " + location.getLatitude() + 
217                                 "; longitude: " + location.getLongitude() );
218                 
219                 m_runningRecord.addRecord(new Date(), location);
220                 
221         float distance_km = m_runningRecord.getDistance();
222         TextView distanceView = (TextView)findViewById(R.id.distance);
223         distanceView.setText(Float.toString(distance_km));
224         
225                 
226         }
227
228         public void onProviderDisabled(String provider) {
229                 
230         }
231
232         public void onProviderEnabled(String provider) {
233                 
234         }
235
236         public void onStatusChanged(String provider, int status, Bundle extras) {
237                 String statusStr = "";
238                 switch (status) {
239                 case LocationProvider.AVAILABLE:
240                         statusStr = "Available";
241                         break;
242                 case LocationProvider.OUT_OF_SERVICE:
243                         statusStr = "Out of service";
244                         break;
245                 case LocationProvider.TEMPORARILY_UNAVAILABLE:
246                         statusStr = "Temporarily unavailable";
247                         break;
248                 default:
249                         statusStr = "Unknown status";
250                         break;
251                 }
252                 Log.d(this.getClass().getName(), "onStatusChanged(): " + statusStr);
253                 
254         }
255         private void start() {
256                 m_startTime = System.currentTimeMillis();
257                 long startTime = SystemClock.elapsedRealtime();
258         m_elapsedTime.setBase(startTime);
259         m_lapTime.setBase(startTime);
260         m_elapsedTime.start();
261         m_lapTime.start();
262         
263         if (m_useGPS) {
264             String strGpsFreq = m_prefs.getString("gps_frequency", "0");
265             int gps_freq =Integer.parseInt(strGpsFreq);
266                 m_locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, gps_freq * 1000, 1, this);
267                 
268         }
269
270         Button startStopButton = (Button)findViewById(R.id.button_start_stop);
271         Button resetLapButton = (Button)findViewById(R.id.button_reset_lap);
272                 startStopButton.setText(R.string.button_stop);
273                 resetLapButton.setText(R.string.button_lap);
274                 m_running = true;
275         }
276         private void stop() {
277                 m_elapsedTime.stop();
278                 m_lapTime.stop();
279                 
280         if (m_useGPS) {
281                 m_locMgr.removeUpdates(this);
282         }
283
284         Button startStopButton = (Button)findViewById(R.id.button_start_stop);
285         Button resetLapButton = (Button)findViewById(R.id.button_reset_lap);
286                 startStopButton.setText(R.string.button_start);
287                 resetLapButton.setText(R.string.button_reset);
288                 m_running = false;
289                 
290         }
291         private void reset() {
292                 long elapsedRealTime = SystemClock.elapsedRealtime();
293                 m_elapsedTime.setBase(elapsedRealTime);
294         m_lapTime.setBase(elapsedRealTime);
295                 
296                 ListView listLaptime = (ListView)findViewById(R.id.lap_history);
297                 ArrayAdapter<String> lapHistory = (ArrayAdapter<String>)listLaptime.getAdapter();
298                 lapHistory.clear();
299                 
300         }
301         private void lap() {
302                 long elapsedRealTime = SystemClock.elapsedRealtime();
303                 long lapTimeMillis = elapsedRealTime - m_lapTime.getBase();
304                 
305                 ListView listLaptime = (ListView)findViewById(R.id.lap_history);
306                 
307                 
308                 
309                 ArrayAdapter<String> lapHistory = (ArrayAdapter<String>)listLaptime.getAdapter();
310                 
311                 int historyCount = lapHistory.getCount() + 1;
312                 
313                 String strLaptime = "laptime " + historyCount + ": "
314                         + DateUtils.formatElapsedTime(lapTimeMillis / 1000);
315                 
316                 lapHistory.insert(strLaptime, 0);
317                 
318                 m_lapTime.setBase(elapsedRealTime);
319                 
320         }
321         
322         private void saveRecord() {
323                 if (m_running) {
324                         return;
325                 }
326                 m_runningRecord.save();
327                 
328                 /*
329                 
330         getIntent().setData(Uri.parse("content://net.kazhik.android.tokyorunners.runningrecordprovider"));
331
332         ContentValues values = new ContentValues();
333         values.put("name", "Pen");
334         values.put("description", "This is a pen");
335         getContentResolver().insert(getIntent().getData(), values);
336         Cursor cur = managedQuery(getIntent().getData(), null, null, null, null);
337         while (cur.moveToNext()) {
338             Log.d(cur.getString(1), cur.getString(2));
339         }
340 */
341         
342 /*
343                 FileOutputStream outFile = null;
344                 OutputStreamWriter stWriter = null;
345                 try {
346                     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");   
347                         outFile = openFileOutput(formatter.format(new Date(m_startTime)) + ".xml", MODE_PRIVATE);
348                         stWriter = new OutputStreamWriter(outFile);
349                         m_runningRecord.save(stWriter);
350                 } catch (IOException e) {
351                 } finally {
352                         try {
353                                 if (stWriter != null) {
354                                         stWriter.close();
355                                 }
356                                 if (outFile != null) {
357                                         outFile.close();
358                                 }
359                         } catch (IOException e) {
360                         }
361                 }
362 */
363         }
364         
365     @Override
366     public boolean onTouchEvent(MotionEvent event) {
367                 Log.d(this.getClass().getName(), "onTouchEvent():" );
368         if (m_gestureDetector.onTouchEvent(event)) {
369                 return true;
370         }
371         return super.onTouchEvent(event);
372     }
373
374         
375         public boolean onDown(MotionEvent arg0) {
376                 Log.d(this.getClass().getName(), "onDown():" );
377                 return false;
378         }
379         public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
380                         float arg3) {
381                 Log.d(this.getClass().getName(), "onFling():" );
382                 return false;
383         }
384         public void onLongPress(MotionEvent arg0) {
385                 Log.d(this.getClass().getName(), "onLongPress():" );
386                 
387         Intent intent = new Intent(TokyoRunners.this, MapMode.class);
388         intent.setAction(Intent.ACTION_VIEW);
389         startActivity(intent);
390                 
391         }
392         public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
393                         float arg3) {
394                 Log.d(this.getClass().getName(), "onScroll():" );
395                 return false;
396         }
397         public void onShowPress(MotionEvent arg0) {
398                 Log.d(this.getClass().getName(), "onShowPress():" );
399         }
400         public boolean onSingleTapUp(MotionEvent arg0) {
401                 Log.d(this.getClass().getName(), "onSingleTapUp():" );
402                 return false;
403         }
404 }