package com.papagiannis.tuberun; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.SimpleAdapter; import android.widget.TextView; import com.papagiannis.tuberun.binders.DeparturesBinder; import com.papagiannis.tuberun.favorites.DeparturesFavorite; import com.papagiannis.tuberun.favorites.Favorite; import com.papagiannis.tuberun.fetchers.DeparturesDLRFetcher; import com.papagiannis.tuberun.fetchers.DeparturesFetcher; import com.papagiannis.tuberun.fetchers.DeparturesTubeFetcher; import com.papagiannis.tuberun.fetchers.DeparturesOvergroundFetcher; import com.papagiannis.tuberun.fetchers.Observer; import com.papagiannis.tuberun.fetchers.StationStatusesFetcher; public class DeparturesActivity extends ListActivity implements Observer, OnClickListener { private static final int ASK_LINE_DIALOG=1; protected Button backButton; protected Button logoButton; protected TextView stationTextView; protected TextView emptyTextView; protected RelativeLayout warningLayout; protected TextView warningTextview; private DeparturesFetcher departuresFetcher; private StationStatusesFetcher statusesFetcher; private Observer statusesCallback; private final ArrayList<HashMap<String,Object>> departures_list=new ArrayList<HashMap<String,Object>>(); private LineType lt; private String stationcode; private String stationnice; private Station station; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); create(); } @SuppressWarnings("deprecation") private void create() { setContentView(R.layout.departures); backButton = (Button) findViewById(R.id.back_button); logoButton = (Button) findViewById(R.id.logo_button); stationTextView = (TextView) findViewById(R.id.station_textview); emptyTextView= (TextView) findViewById(R.id.empty_textview); backButton.setOnClickListener(this); logoButton.setOnClickListener(this); warningLayout=(RelativeLayout) findViewById(R.id.warning_layout); warningTextview=(TextView) findViewById(R.id.warning_textview); warningTextview.setMovementMethod(new ScrollingMovementMethod()); departures_list.clear(); Bundle extras = getIntent().getExtras(); String type = (String)extras.get("type"); if (type!=null && type.equals("station")) { station=(Station)extras.get("station"); stationcode=station.getCode(); stationnice=station.getName(); stationTextView.setVisibility(View.GONE); List<LineType> lines = station.getLinesForDepartures(); //this should not happen if (lines.size()==0) return; //this is the case for overground, dlr and rail stations if (lines.size()==1 && !station.locatedOn(LineType.ALL)) { lt=lines.get(0); showDepartures(); return; } //Now the user has to select which tube line he wants to see AsyncTask<Station, Integer, ArrayList<LineType>> findLinesTask=new AsyncTask<Station, Integer, ArrayList<LineType>>(){ @Override protected ArrayList<LineType> doInBackground(Station... stations) { if (stations==null || stations.length==0) return new ArrayList<LineType>(); DatabaseHelper myDbHelper = new DatabaseHelper(DeparturesActivity.this); ArrayList<LineType> ls=new ArrayList<LineType>(); try { myDbHelper.openDataBase(); ls = myDbHelper.getDepartureLinesForTubeStation(stations[0]); station.clearLineTypesForDepartures(); station.addLineTypesForDepartures(ls); } catch (Exception e) { Log.w("DeparturesActivity", e); } finally { myDbHelper.close(); } return ls; } @Override protected void onPostExecute(ArrayList<LineType> ls) { if (ls.size()>1) { showDialog(ASK_LINE_DIALOG); } else if (ls.size()==1) { lt=ls.get(0); showDepartures(); } } }; findLinesTask.execute(station); } else { String line = (String)extras.get("line"); stationcode = (String)extras.get("stationcode"); stationnice = (String)extras.get("stationnice"); lt=LinePresentation.getLineTypeRespresentation(line); showDepartures(); } } private void showDepartures() { stationTextView.setText(stationnice); stationTextView.setBackgroundColor(LinePresentation.getBackgroundColor(lt)); stationTextView.setTextColor(LinePresentation.getForegroundColor(lt)); stationTextView.setVisibility(View.VISIBLE); if (lt==LineType.DLR) departuresFetcher=new DeparturesDLRFetcher(lt, stationcode, stationnice); else if (lt==LineType.OVERGROUND) departuresFetcher = new DeparturesOvergroundFetcher(stationcode,stationnice); else departuresFetcher=new DeparturesTubeFetcher(lt, stationcode, stationnice); departuresFetcher.registerCallback(this); emptyTextView.setVisibility(View.GONE); departuresFetcher.update(); statusesFetcher=new StationStatusesFetcher(); statusesCallback = new Observer() { @Override public void update() { updateStatus(); } }; statusesFetcher.registerCallback(statusesCallback); statusesFetcher.update(); View updateButton = findViewById(R.id.button_update); updateButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { emptyTextView.setVisibility(View.GONE); warningLayout.setVisibility(View.GONE); setListAdapter(null); departuresFetcher.update(); statusesFetcher.update(); } }); Favorite.getFavorites(this); } @Override public void update() { departures_list.clear(); HashMap<String, ArrayList<HashMap<String, String>>> reply=departuresFetcher.getDepartures(); for (String platform : reply.keySet()) { HashMap<String,Object> m=new HashMap<String,Object>(); ArrayList<HashMap<String, String>> trains=reply.get(platform); m.put("line", LinePresentation.getStringRespresentation(lt)); m.put("platform", platform); int i=1; for (HashMap<String,String> train : trains) { String s=train.get("destination"); m.put("destination"+i, s); s=train.get("position"); m.put("position"+i, s); s=train.get("time"); if (s.equals("")) s="due"; m.put("time"+i, s); i++; } DeparturesFavorite fav=new DeparturesFavorite(lt,null); fav.setIdentification(stationcode); fav.setStation_nice(stationnice); fav.setPlatform(platform); Boolean isFavorite=Favorite.isFavorite(fav); m.put("favorite", Boolean.toString(isFavorite)); departures_list.add(m); } if (departures_list.isEmpty()) { emptyTextView.setVisibility(View.VISIBLE); } else { emptyTextView.setVisibility(View.GONE); } SimpleAdapter adapter=new SimpleAdapter(this, departures_list, R.layout.departures_status, new String[]{"platform", "favorite", "destination1","position1","time1", "destination2","position2","time2", "destination3","position3","time3"}, new int[]{R.id.departures_platform, R.id.add_favorite, R.id.departures_destination1, R.id.departures_position1, R.id.departures_time1, R.id.departures_destination2, R.id.departures_position2, R.id.departures_time2, R.id.departures_destination3, R.id.departures_position3, R.id.departures_time3}); adapter.setViewBinder(new DeparturesBinder(lt, stationcode , stationnice , this, adapter)); setListAdapter(adapter); } private void updateStatus() { if (statusesFetcher.hasStatus(stationnice)) { warningTextview.setText(statusesFetcher.getStatus(stationnice)); warningLayout.setVisibility(View.VISIBLE); } else warningLayout.setVisibility(View.GONE); } @Override protected Dialog onCreateDialog(int id) { Dialog result=null; switch (id) { case ASK_LINE_DIALOG: final List<LineType> ls=station.getLinesForDepartures(); final CharSequence[] items = new String[ls.size()]; int i=0; for (LineType line : ls) { items[i++]=LinePresentation.getStringRespresentation(line); } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select line"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { lt=ls.get(item); showDepartures(); } }); result= builder.create(); break; } return result; }; @Override protected void onDestroy() { if (statusesCallback!=null && statusesFetcher!=null) { statusesFetcher.deregisterCallback(statusesCallback); } super.onDestroy(); }; @Override public void onClick(View v) { finish(); } }