package dk.thoerup.traininfo.provider; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.URLEncoder; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; import android.content.Context; import android.location.Location; import android.util.Log; import dk.thoerup.android.traininfo.common.StationBean; import dk.thoerup.android.traininfo.common.StationEntry; import dk.thoerup.genericjavautils.HttpUtil; import dk.thoerup.traininfo.util.DownloadUtil; import dk.thoerup.traininfo.util.IntSet; import dk.thoerup.traininfo.util.XmlUtil; public class OfflineStationProvider implements StationProvider { StationBean stations = new StationBean(); boolean statsByNameSend = false; public boolean hasStations() { return (stations != null && stations.entries.size() > 0); } public boolean loadStations(Context context) throws Exception { long start = System.currentTimeMillis(); StationBean tmpStations = new StationBean(); File parent = context.getFilesDir(); File stationsFile = new File(parent, "stations.bin"); if (!stationsFile.exists()) return false; /*int size = (int) stationsFile.length(); byte data[] = new byte[size]; RandomAccessFile raf = new RandomAccessFile(stationsFile, "r"); raf.readFully(data); Serializer serializer = new Persister(); stations = serializer.read(StationBean.class, new String(data, "ISO-8859-1") );*/ ObjectInputStream in = new ObjectInputStream( new FileInputStream(stationsFile) ); int length = in.readInt(); // first field is the length for (int i=0; i distanceComparator = new Comparator() { @Override public int compare(StationEntry object1, StationEntry object2) { if (object1.getCalcdist() == object2.getCalcdist()) return 0; if (object1.getCalcdist() > object2.getCalcdist()) return 1; else return -1; } }; @Override public StationBean lookupStationsByLocation(Location location) { statsByLocation(location); long start = System.currentTimeMillis(); Location tmpLoc = new Location("GPS"); LinkedList entries = new LinkedList() ; for (StationEntry entry : stations.entries) { tmpLoc.setLatitude(entry.getLatitude()); tmpLoc.setLongitude(entry.getLongitude()); int distance = (int) location.distanceTo(tmpLoc); if (entries.size() <8 || entries.getLast().getCalcdist() > distance) { entry.setCalcdist(distance); if (entries.size() == 8) entries.removeLast(); entries.addLast(entry); Collections.sort( entries, distanceComparator); } } logElapsedTime(start, "location_stage1"); Collections.sort( entries, distanceComparator); StationBean tmpStations = new StationBean(); for (int i = 0; i<8 && i