/[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 1028 - (hide annotations) (download)
Wed Sep 8 06:25:13 2010 UTC (13 years, 8 months ago) by torben
File size: 9598 byte(s)
Do the cleanup in onCreate before starting any background job - so the cleanup and background work doesn't collide
1 torben 237 package dk.thoerup.traininfo;
2    
3 torben 835 import static dk.thoerup.traininfo.R.string.departurelist_fetchdepartures;
4     import static dk.thoerup.traininfo.R.string.departurelist_fetcharrivals;
5     import static dk.thoerup.traininfo.R.string.generic_cancel;
6     import static dk.thoerup.traininfo.R.string.generic_retry;
7    
8    
9 torben 237 import java.text.NumberFormat;
10    
11 torben 981
12 torben 336 import android.app.AlertDialog;
13 torben 237 import android.app.Dialog;
14     import android.app.ListActivity;
15     import android.app.ProgressDialog;
16 torben 336 import android.content.DialogInterface;
17 torben 237 import android.content.Intent;
18 torben 239 import android.net.Uri;
19 torben 237 import android.os.AsyncTask;
20     import android.os.Bundle;
21 torben 630 import android.util.Log;
22 torben 982 import android.view.Menu;
23     import android.view.MenuItem;
24 torben 237 import android.view.View;
25 torben 835 import android.view.View.OnClickListener;
26     import android.widget.Button;
27 torben 237 import android.widget.ListView;
28     import android.widget.TextView;
29 torben 255 import dk.thoerup.traininfo.provider.DepartureProvider;
30 torben 253 import dk.thoerup.traininfo.provider.ProviderFactory;
31 torben 245 import dk.thoerup.traininfo.util.MessageBox;
32 torben 237
33     public class DepartureList extends ListActivity {
34    
35     public static final int DLG_PROGRESS = 1;
36 torben 982 static final int MENU_MAP = 100;
37     static final int MENU_NOTIFICATIONS = 101;
38 torben 237
39 torben 362
40 torben 237 DepartureListAdapter adapter;
41     DepartureProvider provider;
42 torben 981 DepartureBean departures;
43 torben 237
44 torben 257 int selectedItemId;
45     //DepartureBean currentDeparture;
46 torben 237
47     ProgressDialog pgDialog;
48 torben 362
49 torben 238 DepartureFetcher fetcher;
50 torben 557
51     StationBean station;
52 torben 238
53 torben 835 boolean arrival = false;
54 torben 981
55 torben 1017 int commFailCounter = 0;
56    
57 torben 237 @Override
58     protected void onCreate(Bundle savedInstanceState) {
59     super.onCreate(savedInstanceState);
60     setContentView(R.layout.departurelist);
61    
62     adapter = new DepartureListAdapter(this);
63     setListAdapter(adapter);
64    
65     Intent launchedBy = getIntent();
66 torben 557
67     station = (StationBean) launchedBy.getSerializableExtra("stationbean");
68 torben 239
69 torben 557 ((TextView) findViewById(R.id.stationName)).setText( station.getName() );
70 torben 317
71 torben 557
72     ((TextView) findViewById(R.id.stationAddr)).setText( station.getAddress() );
73 torben 237
74 torben 835 final Button departureBtn = (Button) findViewById(R.id.departurebtn);
75     final Button arrivalBtn = (Button) findViewById(R.id.arrivalbtn);
76 torben 294
77 torben 835 departureBtn.setOnClickListener( new OnClickListener() {
78     @Override
79     public void onClick(View arg0) {
80     arrivalBtn.setBackgroundResource(R.drawable.custom_button);
81     departureBtn.setBackgroundResource(R.drawable.custom_button_hilight);
82     arrival = false;
83     startDepartureFetcher();
84     }
85     });
86     arrivalBtn.setOnClickListener( new OnClickListener() {
87     @Override
88     public void onClick(View arg0) {
89     arrivalBtn.setBackgroundResource(R.drawable.custom_button_hilight);
90     departureBtn.setBackgroundResource(R.drawable.custom_button);
91     arrival = true;
92     startDepartureFetcher();
93     }
94     });
95    
96    
97    
98    
99 torben 982 // findViewById(R.id.header).setOnClickListener( mapLauncher );
100 torben 237
101 torben 557 int distance = station.getDistance();
102 torben 742 if (distance != 0) {
103     NumberFormat format = NumberFormat.getNumberInstance();
104     format.setMaximumFractionDigits(1);
105     format.setMinimumFractionDigits(1);
106 torben 575
107 torben 742 ((TextView) findViewById(R.id.stationDistance)).setText( format.format((double)distance/1000.0) + " km." );
108     } else {
109     ((TextView) findViewById(R.id.stationDistance)).setVisibility(View.GONE);
110     }
111 torben 552
112 torben 1028 ProviderFactory.purgeOldEntries(); //cleanup before fetching more data
113    
114 torben 557 if (station.isRegional() == false && station.isSTrain() == false) {
115 torben 552 getListView().setVisibility( View.GONE );
116     findViewById(R.id.metroonly).setVisibility( View.VISIBLE );
117 torben 835 departureBtn.setVisibility( View.GONE );
118     arrivalBtn.setVisibility(View.GONE);
119 torben 552
120 torben 257 } else {
121 torben 552 provider = ProviderFactory.getDepartureProvider();
122    
123     if (savedInstanceState == null) {
124     startDepartureFetcher();
125     } else {
126 torben 981 departures = (DepartureBean) savedInstanceState.getSerializable("departures");
127 torben 990
128     if ( (departures != null) && (departures.entries != null) ) {
129     adapter.setDepartures(departures.entries);
130     }
131 torben 982 selectedItemId = savedInstanceState.getInt("selectedItemId");
132    
133     if ( hasNotifications() ) {
134     findViewById(R.id.notifIcon).setVisibility(View.VISIBLE);
135     }
136    
137 torben 552 }
138 torben 257 }
139 torben 237 }
140    
141 torben 982 boolean hasNotifications() {
142     return (departures != null && departures.notifications.size() > 0);
143     }
144    
145 torben 243 @Override
146     public void onSaveInstanceState(Bundle outState)
147     {
148 torben 257 if (pgDialog != null && pgDialog.isShowing())
149     dismissDialog(DLG_PROGRESS);
150 torben 362
151 torben 257 outState.putInt("selectedItemId", selectedItemId);
152    
153 torben 981 outState.putSerializable("departures", departures);
154 torben 243 }
155 torben 918
156    
157 torben 243
158 torben 237 @Override
159 torben 918 protected void onDestroy() {
160     super.onDestroy();
161    
162     if (fetcher != null) {
163     fetcher.cancel(true);
164     }
165     }
166    
167     @Override
168 torben 237 protected void onListItemClick(ListView l, View v, int position, long id) {
169     super.onListItemClick(l, v, position, id);
170 torben 362
171     selectedItemId = position;
172 torben 364
173 torben 981 DepartureEntry dep = departures.entries.get(selectedItemId);
174 torben 237
175 torben 362 Intent intent = new Intent(this, TimetableList.class);
176 torben 364 intent.putExtra("departure", dep);
177 torben 362
178     startActivity(intent);
179    
180 torben 237 }
181    
182    
183     @Override
184     protected void onPrepareDialog(int id, Dialog dialog) {
185     super.onPrepareDialog(id, dialog);
186 torben 257
187 torben 237 switch (id) {
188     case DLG_PROGRESS:
189     pgDialog = (ProgressDialog) dialog;
190 torben 835 int messageId = arrival == false ? departurelist_fetchdepartures : departurelist_fetcharrivals;
191     pgDialog.setMessage( getString(messageId) );
192 torben 237 break;
193     }
194     }
195    
196     @Override
197     protected Dialog onCreateDialog(int id) {
198     switch (id) {
199     case DLG_PROGRESS:
200 torben 835
201 torben 237 ProgressDialog dlg = new ProgressDialog(this);
202     dlg.setCancelable(true);
203 torben 362 return dlg;
204 torben 237 default:
205     return super.onCreateDialog(id);
206     }
207     }
208 torben 982
209    
210 torben 336
211 torben 982
212    
213     @Override
214     public boolean onCreateOptionsMenu(Menu menu) {
215     MenuItem item;
216 torben 985
217     item = menu.add(0, MENU_MAP, 0, getString(R.string.departurelist_showonmap) );
218 torben 982 item.setIcon(android.R.drawable.ic_menu_mapmode);
219    
220 torben 985 item = menu.add(0, MENU_NOTIFICATIONS, 0, getString(R.string.departurelist_notifications) );
221 torben 982 item.setIcon(android.R.drawable.ic_menu_info_details);
222    
223    
224     boolean notifEnabled = hasNotifications();
225     item.setEnabled(notifEnabled);
226    
227    
228     return true;
229     }
230    
231     @Override
232     public boolean onOptionsItemSelected(MenuItem item) {
233     boolean res;
234     switch(item.getItemId()) {
235     case MENU_MAP:
236     Uri uri = Uri.parse("geo:" + station.getLatitude() + "," + station.getLongitude());
237     startActivity( new Intent(Intent.ACTION_VIEW, uri));
238     res = true;
239     break;
240     case MENU_NOTIFICATIONS:
241     Intent i = new Intent(this,dk.thoerup.traininfo.NotificationList.class);
242     i.putExtra(NotificationList.EXTRA_NOTIFICATIONS, departures.notifications);
243     startActivity(i);
244     res = true;
245     break;
246     default:
247     res = super.onOptionsItemSelected(item);
248     }
249     return res;
250     }
251    
252 torben 336 void startDepartureFetcher() {
253     showDialog(DLG_PROGRESS);
254     fetcher = new DepartureFetcher();
255 torben 557 fetcher.execute(station.getId());
256 torben 336 }
257 torben 316
258 torben 237 class DialogDismisser implements View.OnClickListener {
259    
260     Dialog dlg;
261     public DialogDismisser(Dialog d) {
262     dlg = d;
263     }
264    
265     @Override
266     public void onClick(View v) {
267     if (dlg.isShowing())
268     dlg.dismiss();
269 torben 365 }
270     }
271 torben 238
272 torben 982 /*View.OnClickListener mapLauncher = new View.OnClickListener() {
273 torben 239 @Override
274 torben 557 public void onClick(View v) {
275     Uri uri = Uri.parse("geo:" + station.getLatitude() + "," + station.getLongitude());
276 torben 239 startActivity( new Intent(Intent.ACTION_VIEW, uri));
277     }
278 torben 982 };*/
279 torben 336
280    
281 torben 238
282 torben 310 class DepartureFetcher extends AsyncTask<Integer, Void, Void> {
283 torben 238
284 torben 365
285 torben 238 @Override
286     protected void onPostExecute(Void result) {
287     super.onPostExecute(result);
288    
289 torben 336
290 torben 238 pgDialog.dismiss();
291    
292 torben 1007 if (departures != null) {
293 torben 1017 commFailCounter = 0;
294 torben 917 DepartureList.this.getListView().setVisibility(View.GONE); //Experimental, inspired by http://osdir.com/ml/Android-Developers/2010-04/msg01198.html
295 torben 981 adapter.setDepartures(departures.entries);
296 torben 917 DepartureList.this.getListView().setVisibility(View.VISIBLE);
297    
298 torben 982
299     if ( hasNotifications() ) {
300     findViewById(R.id.notifIcon).setVisibility(View.VISIBLE);
301     }
302    
303 torben 981 if (departures.entries.size() == 0) {
304 torben 906 MessageBox.showMessage(DepartureList.this, "No departures found", true);
305 torben 319 }
306     } else { // communication or parse error
307 torben 1017 commFailCounter++;
308 torben 336 AlertDialog.Builder builder = new AlertDialog.Builder(DepartureList.this);
309     builder.setMessage("Error finding departures");
310     builder.setCancelable(true);
311 torben 1017 if (commFailCounter < 3) {
312     builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() {
313     public void onClick(DialogInterface dialog, int id) {
314     dialog.dismiss();
315     startDepartureFetcher();
316    
317     }
318     });
319     }
320 torben 561 builder.setNegativeButton(getString(generic_cancel), new DialogInterface.OnClickListener() {
321 torben 336 public void onClick(DialogInterface dialog, int id) {
322     dialog.dismiss();
323 torben 843 DepartureList.this.finish();
324 torben 336 }
325 torben 630 });
326    
327     try {
328     builder.show();
329     } catch (android.view.WindowManager.BadTokenException e) {
330     Log.i("DepartureList", "BadTokenException"); // this can happen if the user switched away from this activity, while doInBackground was running
331     }
332 torben 319 }
333 torben 238 }
334    
335     @Override
336 torben 310 protected Void doInBackground(Integer... params) {
337 torben 1007 departures = provider.lookupDepartures(params[0], DepartureList.this.arrival);
338 torben 238 return null;
339     }
340    
341     }
342 torben 237 }

  ViewVC Help
Powered by ViewVC 1.1.20