package org.tyszecki.rozkladpkp; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.os.AsyncTask; import android.text.TextUtils; import android.text.format.Time; public class ExternalDelayFetcher { private static HashMap<String, Integer> delays = new HashMap<String, Integer>(); private static Time lastUpdate = null; public static interface ExternalDelayFetcherCallback{ void ready(HashMap<String, Integer> delays, boolean cached); } static boolean isUpToDate() { if(lastUpdate == null) { lastUpdate = new Time(); lastUpdate.setToNow(); } //Nie aktualizujmy za często. long umi = lastUpdate.toMillis(false); Time current = new Time(); current.setToNow(); long nmi = current.toMillis(false); return !(delays.isEmpty() || nmi-umi < 1000*60*3); } static HashMap<String, Integer> getDelays() { return delays; } static void requestUpdate(final ExternalDelayFetcherCallback callback) { class DealyTask extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... arg0) { //Prosty skrypt w pythonie parsuje stronę PR i wysyła mi wyniki. //To lepsze niż parsowanie bezpośrednio w aplikacji: //- W Pythonie można to napisać łatwiej, //- Jeśli PR coś zmienią w formacie danych, wystarczy zmiana skryptu żeby działała ta aplikacja //- Mogę dodawać do skryptu dane o opóźnieniach z innych źródeł String url = "http://opoznienia.appspot.com"; DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); request.addHeader("Content-Type", "application/x-www-form-urlencoded"); HttpResponse response = null; InputStream inputStream = null; try { response = client.execute(request); HttpEntity entity = response.getEntity(); inputStream = entity.getContent(); } catch (Exception e) { e.printStackTrace(); } ByteArrayOutputStream content = new ByteArrayOutputStream(); byte[] sBuffer = new byte[512]; // Read response into a buffered stream int readBytes = 0; try { while ((readBytes = inputStream.read(sBuffer)) != -1) { content.write(sBuffer, 0, readBytes); } } catch (Exception e) { e.printStackTrace(); } // Return result from buffered stream TextUtils.StringSplitter lineSplitter = new TextUtils.SimpleStringSplitter('\n'); lineSplitter.setString(new String(content.toByteArray())); delays.clear(); for(String s : lineSplitter) { int col = s.indexOf(':'); try{ if(col > -1) delays.put(s.substring(0, col), Integer.parseInt(s.substring(col+1))); }catch(Exception e) { return null; } } return null; } protected void onPostExecute(Void result) { callback.ready(delays, false); } } new DealyTask().execute(null,null,null); } }