--- android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2010/01/28 09:16:33 564 +++ android/TrainInfo/src/dk/thoerup/traininfo/StationList.java 2011/03/30 17:26:50 1245 @@ -1,9 +1,40 @@ 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_satellitecount; +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 java.util.ArrayList; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; @@ -17,7 +48,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; - +import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; @@ -29,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; @@ -36,23 +69,20 @@ 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 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, @@ -67,10 +97,11 @@ FindStationsTask findStationsTask; StationsFetchedHandler stationsFetched = new StationsFetchedHandler(); - GeoPair location = new GeoPair(); - - boolean isRunning = false; - List stations = new ArrayList(); + //GeoPair location = new GeoPair(); + + boolean isLaunchedforShortcut; + + StationBean stations = new StationBean(); StationProvider stationProvider = ProviderFactory.getStationProvider(); @@ -81,11 +112,11 @@ WelcomeScreen.ListType listType; SharedPreferences prefs; - + /////////////////////////////////////////////////////////////////////////////////////////// //Activity call backs - @SuppressWarnings("unchecked") + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -98,7 +129,7 @@ ListView lv = getListView(); lv.setOnCreateContextMenuListener(contextMenu); - locationLookup = new LocationLookup(this, stationsFetched); + locationLookup = new LocationLookup(this); prefs = getSharedPreferences("TrainStation", 0); @@ -110,15 +141,19 @@ listType = (WelcomeScreen.ListType) getIntent().getSerializableExtra("type"); setTitle(); + isLaunchedforShortcut = getIntent().getBooleanExtra("shortcut", false); + + ProviderFactory.purgeOldEntries(); //cleanup before fetching more data + if (savedInstanceState == null) { switch (listType) { case ListNearest: - startLookup(); + startNearestLookup(); break; - case ListSearch: - this.showDialog(DLG_STATIONNAME); + case ListSearch: + showDialog(DLG_STATIONNAME); break; case ListFavorites: startFavoriteLookup(); @@ -128,12 +163,33 @@ } } 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(); + + stationsFetched.removeMessages(0); + + + if (locationLookup != null) { + locationLookup.stopSearch(); + } + if (findStationsTask != null) { + findStationsTask.cancel(true); + } + } + + protected void setTitle() { String dialogTitle = getResources().getString(app_name); switch (listType) { @@ -151,18 +207,17 @@ } setTitle(dialogTitle); + } - - + @Override public void onSaveInstanceState(Bundle outState) { if (dialog != null && dialog.isShowing()) dialog.dismiss(); - outState.putSerializable("stations", (ArrayList) stations); - outState.putSerializable("location", location); + outState.putSerializable("stations", (StationBean) stations); } @@ -192,7 +247,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()) ); } @@ -213,7 +268,7 @@ message.append( getString(stationlist_nolocation) ); } - MessageBox.showMessage(this, message.toString()); + MessageBox.showMessage(this, message.toString(), false); break; default: retval = super.onOptionsItemSelected(item); @@ -270,8 +325,9 @@ public void onClick(DialogInterface dialog, int which) { EditText et = (EditText) rootView.findViewById(R.id.EditText); dialog.dismiss(); - if (et.getText().toString().length() >= 2) { - startNameSearch(et.getText().toString()); + String search = et.getText().toString().trim(); + if (search.length() >= 2) { + startNameLookup(search); } else { showMessageAndClose( getString(stationlist_twocharmin) ); } @@ -310,31 +366,37 @@ 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); - 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); + } } ///////////////////////////////////////////////////////////// // - public void startLookup() { - isRunning = true; + public void startNearestLookup() { dialogMessage = getString( stationlist_waitforlocation ); showDialog(DLG_PROGRESS); locationLookup.locateStations(); - stationsFetched.sendEmptyMessageDelayed(LOCATIONFIXTIMEOUT, 20000); + stationsFetched.sendEmptyMessageDelayed(0, 500); } - void startNameSearch(String name) { + void startNameLookup(String name) { dialogMessage = getString( stationlist_findbyname ); showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); - findStationsTask.searchByName(name, locationLookup.getLocation()); + findStationsTask.searchByName(name); findStationsTask.execute(); } @@ -346,7 +408,7 @@ showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); - findStationsTask.searchByIds(favorites.toString(), locationLookup.getLocation()); + findStationsTask.searchByIds( favorites.toString() ); findStationsTask.execute(); } else { showMessageAndClose( getString( stationlist_nofavorites ) ); @@ -358,41 +420,13 @@ void startLocatorTask() { dialogMessage = getString( stationlist_findingnearby ); - showDialog(DLG_PROGRESS); + showDialog(DLG_PROGRESS); findStationsTask = new FindStationsTask(); findStationsTask.searchByLocation( locationLookup.getLocation() ); findStationsTask.execute(); } - - - /* TODO: Remove this no longer needed function - String lookupAddress(double latitude, double longitude) { - - Geocoder coder = new Geocoder(this, new Locale("da")); - StringBuilder sb = new StringBuilder(); - Log.i("lookupaddr", "" + latitude + "/" + longitude); - try { - List
addressList = coder.getFromLocation(latitude, longitude, 1); - Address addr = addressList.get(0); - - - int max = addr.getMaxAddressLineIndex(); - for (int i=0; i0) - sb.append(", "); - - sb.append(addr.getAddressLine(i)); - } - - - } catch (Exception e) { - Log.e("DepartureList", "geocoder failed", e); - } - return sb.toString(); - }*/ - //////////////////////////////////////////////////////////////////////////// // Inner classes @@ -401,65 +435,84 @@ @Override public void handleMessage(Message msg) { - switch (msg.what) { + LocationLookup.LookupStates state = locationLookup.getState(); + + + switch (state) { case GOTLOCATION: dismissDialog(DLG_PROGRESS); - + startLocatorTask(); - location = GeoPair.fromLocation( locationLookup.getLocation() ); - - break; + + return; case NOPROVIDER: dismissDialog(DLG_PROGRESS); - MessageBox.showMessage(StationList.this, getString(stationlist_nolocationprovider) ); - break; - case LOCATIONFIXTIMEOUT: - if (isRunning) { - locationLookup.stopSearch(); - if (locationLookup.hasLocation()) { - stationsFetched.sendEmptyMessage( GOTLOCATION ); - } else { - dismissDialog(DLG_PROGRESS); - - AlertDialog.Builder builder = new AlertDialog.Builder(StationList.this); - builder.setMessage( getString( stationlist_gpstimeout) ); - builder.setCancelable(true); - builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - startLookup(); - - } - }); - builder.setNegativeButton( getString(generic_cancel), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); - builder.show(); + MessageBox.showMessage(StationList.this, getString(stationlist_nolocationprovider), true ); + //StationList.this.finish(); + return; + case IDLE: + Log.e("TrainInfo", "How did this happen ???"); + dismissDialog(DLG_PROGRESS); // how did we get here ?? + return; + + } + + + + if (locationLookup.elapsedTime() >= GPS_TIMEOUT_MS) { + dismissDialog(DLG_PROGRESS); + + + locationLookup.stopSearch(); + + if (locationLookup.hasLocation()) { + startLocatorTask(); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(StationList.this); + builder.setMessage( getString( stationlist_gpstimeout) ); + builder.setCancelable(true); + builder.setPositiveButton(getString(generic_retry), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + startNearestLookup(); + + } + }); + builder.setNegativeButton( getString(generic_cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + StationList.this.finish(); // Close this Activity + } + }); + builder.show(); - } } - break; + } else { + if (locationLookup.hasGps()) { + int count = locationLookup.getSatCount(); + String dialogMessage = getString( stationlist_waitforlocation ) + "\n" + getString( stationlist_satellitecount ) + ": " + count; + dialog.setMessage( dialogMessage ); + } + this.sendEmptyMessageDelayed(0, 500); } - isRunning = false; + } - }; + } + + class FindStationsTask extends AsyncTask { LookupMethod method = LookupMethod.MethodNone; - boolean success; String name; Location loc; String ids; - public void searchByName(String n, Location l) { + public void searchByName(String n) { method = LookupMethod.ByName; - loc = l; name = n; } @@ -468,10 +521,9 @@ loc = l; } - public void searchByIds(String id, Location l) { + public void searchByIds(String id) { method = LookupMethod.ByList; - loc = l; ids = id; } @@ -488,36 +540,19 @@ switch (method) { case ByLocation: - success = stationProvider.lookupStations(loc); + stations = stationProvider.lookupStationsByLocation(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 } - Location dummy = new Location("gps"); - List stations = stationProvider.getStations(); - - for (StationBean station : stations) { - - if (method.equals(LookupMethod.ByName) || method.equals(LookupMethod.ByList)) { - if (loc != null) { //only do the distance calc if we have a location - dummy.setLatitude(station.getLatitude()); - dummy.setLongitude(station.getLongitude()); - station.setDistance( (int)loc.distanceTo(dummy) ); - } else { - station.setDistance(0); - } - } - - } - return null; } @@ -527,34 +562,62 @@ dialog.dismiss(); - if (success) { - if (stationProvider.getStations().size() == 0) - MessageBox.showMessage(StationList.this, getString(stationlist_nostations) ); // this should not be possible !?! - stations = stationProvider.getStations(); + if (stations != null) { + if (stations.entries.size() == 0) { + showMessageAndClose(getString(stationlist_nostations)); + } + + 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) { dialog.dismiss(); - stationsFetched.post( new Runnable() { - @Override - public void run() { - startLocatorTask(); - } - }); + Runnable runner = null; + switch (method) { + case ByLocation: + runner = new Runnable() { + @Override + public void run() { + startLocatorTask(); + } + }; + break; + case ByName: + runner = new Runnable() { + @Override + public void run() { + startNameLookup( FindStationsTask.this.name ); + } + }; + break; + case ByList: + runner = new Runnable() { + @Override + public void run() { + startFavoriteLookup(); + } + }; + break; + } + + stationsFetched.post( runner ); } }); builder.setNegativeButton(getString(generic_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); + StationList.this.finish(); } - }); - builder.show(); + }); + + builder.show(); } } } @@ -572,7 +635,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) ); @@ -583,7 +646,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) { @@ -596,7 +659,7 @@ if (listType.equals( WelcomeScreen.ListType.ListFavorites) ) { - stations.remove(selectedPosition); + stations.entries.remove(selectedPosition); adapter.notifyDataSetChanged(); } }