/[projects]/android/TrainInfo/src/dk/thoerup/traininfo/DepartureList.java
ViewVC logotype

Annotation of /android/TrainInfo/src/dk/thoerup/traininfo/DepartureList.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1152 - (hide annotations) (download)
Fri Oct 1 17:57:02 2010 UTC (13 years, 8 months ago) by torben
File size: 15025 byte(s)
Show map at a reasonable zoom level
1 torben 237 package dk.thoerup.traininfo;
2    
3 torben 1053 import static dk.thoerup.traininfo.R.string.departurelist_fetcharrivals;
4 torben 835 import static dk.thoerup.traininfo.R.string.departurelist_fetchdepartures;
5     import static dk.thoerup.traininfo.R.string.generic_cancel;
6     import static dk.thoerup.traininfo.R.string.generic_retry;
7    
8 torben 237 import java.text.NumberFormat;
9    
10 torben 336 import android.app.AlertDialog;
11 torben 237 import android.app.Dialog;
12     import android.app.ListActivity;
13     import android.app.ProgressDialog;
14 torben 336 import android.content.DialogInterface;
15 torben 237 import android.content.Intent;
16 torben 1053 import android.graphics.Typeface;
17 torben 239 import android.net.Uri;
18 torben 237 import android.os.AsyncTask;
19     import android.os.Bundle;
20 torben 630 import android.util.Log;
21 torben 982 import android.view.Menu;
22     import android.view.MenuItem;
23 torben 237 import android.view.View;
24 torben 835 import android.view.View.OnClickListener;
25     import android.widget.Button;
26 torben 237 import android.widget.ListView;
27 torben 1053 import android.widget.TableLayout;
28     import android.widget.TableRow;
29 torben 237 import android.widget.TextView;
30 torben 1066 import dk.thoerup.android.traininfo.common.DepartureBean;
31     import dk.thoerup.android.traininfo.common.DepartureEntry;
32     import dk.thoerup.android.traininfo.common.MetroBean;
33     import dk.thoerup.android.traininfo.common.MetroBean.MetroEntry;
34     import dk.thoerup.android.traininfo.common.StationBean.StationEntry;
35 torben 255 import dk.thoerup.traininfo.provider.DepartureProvider;
36 torben 1053 import dk.thoerup.traininfo.provider.MetroProvider;
37 torben 253 import dk.thoerup.traininfo.provider.ProviderFactory;
38 torben 245 import dk.thoerup.traininfo.util.MessageBox;
39 torben 237
40     public class DepartureList extends ListActivity {
41    
42     public static final int DLG_PROGRESS = 1;
43 torben 982 static final int MENU_MAP = 100;
44     static final int MENU_NOTIFICATIONS = 101;
45 torben 1057 static final int MENU_METROMAP= 102;
46 torben 237
47 torben 362
48 torben 237 DepartureListAdapter adapter;
49     DepartureProvider provider;
50 torben 981 DepartureBean departures;
51 torben 237
52 torben 1053 MetroBean metroBean;
53     MetroProvider metro;
54    
55 torben 257 int selectedItemId;
56     //DepartureBean currentDeparture;
57 torben 237
58     ProgressDialog pgDialog;
59 torben 362
60 torben 238 DepartureFetcher fetcher;
61 torben 1053 MetroFetcher metroFetcher;
62 torben 557
63 torben 1066 StationEntry station;
64 torben 238
65 torben 835 boolean arrival = false;
66 torben 981
67 torben 1017 int commFailCounter = 0;
68    
69 torben 237 @Override
70     protected void onCreate(Bundle savedInstanceState) {
71     super.onCreate(savedInstanceState);
72     setContentView(R.layout.departurelist);
73    
74     adapter = new DepartureListAdapter(this);
75     setListAdapter(adapter);
76    
77     Intent launchedBy = getIntent();
78 torben 557
79 torben 1066 station = (StationEntry) launchedBy.getSerializableExtra("stationbean");
80 torben 239
81 torben 557 ((TextView) findViewById(R.id.stationName)).setText( station.getName() );
82 torben 317
83 torben 557
84     ((TextView) findViewById(R.id.stationAddr)).setText( station.getAddress() );
85 torben 237
86 torben 835 final Button departureBtn = (Button) findViewById(R.id.departurebtn);
87     final Button arrivalBtn = (Button) findViewById(R.id.arrivalbtn);
88 torben 1044 final Button metroBtn = (Button) findViewById(R.id.metrobtn);
89 torben 294
90 torben 1053 final View metroView = findViewById(R.id.metroonly);
91    
92 torben 835 departureBtn.setOnClickListener( new OnClickListener() {
93     @Override
94     public void onClick(View arg0) {
95     arrivalBtn.setBackgroundResource(R.drawable.custom_button);
96     departureBtn.setBackgroundResource(R.drawable.custom_button_hilight);
97 torben 1044 metroBtn.setBackgroundResource(R.drawable.custom_button);
98 torben 1053
99     getListView().setVisibility( View.VISIBLE );
100     metroView.setVisibility( View.GONE );
101 torben 835 arrival = false;
102     startDepartureFetcher();
103     }
104     });
105     arrivalBtn.setOnClickListener( new OnClickListener() {
106     @Override
107     public void onClick(View arg0) {
108     arrivalBtn.setBackgroundResource(R.drawable.custom_button_hilight);
109     departureBtn.setBackgroundResource(R.drawable.custom_button);
110 torben 1044 metroBtn.setBackgroundResource(R.drawable.custom_button);
111 torben 1053
112     getListView().setVisibility( View.VISIBLE );
113     metroView.setVisibility( View.GONE );
114 torben 835 arrival = true;
115     startDepartureFetcher();
116     }
117     });
118    
119 torben 1044 metroBtn.setOnClickListener( new OnClickListener() {
120     @Override
121     public void onClick(View v) {
122     arrivalBtn.setBackgroundResource(R.drawable.custom_button);
123     departureBtn.setBackgroundResource(R.drawable.custom_button);
124     metroBtn.setBackgroundResource(R.drawable.custom_button_hilight);
125 torben 1053
126     getListView().setVisibility( View.GONE );
127     metroView.setVisibility( View.VISIBLE );
128     startMetroFetcher();
129 torben 1044 }
130     });
131 torben 835
132    
133    
134 torben 1044
135 torben 982 // findViewById(R.id.header).setOnClickListener( mapLauncher );
136 torben 237
137 torben 1066 int distance = station.getCalcdist();
138 torben 742 if (distance != 0) {
139     NumberFormat format = NumberFormat.getNumberInstance();
140     format.setMaximumFractionDigits(1);
141     format.setMinimumFractionDigits(1);
142 torben 575
143 torben 742 ((TextView) findViewById(R.id.stationDistance)).setText( format.format((double)distance/1000.0) + " km." );
144     } else {
145     ((TextView) findViewById(R.id.stationDistance)).setVisibility(View.GONE);
146     }
147 torben 552
148 torben 1028 ProviderFactory.purgeOldEntries(); //cleanup before fetching more data
149 torben 1044
150     Log.e("Station", station.toCSV() );
151    
152     if (station.isMetro() == false) {
153     metroBtn.setVisibility( View.GONE );
154     }
155 torben 1028
156 torben 1053 metro = ProviderFactory.getMetroProvider();
157    
158 torben 1066 if (station.isRegional() == false && station.isStrain() == false) {
159 torben 552 getListView().setVisibility( View.GONE );
160 torben 1053 metroView.setVisibility( View.VISIBLE );
161    
162 torben 835 departureBtn.setVisibility( View.GONE );
163     arrivalBtn.setVisibility(View.GONE);
164 torben 1044 metroBtn.setVisibility( View.GONE );
165 torben 552
166 torben 1053 if (savedInstanceState == null) {
167     startMetroFetcher();
168     } else {
169     metroBean = (MetroBean) savedInstanceState.getSerializable("metro");
170     loadMetroData();
171     }
172    
173 torben 257 } else {
174 torben 552 provider = ProviderFactory.getDepartureProvider();
175    
176     if (savedInstanceState == null) {
177     startDepartureFetcher();
178     } else {
179 torben 981 departures = (DepartureBean) savedInstanceState.getSerializable("departures");
180 torben 990
181     if ( (departures != null) && (departures.entries != null) ) {
182     adapter.setDepartures(departures.entries);
183     }
184 torben 982 selectedItemId = savedInstanceState.getInt("selectedItemId");
185    
186     if ( hasNotifications() ) {
187     findViewById(R.id.notifIcon).setVisibility(View.VISIBLE);
188     }
189    
190 torben 552 }
191 torben 257 }
192 torben 237 }
193    
194 torben 982 boolean hasNotifications() {
195     return (departures != null && departures.notifications.size() > 0);
196     }
197    
198 torben 243 @Override
199     public void onSaveInstanceState(Bundle outState)
200     {
201 torben 257 if (pgDialog != null && pgDialog.isShowing())
202     dismissDialog(DLG_PROGRESS);
203 torben 362
204 torben 257 outState.putInt("selectedItemId", selectedItemId);
205    
206 torben 981 outState.putSerializable("departures", departures);
207 torben 1053 outState.putSerializable("metro", metroBean);
208 torben 243 }
209 torben 918
210    
211 torben 243
212 torben 237 @Override
213 torben 918 protected void onDestroy() {
214     super.onDestroy();
215    
216     if (fetcher != null) {
217     fetcher.cancel(true);
218     }
219 torben 1053
220     if (metroFetcher != null) {
221     metroFetcher.cancel(true);
222     }
223 torben 918 }
224    
225     @Override
226 torben 237 protected void onListItemClick(ListView l, View v, int position, long id) {
227     super.onListItemClick(l, v, position, id);
228 torben 362
229     selectedItemId = position;
230 torben 364
231 torben 981 DepartureEntry dep = departures.entries.get(selectedItemId);
232 torben 237
233 torben 362 Intent intent = new Intent(this, TimetableList.class);
234 torben 364 intent.putExtra("departure", dep);
235 torben 362
236     startActivity(intent);
237    
238 torben 237 }
239    
240    
241     @Override
242     protected void onPrepareDialog(int id, Dialog dialog) {
243     super.onPrepareDialog(id, dialog);
244 torben 257
245 torben 237 switch (id) {
246     case DLG_PROGRESS:
247     pgDialog = (ProgressDialog) dialog;
248 torben 835 int messageId = arrival == false ? departurelist_fetchdepartures : departurelist_fetcharrivals;
249     pgDialog.setMessage( getString(messageId) );
250 torben 237 break;
251     }
252     }
253    
254     @Override
255     protected Dialog onCreateDialog(int id) {
256     switch (id) {
257     case DLG_PROGRESS:
258 torben 835
259 torben 237 ProgressDialog dlg = new ProgressDialog(this);
260     dlg.setCancelable(true);
261 torben 362 return dlg;
262 torben 237 default:
263     return super.onCreateDialog(id);
264     }
265     }
266 torben 982
267    
268 torben 336
269 torben 982
270    
271     @Override
272     public boolean onCreateOptionsMenu(Menu menu) {
273     MenuItem item;
274 torben 985
275     item = menu.add(0, MENU_MAP, 0, getString(R.string.departurelist_showonmap) );
276 torben 982 item.setIcon(android.R.drawable.ic_menu_mapmode);
277    
278 torben 985 item = menu.add(0, MENU_NOTIFICATIONS, 0, getString(R.string.departurelist_notifications) );
279 torben 1057 item.setIcon(android.R.drawable.ic_menu_info_details);
280 torben 982
281     boolean notifEnabled = hasNotifications();
282     item.setEnabled(notifEnabled);
283    
284 torben 1057 if (station.isMetro()) {
285     item = menu.add(0, MENU_METROMAP, 0, "Metro" ); //TODO:translate!?!
286     item.setIcon(android.R.drawable.ic_menu_mapmode);
287     }
288    
289 torben 982
290     return true;
291     }
292    
293     @Override
294     public boolean onOptionsItemSelected(MenuItem item) {
295     boolean res;
296     switch(item.getItemId()) {
297     case MENU_MAP:
298 torben 1152 Uri uri = Uri.parse("geo:" + station.getLatitude() + "," + station.getLongitude() + "?z=16");
299 torben 982 startActivity( new Intent(Intent.ACTION_VIEW, uri));
300     res = true;
301     break;
302     case MENU_NOTIFICATIONS:
303     Intent i = new Intent(this,dk.thoerup.traininfo.NotificationList.class);
304     i.putExtra(NotificationList.EXTRA_NOTIFICATIONS, departures.notifications);
305     startActivity(i);
306     res = true;
307     break;
308 torben 1057 case MENU_METROMAP:
309     Intent metroMap = new Intent(this,dk.thoerup.traininfo.MetroMap.class);
310     startActivity(metroMap);
311     res = true;
312     break;
313 torben 982 default:
314     res = super.onOptionsItemSelected(item);
315     }
316     return res;
317     }
318    
319 torben 336 void startDepartureFetcher() {
320     showDialog(DLG_PROGRESS);
321     fetcher = new DepartureFetcher();
322 torben 557 fetcher.execute(station.getId());
323 torben 336 }
324 torben 316
325 torben 1053 void startMetroFetcher() {
326     showDialog(DLG_PROGRESS);
327     metroFetcher = new MetroFetcher();
328     metroFetcher.execute(station.getId());
329     }
330    
331 torben 237 class DialogDismisser implements View.OnClickListener {
332    
333     Dialog dlg;
334     public DialogDismisser(Dialog d) {
335     dlg = d;
336     }
337    
338     @Override
339     public void onClick(View v) {
340     if (dlg.isShowing())
341     dlg.dismiss();
342 torben 365 }
343     }
344 torben 238
345 torben 982 /*View.OnClickListener mapLauncher = new View.OnClickListener() {
346 torben 239 @Override
347 torben 557 public void onClick(View v) {
348     Uri uri = Uri.parse("geo:" + station.getLatitude() + "," + station.getLongitude());
349 torben 239 startActivity( new Intent(Intent.ACTION_VIEW, uri));
350     }
351 torben 982 };*/
352 torben 336
353    
354 torben 238
355 torben 310 class DepartureFetcher extends AsyncTask<Integer, Void, Void> {
356 torben 238
357     @Override
358     protected void onPostExecute(Void result) {
359     super.onPostExecute(result);
360    
361 torben 336
362 torben 238 pgDialog.dismiss();
363    
364 torben 1007 if (departures != null) {
365 torben 1017 commFailCounter = 0;
366 torben 917 DepartureList.this.getListView().setVisibility(View.GONE); //Experimental, inspired by http://osdir.com/ml/Android-Developers/2010-04/msg01198.html
367 torben 981 adapter.setDepartures(departures.entries);
368 torben 917 DepartureList.this.getListView().setVisibility(View.VISIBLE);
369    
370 torben 982
371     if ( hasNotifications() ) {
372     findViewById(R.id.notifIcon).setVisibility(View.VISIBLE);
373     }
374    
375 torben 981 if (departures.entries.size() == 0) {
376 torben 906 MessageBox.showMessage(DepartureList.this, "No departures found", true);
377 torben 319 }
378     } else { // communication or parse error
379 torben 1017 commFailCounter++;
380 torben 336 AlertDialog.Builder builder = new AlertDialog.Builder(DepartureList.this);
381     builder.setMessage("Error finding departures");
382     builder.setCancelable(true);
383 torben 1017 if (commFailCounter < 3) {
384     builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() {
385     public void onClick(DialogInterface dialog, int id) {
386     dialog.dismiss();
387     startDepartureFetcher();
388    
389     }
390     });
391     }
392 torben 561 builder.setNegativeButton(getString(generic_cancel), new DialogInterface.OnClickListener() {
393 torben 336 public void onClick(DialogInterface dialog, int id) {
394     dialog.dismiss();
395 torben 843 DepartureList.this.finish();
396 torben 336 }
397 torben 630 });
398    
399     try {
400     builder.show();
401     } catch (android.view.WindowManager.BadTokenException e) {
402     Log.i("DepartureList", "BadTokenException"); // this can happen if the user switched away from this activity, while doInBackground was running
403     }
404 torben 319 }
405 torben 238 }
406    
407     @Override
408 torben 310 protected Void doInBackground(Integer... params) {
409 torben 1007 departures = provider.lookupDepartures(params[0], DepartureList.this.arrival);
410 torben 238 return null;
411     }
412    
413     }
414 torben 1053
415     public void loadMetroData() {
416     ((TextView) findViewById(R.id.operations)).setText( metroBean.operationInfo );
417     ((TextView) findViewById(R.id.plan)).setText( metroBean.plan );
418    
419    
420     TableLayout table = (TableLayout) findViewById(R.id.metrotable);
421     table.removeAllViews();
422    
423     TableRow head = new TableRow(this);
424    
425     TextView h1 = new TextView(this);
426     h1.setText("Metro");
427 torben 1072 h1.setTextSize(16);
428 torben 1053 h1.setTypeface( Typeface.defaultFromStyle(Typeface.BOLD));
429    
430    
431     TableRow.LayoutParams params = new TableRow.LayoutParams();
432     params.span = 2;
433     head.addView(h1, params);
434    
435 torben 1055
436    
437 torben 1053 TextView h2 = new TextView(this);
438 torben 1072 h2.setTextSize(16);
439 torben 1053 h2.setTypeface( Typeface.defaultFromStyle(Typeface.BOLD));
440 torben 1055 h2.setText("Om minutter");
441    
442 torben 1072 params = new TableRow.LayoutParams();
443     params.weight = 2;
444 torben 1055 head.addView(h2,params);
445 torben 1053
446    
447    
448     table.addView(head);
449    
450     for (MetroEntry entry : metroBean.entries) {
451     TableRow row = new TableRow(this);
452    
453     Log.e("Test", "" + entry.destination);
454    
455     TextView v1 = new TextView(this);
456 torben 1072 v1.setTextSize(16);
457     v1.setText( entry.metro );
458 torben 1053 row.addView(v1);
459    
460     TextView v2 = new TextView(this);
461 torben 1072 v2.setTextSize(16);
462 torben 1053 v2.setText( entry.destination );
463     row.addView(v2);
464 torben 1055
465 torben 1053 TextView v3 = new TextView(this);
466 torben 1072 v3.setTextSize(16);
467 torben 1053 v3.setText( entry.minutes );
468     row.addView(v3);
469    
470     table.addView(row);
471    
472     }
473     findViewById(R.id.rootView).requestLayout();
474     }
475    
476     class MetroFetcher extends AsyncTask<Integer, Void, Void> {
477    
478     @Override
479     protected void onPostExecute(Void result) {
480     super.onPostExecute(result);
481    
482    
483    
484     pgDialog.dismiss();
485    
486     if (metroBean != null) {
487     loadMetroData();
488     } else { // communication or parse error
489     commFailCounter++;
490     AlertDialog.Builder builder = new AlertDialog.Builder(DepartureList.this);
491     builder.setMessage("Error finding metro data");
492     builder.setCancelable(true);
493     if (commFailCounter < 3) {
494     builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() {
495     public void onClick(DialogInterface dialog, int id) {
496     dialog.dismiss();
497     startMetroFetcher();
498    
499     }
500     });
501     }
502     builder.setNegativeButton(getString(generic_cancel), new DialogInterface.OnClickListener() {
503     public void onClick(DialogInterface dialog, int id) {
504     dialog.dismiss();
505     DepartureList.this.finish();
506     }
507     });
508    
509     try {
510     builder.show();
511     } catch (android.view.WindowManager.BadTokenException e) {
512     Log.i("DepartureList", "BadTokenException"); // this can happen if the user switched away from this activity, while doInBackground was running
513     }
514     }
515     }
516    
517     @Override
518     protected Void doInBackground(Integer... params) {
519     metroBean = metro.lookupMetroInfo(params[0]);
520     return null;
521     }
522    
523     }
524    
525 torben 237 }

  ViewVC Help
Powered by ViewVC 1.1.20