package cgeo.geocaching.network; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.AndroidRxUtils; import cgeo.geocaching.utils.DisposableHandler; import cgeo.geocaching.utils.Log; import java.util.Collections; import java.util.concurrent.TimeUnit; import io.reactivex.Scheduler; import okhttp3.Response; import org.apache.commons.lang3.StringUtils; public class Send2CgeoDownloader { private Send2CgeoDownloader() { // Do not instantiate } /** * Asynchronously load caches from the send2cgeo server. * * @param handler the handler to which progress information will be sent * @param listId the list into which caches will be stored */ public static void loadFromWeb(final DisposableHandler handler, final int listId) { final Scheduler.Worker worker = AndroidRxUtils.networkScheduler.createWorker(); handler.add(worker); AndroidRxUtils.networkScheduler.scheduleDirect(new Runnable() { private final Parameters params = new Parameters("code", StringUtils.defaultString(Settings.getWebDeviceCode())); private long baseTime = System.currentTimeMillis(); @Override public void run() { if (System.currentTimeMillis() - baseTime >= 3 * 60000) { // maximum: 3 minutes handler.sendEmptyMessage(DownloadProgress.MSG_DONE); worker.dispose(); return; } // Download new code try { final Response responseFromWeb = Network.getRequest("http://send2.cgeo.org/read.html", params) .flatMap(Network.withSuccess).blockingGet(); final String response = Network.getResponseData(responseFromWeb); if (response != null && response.length() > 2) { handler.sendMessage(handler.obtainMessage(DownloadProgress.MSG_LOADING, response)); Geocache.storeCache(null, response, Collections.singleton(listId), false, null); handler.sendMessage(handler.obtainMessage(DownloadProgress.MSG_LOADED, response)); baseTime = System.currentTimeMillis(); worker.schedule(this); } else if ("RG".equals(response)) { //Server returned RG (registration) and this device no longer registered. Settings.setWebNameCode(null, null); handler.sendEmptyMessage(DownloadProgress.MSG_NO_REGISTRATION); handler.dispose(); } else { worker.schedule(this, 5, TimeUnit.SECONDS); handler.sendEmptyMessage(DownloadProgress.MSG_WAITING); } } catch (final Exception e) { Log.e("loadFromWeb", e); handler.sendEmptyMessage(DownloadProgress.MSG_SERVER_FAIL); handler.dispose(); } } }); } }