package fi.iki.murgo.irssinotifier; import java.util.HashMap; import android.app.Activity; import org.apache.http.auth.AuthenticationException; import org.json.JSONArray; import org.json.JSONObject; import fi.iki.murgo.irssinotifier.Server.ServerTarget; import android.os.AsyncTask; import android.util.Log; public class DataFetcherTask extends AsyncTask<Void, Void, DataFetchResult> { private static final String TAG = DataFetcherTask.class.getName(); private final Callback<DataFetchResult> callback; private final String encryptionKey; private final long lastFetchTime; private final Activity activity; public DataFetcherTask(Activity activity, String encryptionKey, long lastFetchTime, Callback<DataFetchResult> callback) { this.activity = activity; this.lastFetchTime = lastFetchTime; this.callback = callback; this.encryptionKey = encryptionKey; } @Override protected DataFetchResult doInBackground(Void... params) { long start = System.nanoTime(); DataFetchResult result = new DataFetchResult(); try { Server server = new Server(activity); boolean authenticated = server.authenticate(); if (!authenticated) { throw new AuthenticationException(); } HashMap<String, String> map = new HashMap<String, String>(); map.put("timestamp", Long.toString(lastFetchTime / 1000)); MessageServerResponse response = (MessageServerResponse) server.get(new MessageToServer(map), ServerTarget.Message); result.setResponse(response); if (!response.wasSuccesful()) { throw new ServerException(); } Log.d(TAG, response.getResponseString()); JSONArray arr = response.getJson().getJSONArray("messages"); if (arr.length() == 0) return result; for (int i = 0; i < arr.length(); i++) { JSONObject object = new JSONObject(arr.getString(i)); IrcMessage message = new IrcMessage(); message.deserialize(object); message.decrypt(encryptionKey); result.getMessages().add(message); } } catch (Exception e) { Log.e(TAG, "Error fetching data from server!", e); e.printStackTrace(); result.setException(e); } finally { double elapsed = (System.nanoTime() - start) / 1e6; Log.d(TAG, "Data fetching done, elapsed ms: " + elapsed); } return result; } @Override protected void onPostExecute(DataFetchResult result) { if (callback != null) { callback.doStuff(result); } } }