package dk.thoerup.traininfo.provider; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; 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.IntSet; import dk.thoerup.traininfo.util.XmlUtil; public class OfflineStationProvider implements StationProvider { StationBean stations = new StationBean(); public boolean loadStations(Context context) throws Exception { File parent = context.getFilesDir(); File stationsFile = new File(parent, "stations.xml"); 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") ); Log.e("OFFLINE", "loaded" + stations.entries.size()); return true; } public void downloadStations(Context context) throws IOException { File parent = context.getFilesDir(); File stationsFile = new File(parent, "stations.xml"); byte data[] = HttpUtil.getContent(XmlUtil.SERVICE_BASE + "/LocateStations?dump=1", 5000); RandomAccessFile raf = new RandomAccessFile(stationsFile, "rw"); Log.e("OFFLINE", "data size" + data.length); raf.setLength(0); //truncate raf.write(data); raf.close(); } @Override public void purgeOldEntries() { } @Override public StationBean lookupStationsByLocation(Location location) { Location tmpLoc = new Location("GPS"); ArrayList entries = new ArrayList() ; for (StationEntry entry : stations.entries) { tmpLoc.setLatitude(entry.getLatitude()); tmpLoc.setLongitude(entry.getLongitude()); entry.setCalcdist( (int) location.distanceTo(tmpLoc) ); entries.add(entry); } Collections.sort( entries, 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; } }); StationBean tmpStations = new StationBean(); for (int i = 0; i<8; i++) { tmpStations.entries.add( entries.get(i) ); } return tmpStations; } @Override public StationBean lookupStationsByName(String name) { name = name.toLowerCase(); StationBean tmpStations = new StationBean(); for (StationEntry entry : stations.entries) { if (entry.getName().toLowerCase().startsWith(name) ) { tmpStations.entries.add(entry); } } return tmpStations; } @Override public StationBean lookupStationsByIds(String ids) { IntSet idset = new IntSet(); idset.fromString(ids); StationBean tmpStations = new StationBean(); for (StationEntry entry : stations.entries) { if (idset.contains( entry.getId() ) ) { tmpStations.entries.add(entry); } } return tmpStations; } }