--- android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2010/07/11 15:15:04 983 +++ android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2010/09/28 14:58:45 1142 @@ -1,8 +1,38 @@ package dk.thoerup.traininfo; -import java.util.ArrayList; -import java.util.List; +import static dk.thoerup.traininfo.R.string.app_name; +import static dk.thoerup.traininfo.R.string.generic_cancel; +import static dk.thoerup.traininfo.R.string.generic_retry; +import static dk.thoerup.traininfo.R.string.generic_search; +import static dk.thoerup.traininfo.R.string.stationlist_accuracy; +import static dk.thoerup.traininfo.R.string.stationlist_addfavorite; +import static dk.thoerup.traininfo.R.string.stationlist_favorites; +import static dk.thoerup.traininfo.R.string.stationlist_fetcherror; +import static dk.thoerup.traininfo.R.string.stationlist_findbyname; +import static dk.thoerup.traininfo.R.string.stationlist_findingnearby; +import static dk.thoerup.traininfo.R.string.stationlist_gpsinfo; +import static dk.thoerup.traininfo.R.string.stationlist_gpstimeout; +import static dk.thoerup.traininfo.R.string.stationlist_latitude; +import static dk.thoerup.traininfo.R.string.stationlist_loadfavorites; +import static dk.thoerup.traininfo.R.string.stationlist_locationinfo; +import static dk.thoerup.traininfo.R.string.stationlist_longitude; +import static dk.thoerup.traininfo.R.string.stationlist_nearbystations; +import static dk.thoerup.traininfo.R.string.stationlist_nofavorites; +import static dk.thoerup.traininfo.R.string.stationlist_nolocation; +import static dk.thoerup.traininfo.R.string.stationlist_nolocationprovider; +import static dk.thoerup.traininfo.R.string.stationlist_nostations; +import static dk.thoerup.traininfo.R.string.stationlist_obtainedby; +import static dk.thoerup.traininfo.R.string.stationlist_removefavorite; +import static dk.thoerup.traininfo.R.string.stationlist_search; +import static dk.thoerup.traininfo.R.string.stationlist_stationadded; +import static dk.thoerup.traininfo.R.string.stationlist_stationmap; +import static dk.thoerup.traininfo.R.string.stationlist_stationremoved; +import static dk.thoerup.traininfo.R.string.stationlist_stationsearch; +import static dk.thoerup.traininfo.R.string.stationlist_twocharmin; +import static dk.thoerup.traininfo.R.string.stationlist_waitforlocation; +import static dk.thoerup.traininfo.R.string.stationlist_satellitecount; +import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; @@ -18,7 +48,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; - import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -31,6 +60,8 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; +import dk.thoerup.android.traininfo.common.StationBean; +import dk.thoerup.android.traininfo.common.StationBean.StationEntry; import dk.thoerup.traininfo.provider.ProviderFactory; import dk.thoerup.traininfo.provider.StationProvider; import dk.thoerup.traininfo.stationmap.GeoPair; @@ -38,13 +69,15 @@ import dk.thoerup.traininfo.util.IntSet; import dk.thoerup.traininfo.util.MessageBox; -import static dk.thoerup.traininfo.R.string.*; - public class StationList extends ListActivity { - public static final int GOTLOCATION = 1001; - public static final int GOTSTATIONLIST = 1002; - public static final int NOPROVIDER = 1003; - public static final int LOCATIONFIXTIMEOUT = 1004; + public enum LookupStates { + GOTLOCATION, + GOTSTATIONLIST, + NOPROVIDER, + LOCATIONFIXTIMEOUT, + GPS_SAT_COUNT + } + public static final int OPTIONS_MAP = 2003; public static final int OPTIONS_GPSINFO = 2004; @@ -53,7 +86,7 @@ public static final int DLG_STATIONNAME = 3002; - public static final int GPS_TIMEOUT_MS = 17500; //how long are we willing to wait for gps fix -in milliseconds + public static final int GPS_TIMEOUT_MS = 15000; //how long are we willing to wait for gps fix -in milliseconds static enum LookupMethod { @@ -74,7 +107,7 @@ boolean isLaunchedforShortcut; boolean isRunning = false; - List stations = new ArrayList(); + StationBean stations = new StationBean(); StationProvider stationProvider = ProviderFactory.getStationProvider(); @@ -89,7 +122,7 @@ /////////////////////////////////////////////////////////////////////////////////////////// //Activity call backs - @SuppressWarnings("unchecked") + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -116,6 +149,8 @@ isLaunchedforShortcut = getIntent().getBooleanExtra("shortcut", false); + ProviderFactory.purgeOldEntries(); //cleanup before fetching more data + if (savedInstanceState == null) { @@ -124,7 +159,7 @@ startLookup(); break; case ListSearch: - showDialog(DLG_STATIONNAME); //TODO: this.showDialogSafe(DLG_STATIONNAME); + showDialog(DLG_STATIONNAME); break; case ListFavorites: startFavoriteLookup(); @@ -134,25 +169,30 @@ } } else { - stations = (ArrayList) savedInstanceState.getSerializable("stations"); + stations = (StationBean) savedInstanceState.getSerializable("stations"); adapter.setStations(stations); location = (GeoPair) savedInstanceState.getSerializable("location"); } } + + + + @Override protected void onDestroy() { super.onDestroy(); - if (findStationsTask != null) { - findStationsTask.cancel(true); - } + isRunning = false; + if (locationLookup != null) { locationLookup.stopSearch(); } - isRunning = false; + if (findStationsTask != null) { + findStationsTask.cancel(true); + } } @@ -176,56 +216,14 @@ } - - /* 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) { if (dialog != null && dialog.isShowing()) dialog.dismiss(); - outState.putSerializable("stations", (ArrayList) stations); + outState.putSerializable("stations", (StationBean) stations); outState.putSerializable("location", location); } @@ -256,7 +254,7 @@ Intent intent = new Intent(this,StationMapView.class); ArrayList stationPoints = new ArrayList(); - for (StationBean st : stations ) { + for (StationEntry st : stations.entries ) { stationPoints.add( new GeoPair(st.getLatitude(), st.getLongitude(), st.getName()) ); } @@ -375,7 +373,7 @@ protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); - StationBean station = stations.get(position); + StationEntry station = stations.entries.get(position); if (isLaunchedforShortcut == true) { Intent i = new Intent(); @@ -395,15 +393,15 @@ public void startLookup() { isRunning = true; dialogMessage = getString( stationlist_waitforlocation ); - showDialog(DLG_PROGRESS);//TODO:showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); locationLookup.locateStations(); - stationsFetched.sendEmptyMessageDelayed(LOCATIONFIXTIMEOUT, GPS_TIMEOUT_MS); + stationsFetched.sendEmptyMessageDelayed(LookupStates.LOCATIONFIXTIMEOUT.ordinal(), GPS_TIMEOUT_MS); } void startNameSearch(String name) { dialogMessage = getString( stationlist_findbyname ); - showDialog(DLG_PROGRESS);//TODO:showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByName(name); @@ -415,7 +413,7 @@ if (favorites.size() > 0) { dialogMessage = getString( stationlist_loadfavorites ); - showDialog(DLG_PROGRESS);//TODO:showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByIds( favorites.toString() ); @@ -430,7 +428,7 @@ void startLocatorTask() { dialogMessage = getString( stationlist_findingnearby ); - showDialog(DLG_PROGRESS);//TODO:showDialogSafe(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByLocation( locationLookup.getLocation() ); @@ -444,10 +442,13 @@ class StationsFetchedHandler extends Handler { @Override public void handleMessage(Message msg) { + Log.e("Handler", "WHAT:" + msg.what); + + LookupStates state = LookupStates.values()[msg.what]; - switch (msg.what) { + switch (state) { case GOTLOCATION: - dismissDialog(DLG_PROGRESS);//TODO:dismissDialogSafe(DLG_PROGRESS); + dismissDialog(DLG_PROGRESS); startLocatorTask(); location = GeoPair.fromLocation( locationLookup.getLocation() ); @@ -455,17 +456,22 @@ break; case NOPROVIDER: - dismissDialog(DLG_PROGRESS);//TODO:dismissDialogSafe(DLG_PROGRESS); + dismissDialog(DLG_PROGRESS); MessageBox.showMessage(StationList.this, getString(stationlist_nolocationprovider), true ); //StationList.this.finish(); break; + case GPS_SAT_COUNT: + int count = msg.arg1; + String dialogMessage = getString( stationlist_waitforlocation ) + "\n" + getString( stationlist_satellitecount ) + ": " + count; + dialog.setMessage( dialogMessage ); + return; //abort immediately case LOCATIONFIXTIMEOUT: if (isRunning) { locationLookup.stopSearch(); if (locationLookup.hasLocation()) { - stationsFetched.sendEmptyMessage( GOTLOCATION ); + stationsFetched.sendEmptyMessage( LookupStates.GOTLOCATION.ordinal() ); } else { - dismissDialog(DLG_PROGRESS);//TODO:dismissDialogSafe(DLG_PROGRESS); + dismissDialog(DLG_PROGRESS); AlertDialog.Builder builder = new AlertDialog.Builder(StationList.this); builder.setMessage( getString( stationlist_gpstimeout) ); @@ -482,7 +488,7 @@ dialog.dismiss(); } }); - builder.show();//TODO:builderShowSafe(builder); + builder.show(); } } @@ -496,7 +502,6 @@ class FindStationsTask extends AsyncTask { LookupMethod method = LookupMethod.MethodNone; - boolean success; String name; Location loc; String ids; @@ -531,16 +536,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 } @@ -550,14 +555,13 @@ @Override protected void onPostExecute(Void result) { super.onPostExecute(result); - dialog.dismiss();//TODO:dismissDialogSafe(dialog); + dialog.dismiss(); - if (success) { - if (stationProvider.getStations().size() == 0) { + if (stations != null) { + if (stations.entries.size() == 0) { showMessageAndClose(getString(stationlist_nostations)); } - stations = stationProvider.getStations(); StationList.this.getListView().invalidateViews(); adapter.setStations( stations ); @@ -609,7 +613,7 @@ } }); - builder.show();//TODO:builderShowSafe(builder); + builder.show(); } } } @@ -627,7 +631,7 @@ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; selectedPosition = info.position; - int stationID = stations.get(selectedPosition).getId(); + int stationID = stations.entries.get(selectedPosition).getId(); if (!favorites.contains(stationID)) { menu.add(0, FAVORITES_ADD, 0, getString(stationlist_addfavorite) ); @@ -638,7 +642,7 @@ } public void onContextItemSelected(MenuItem item) { - StationBean sb = stations.get(selectedPosition); + StationEntry sb = stations.entries.get(selectedPosition); int stationID = sb.getId(); if (item.getItemId() == FAVORITES_ADD) { @@ -651,7 +655,7 @@ if (listType.equals( WelcomeScreen.ListType.ListFavorites) ) { - stations.remove(selectedPosition); + stations.entries.remove(selectedPosition); adapter.notifyDataSetChanged(); } }