/[projects]/android/TrainInfo/src/dk/thoerup/traininfo/provider/OfflineStationProvider.java
ViewVC logotype

Contents of /android/TrainInfo/src/dk/thoerup/traininfo/provider/OfflineStationProvider.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1556 - (show annotations) (download)
Fri Jul 8 12:37:16 2011 UTC (12 years, 10 months ago) by torben
File size: 4957 byte(s)
After download remember to update the byname helper fields
1 package dk.thoerup.traininfo.provider;
2
3 import java.io.EOFException;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.FileOutputStream;
7 import java.io.ObjectInputStream;
8 import java.io.ObjectOutputStream;
9 import java.util.Collections;
10 import java.util.Comparator;
11 import java.util.LinkedList;
12
13 import org.simpleframework.xml.Serializer;
14 import org.simpleframework.xml.core.Persister;
15
16 import android.content.Context;
17 import android.location.Location;
18 import android.util.Log;
19 import dk.thoerup.android.traininfo.common.StationBean;
20 import dk.thoerup.android.traininfo.common.StationEntry;
21 import dk.thoerup.genericjavautils.HttpUtil;
22 import dk.thoerup.traininfo.util.IntSet;
23 import dk.thoerup.traininfo.util.XmlUtil;
24
25 public class OfflineStationProvider implements StationProvider {
26
27 StationBean stations = new StationBean();
28
29
30 public boolean loadStations(Context context) throws Exception {
31 long start = System.currentTimeMillis();
32
33 stations.entries.clear(); //TODO: remove
34
35 File parent = context.getFilesDir();
36 File stationsFile = new File(parent, "stations.bin");
37
38 if (!stationsFile.exists())
39 return false;
40
41 /*int size = (int) stationsFile.length();
42 byte data[] = new byte[size];
43
44 RandomAccessFile raf = new RandomAccessFile(stationsFile, "r");
45 raf.readFully(data);
46
47 Serializer serializer = new Persister();
48 stations = serializer.read(StationBean.class, new String(data, "ISO-8859-1") );*/
49
50
51 try {
52 ObjectInputStream in = new ObjectInputStream( new FileInputStream(stationsFile) );
53 Object o;
54 StationEntry e = null;
55 while ( (o=in.readObject()) != null ) {
56 e = (StationEntry) o;
57 e.updateSearch();
58 stations.entries.add( e );
59 }
60 in.close();
61 } catch (EOFException e) {
62 //do nothing;
63 }
64
65 Log.e("OFFLINE", "loaded" + stations.entries.size());
66 logElapsedTime(start, "loadStations");
67
68 return true;
69 }
70
71 public void downloadStations(Context context) throws Exception {
72 File parent = context.getFilesDir();
73 File stationsFile = new File(parent, "stations.bin");
74
75
76 byte data[] = HttpUtil.getContent(XmlUtil.SERVICE_BASE + "/LocateStations?dump=1", 5000);
77 Serializer serializer = new Persister();
78 stations = serializer.read(StationBean.class, new String(data, "ISO-8859-1") );
79
80
81 ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(stationsFile) );
82 Log.e("OFFLINE", "data size" + data.length);
83
84 for (StationEntry entry : stations.entries) {
85 entry.updateSearch(); //prepare name fields for byName search
86 out.writeObject(entry);
87 }
88
89 out.close();
90 }
91
92
93
94 @Override
95 public void purgeOldEntries() {
96 }
97
98 Comparator<StationEntry> distanceComparator = new Comparator<StationEntry>() {
99 @Override
100 public int compare(StationEntry object1, StationEntry object2) {
101 if (object1.getCalcdist() == object2.getCalcdist())
102 return 0;
103
104 if (object1.getCalcdist() > object2.getCalcdist())
105 return 1;
106 else
107 return -1;
108 }
109 };
110
111 @Override
112 public StationBean lookupStationsByLocation(Location location) {
113
114 long start = System.currentTimeMillis();
115 Location tmpLoc = new Location("GPS");
116
117 LinkedList<StationEntry> entries = new LinkedList<StationEntry>() ;
118
119 for (StationEntry entry : stations.entries) {
120 tmpLoc.setLatitude(entry.getLatitude());
121 tmpLoc.setLongitude(entry.getLongitude());
122
123 int distance = (int) location.distanceTo(tmpLoc);
124
125 if (entries.size() <8 || entries.getLast().getCalcdist() > distance) {
126 entry.setCalcdist(distance);
127
128 if (entries.size() == 8)
129 entries.removeLast();
130
131 entries.addLast(entry);
132
133 Collections.sort( entries, distanceComparator);
134 }
135 }
136
137 logElapsedTime(start, "location_stage1");
138
139 Collections.sort( entries, distanceComparator);
140
141 StationBean tmpStations = new StationBean();
142 for (int i = 0; i<8; i++) {
143 tmpStations.entries.add( entries.get(i) );
144 }
145
146 logElapsedTime(start, "location");
147 return tmpStations;
148 }
149
150 private void logElapsedTime(long start, String method) {
151 long now = System.currentTimeMillis();
152
153 Log.i("TrainInfo", "Search by " + method + " elapsed " + (now-start) );
154 }
155
156 @Override
157 public StationBean lookupStationsByName(String name) {
158
159 long start = System.currentTimeMillis();
160
161 name = name.toLowerCase();
162 StationBean tmpStations = new StationBean();
163 for (StationEntry entry : stations.entries) {
164 if (entry.nameLower.startsWith(name) || entry.nameInternational.startsWith(name) ) {
165 tmpStations.entries.add(entry);
166 }
167 }
168 logElapsedTime(start, "name");
169 return tmpStations;
170 }
171
172 @Override
173 public StationBean lookupStationsByIds(String ids) {
174 IntSet idset = new IntSet();
175 idset.fromString(ids);
176
177 StationBean tmpStations = new StationBean();
178 for (StationEntry entry : stations.entries) {
179 if (idset.contains( entry.getId() ) ) {
180 tmpStations.entries.add(entry);
181 }
182 }
183
184 return tmpStations;
185 }
186
187 }

  ViewVC Help
Powered by ViewVC 1.1.20