package com.papagiannis.tuberun;
import java.util.ArrayList;
import java.util.HashMap;
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.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.widget.TextView;
import com.papagiannis.tuberun.fetchers.Observer;
import com.papagiannis.tuberun.fetchers.StationsRailFetcher;
public class NearbyRailListFragment extends ListFragment implements Observer {
private StationsRailFetcher fetcher;
private Location lastKnownLocation;
private ArrayList<Station> stations_nearby = new ArrayList<Station>();
private ArrayList<HashMap<String, Object>> to_display = new ArrayList<HashMap<String,Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initilizeFetcher();
}
void locationChanged(Location l) {
lastKnownLocation = l;
initilizeFetcher();
fetcher.setLocation(lastKnownLocation);
fetcher.update();
}
private void initilizeFetcher() {
if (fetcher == null) {
fetcher = new StationsRailFetcher(getActivity());
fetcher.registerCallback(this);
}
}
/**
* Called when the background thread has finished the calculation of nearby
* stations
**/
@Override
public void update() {
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));
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_oyster_shop,
new String[] { "name", "distance" },
new int[] {R.id.nearby_shopname, R.id.nearby_shopdistance });
adapter.setViewBinder(new ViewBinder() {
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
TextView tv = (TextView) view;
int id = tv.getId();
switch (id) {
case R.id.nearby_shopdistance:
int i = (Integer) data;
if (i > 10000) {
i = (i / 1000);
tv.setText(i + " km");
} else {
tv.setText(i + " m");
}
return true;
}
return false;
}
});
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("type", "rail");
i.putExtra("user_longtitude",
(int) (lastKnownLocation.getLongitude() * 1000000));
i.putExtra("user_latitude",
(int) (lastKnownLocation.getLatitude() * 1000000));
startActivity(i);
} catch (Exception e) {
Log.w(this.getClass().toString(), e);
}
}
public void showAllInMap() {
if (stations_nearby.size() > 0) {
Intent i = new Intent(getActivity(), NearbyMapActivity.class);
i.putExtra("type", "rail");
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);
}
}