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

  ViewVC Help
Powered by ViewVC 1.1.20