package com.papagiannis.tuberun;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.papagiannis.tuberun.binders.NearbyBinder;
import com.papagiannis.tuberun.fetchers.Observer;
import com.papagiannis.tuberun.fetchers.StationsTubeFetcher;
public class NearbyStationsListFragment extends ListFragment implements
Observer {
StationsTubeFetcher fetcher;
boolean has_moved = false;
boolean has_moved_accurate = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fetcher = new StationsTubeFetcher(getActivity());
fetcher.registerCallback(this);
}
Location lastKnownLocation;
public void locationChanged(Location l) {
lastKnownLocation = l;
if (fetcher == null) {
fetcher = new StationsTubeFetcher(getActivity());
fetcher.registerCallback(this);
}
fetcher.setLocation(lastKnownLocation);
fetcher.update();
}
ArrayList<Station> stations_nearby=new ArrayList<Station>();
ArrayList<BusStation> prev_result = new ArrayList<BusStation>();
private ArrayList<HashMap<String, Object>> to_display=new ArrayList<HashMap<String,Object>>();
/**
* Called when the background thread has finished the calculation of nearby
* stations
**/
@Override
public void update() {
TextView accuracy = (TextView) getActivity().findViewById(
R.id.location_accuracy_textview);
if (accuracy!=null)
accuracy.setText("accuracy: " + (int) (lastKnownLocation.getAccuracy())
+ "m");
to_display = new ArrayList<HashMap<String, Object>>();
stations_nearby = fetcher.getResult();
for (Station s : stations_nearby) {
HashMap<String, Object> m = new HashMap<String, Object>();
m.put("name", s.getName());
m.put("distance",
(int) s.getLocation().distanceTo(lastKnownLocation));
List<LineType> lines = StationDetails.FetchLinesForStationWikipedia(s.getName());
for (LineType lt : lines) {
String line = LinePresentation.getStringRespresentation(lt);
m.put(line, line);
}
Set<String> existing = m.keySet();
for (String line : LinePresentation.getLinesStringList()) {
if (!existing.contains(line))
m.put(line, "");
}
to_display.add(m);
}
updateList();
}
private void updateList() {
if (to_display.size()==0) return;
Activity a=getActivity();
if (a==null) return;
SimpleAdapter adapter = new SimpleAdapter(a, to_display,
R.layout.nearby_status, new String[] { "name", "distance",
LinePresentation.getStringRespresentation(LineType.BAKERLOO),
LinePresentation.getStringRespresentation(LineType.CENTRAL),
LinePresentation.getStringRespresentation(LineType.CIRCLE),
LinePresentation.getStringRespresentation(LineType.DISTRICT),
LinePresentation.getStringRespresentation(LineType.DLR),
LinePresentation.getStringRespresentation(LineType.HAMMERSMITH),
LinePresentation.getStringRespresentation(LineType.JUBILEE),
LinePresentation.getStringRespresentation(LineType.METROPOLITAN),
LinePresentation.getStringRespresentation(LineType.NORTHERN),
LinePresentation.getStringRespresentation(LineType.OVERGROUND),
LinePresentation.getStringRespresentation(LineType.PICACIDILY),
LinePresentation.getStringRespresentation(LineType.VICTORIA),
LinePresentation.getStringRespresentation(LineType.WATERLOO) },
new int[] { R.id.nearby_tubename, R.id.nearby_tubedistance,
R.id.nearby_Bakerloo, R.id.nearby_Central,
R.id.nearby_Circle, R.id.nearby_District,
R.id.nearby_DLR, R.id.nearby_Hammersmith,
R.id.nearby_Jubilee, R.id.nearby_Metropolitan,
R.id.nearby_Northern, R.id.nearby_Overground,
R.id.nearby_Piccadily, R.id.nearby_Victoria,
R.id.nearby_Waterloo });
adapter.setViewBinder(new NearbyBinder(getActivity()));
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
try {
Station s = stations_nearby.get(position);
Intent i = new Intent(getActivity(), DirectionsMapActivity.class);
i.putExtra("station", s);
i.putExtra("user_longtitude",
(int) (lastKnownLocation.getLongitude() * 1000000));
i.putExtra("user_latitude",
(int) (lastKnownLocation.getLatitude() * 1000000));
startActivity(i);
} catch (Exception e) {
}
}
public void showAllInMap() {
if (stations_nearby.size()>0) {
Intent i=new Intent(getActivity(), NearbyMapActivity.class);
i.putExtra("type", "tube");
i.putExtra("stations", stations_nearby);
startActivity(i);
}
}
@Override
public void onPause() {
super.onPause();
if (fetcher!=null) fetcher.abort();
}
@Override
public void onResume() {
super.onResume();
ListView lv=getListView();
int[] colors = {Color.TRANSPARENT, Color.GRAY, Color.TRANSPARENT};
lv.setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
lv.setDividerHeight(1);
updateList();
}
@Override
public void onDestroy() {
super.onDestroy();
if (fetcher!=null) fetcher.deregisterCallback(this);
}
}