--- android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2010/05/11 05:38:18 725 +++ android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2010/09/08 06:03:45 1027 @@ -4,6 +4,7 @@ import java.util.List; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; @@ -18,7 +19,6 @@ import android.os.Handler; import android.os.Message; -import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; @@ -47,13 +47,14 @@ public static final int OPTIONS_MAP = 2003; public static final int OPTIONS_GPSINFO = 2004; - - - public static final int DLG_PROGRESS = 3001; public static final int DLG_STATIONNAME = 3002; + + public static final int GPS_TIMEOUT_MS = 15000; //how long are we willing to wait for gps fix -in milliseconds + + static enum LookupMethod { ByLocation, ByName, @@ -69,7 +70,8 @@ StationsFetchedHandler stationsFetched = new StationsFetchedHandler(); GeoPair location = new GeoPair(); - + + boolean isLaunchedforShortcut; boolean isRunning = false; List stations = new ArrayList(); @@ -111,6 +113,8 @@ listType = (WelcomeScreen.ListType) getIntent().getSerializableExtra("type"); setTitle(); + isLaunchedforShortcut = getIntent().getBooleanExtra("shortcut", false); + if (savedInstanceState == null) { @@ -118,8 +122,8 @@ case ListNearest: startLookup(); break; - case ListSearch: - this.showDialogSafe(DLG_STATIONNAME); + case ListSearch: + showDialog(DLG_STATIONNAME); break; case ListFavorites: startFavoriteLookup(); @@ -135,6 +139,34 @@ } } + + + + + @Override + protected void onStart() { + super.onStart(); + ProviderFactory.purgeOldEntries(); + } + + + + + @Override + protected void onDestroy() { + super.onDestroy(); + + isRunning = false; + + if (locationLookup != null) { + locationLookup.stopSearch(); + } + if (findStationsTask != null) { + findStationsTask.cancel(true); + } + } + + protected void setTitle() { String dialogTitle = getResources().getString(app_name); switch (listType) { @@ -155,47 +187,7 @@ } - - /* these 3 dialogs helper functions are very rude and ugly hack - * to remove these auto-reported exceptions - * - android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@436aaef8 is not valid; is your activity running? - * - java.lang.IllegalArgumentException: View not attached to window manager - */ - - public void showDialogSafe(int id) { - try { - showDialog(id); - } catch (Exception e) { - Log.e("StationList", "showDialog failed", e); - } - } - - public void dismissDialogSafe(int id) { - try { - dismissDialog(id); - } catch (Exception e) { - Log.e("StationList", "dismissDialog failed", e); - } - } - public void dismissDialogSafe(Dialog dlg) { - try { - dlg.dismiss(); - } catch (Exception e) { - Log.e("StationList", "dismissDialog failed", e); - } - } - - public void builderShowSafe(AlertDialog.Builder builder) { - try { - builder.show(); - } catch (Exception e) { - Log.e("StationList", "builder.show() failed", e); - } - } - /* EOF rude and ugly dialog hack */ - - @Override public void onSaveInstanceState(Bundle outState) @@ -254,7 +246,7 @@ message.append( getString(stationlist_nolocation) ); } - MessageBox.showMessage(this, message.toString()); + MessageBox.showMessage(this, message.toString(), false); break; default: retval = super.onOptionsItemSelected(item); @@ -354,9 +346,16 @@ StationBean station = stations.get(position); - Intent intent = new Intent(this, DepartureList.class); - intent.putExtra("stationbean", station); - startActivity(intent); + if (isLaunchedforShortcut == true) { + Intent i = new Intent(); + i.putExtra("station", station); + setResult(Activity.RESULT_OK, i); + finish(); + } else { + Intent intent = new Intent(this, DepartureList.class); + intent.putExtra("stationbean", station); + startActivity(intent); + } } ///////////////////////////////////////////////////////////// @@ -365,15 +364,15 @@ public void startLookup() { isRunning = true; dialogMessage = getString( stationlist_waitforlocation ); - showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); locationLookup.locateStations(); - stationsFetched.sendEmptyMessageDelayed(LOCATIONFIXTIMEOUT, 20000); + stationsFetched.sendEmptyMessageDelayed(LOCATIONFIXTIMEOUT, GPS_TIMEOUT_MS); } void startNameSearch(String name) { dialogMessage = getString( stationlist_findbyname ); - showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByName(name); @@ -385,7 +384,7 @@ if (favorites.size() > 0) { dialogMessage = getString( stationlist_loadfavorites ); - showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByIds( favorites.toString() ); @@ -400,7 +399,7 @@ void startLocatorTask() { dialogMessage = getString( stationlist_findingnearby ); - showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByLocation( locationLookup.getLocation() ); @@ -417,7 +416,7 @@ switch (msg.what) { case GOTLOCATION: - dismissDialogSafe(DLG_PROGRESS); + dismissDialog(DLG_PROGRESS); startLocatorTask(); location = GeoPair.fromLocation( locationLookup.getLocation() ); @@ -425,8 +424,9 @@ break; case NOPROVIDER: - dismissDialogSafe(DLG_PROGRESS); - MessageBox.showMessage(StationList.this, getString(stationlist_nolocationprovider) ); + dismissDialog(DLG_PROGRESS); + MessageBox.showMessage(StationList.this, getString(stationlist_nolocationprovider), true ); + //StationList.this.finish(); break; case LOCATIONFIXTIMEOUT: if (isRunning) { @@ -434,7 +434,7 @@ if (locationLookup.hasLocation()) { stationsFetched.sendEmptyMessage( GOTLOCATION ); } else { - dismissDialogSafe(DLG_PROGRESS); + dismissDialog(DLG_PROGRESS); AlertDialog.Builder builder = new AlertDialog.Builder(StationList.this); builder.setMessage( getString( stationlist_gpstimeout) ); @@ -451,7 +451,7 @@ dialog.dismiss(); } }); - builderShowSafe(builder); // builder.show() + builder.show(); } } @@ -465,7 +465,6 @@ class FindStationsTask extends AsyncTask { LookupMethod method = LookupMethod.MethodNone; - boolean success; String name; Location loc; String ids; @@ -500,16 +499,16 @@ switch (method) { case ByLocation: - success = stationProvider.lookupStations(loc); + stations = stationProvider.lookupStations(loc); break; case ByName: - success = stationProvider.lookupStationsByName(name); + stations = stationProvider.lookupStationsByName(name); break; case ByList: - success = stationProvider.lookupStationsByIds(ids); + stations = stationProvider.lookupStationsByIds(ids); break; default: - success = false; // not possible + stations = null; // not possible } @@ -519,19 +518,21 @@ @Override protected void onPostExecute(Void result) { super.onPostExecute(result); - dismissDialogSafe(dialog); + dialog.dismiss(); - if (success) { - if (stationProvider.getStations().size() == 0) { + if (stations != null) { + if (stations.size() == 0) { showMessageAndClose(getString(stationlist_nostations)); } - stations = stationProvider.getStations(); + + StationList.this.getListView().invalidateViews(); adapter.setStations( stations ); + } else { //communication or parse errors AlertDialog.Builder builder = new AlertDialog.Builder(StationList.this); - builder.setMessage(getString(stationlist_nearbyerror)); + builder.setMessage(getString(stationlist_fetcherror)); builder.setCancelable(true); builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -571,10 +572,11 @@ builder.setNegativeButton(getString(generic_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); + StationList.this.finish(); } }); - builderShowSafe(builder); // builder.show() + builder.show(); } } }