package com.fourtails.usuariolecturista.jobs; import android.text.format.Time; import com.activeandroid.ActiveAndroid; import com.activeandroid.query.Delete; import com.activeandroid.query.Select; import com.appspot.ocr_backend.backend.Backend; import com.appspot.ocr_backend.backend.model.MessagesGetPrepays; import com.appspot.ocr_backend.backend.model.MessagesGetPrepaysResponse; import com.appspot.ocr_backend.backend.model.MessagesPrepay; import com.fourtails.usuariolecturista.MainActivity; import com.fourtails.usuariolecturista.model.ChartPrepay; import com.fourtails.usuariolecturista.ottoEvents.BackendObjectsEvent; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.extensions.android.json.AndroidJsonFactory; import com.orhanobut.logger.Logger; import com.path.android.jobqueue.Job; import com.path.android.jobqueue.Params; import java.util.List; /** * GetPrepaysJob async job */ public class GetPrepaysJob extends Job { boolean responseOk = false; boolean retry = true; String accountNumber; public GetPrepaysJob(String accountNumber) { super(new Params(Priority.MID).requireNetwork().groupBy("get-prepay")); this.accountNumber = accountNumber; } @Override public void onAdded() { } @Override public void onRun() throws Throwable { // Use a builder to help formulate the API request. Backend.Builder builder = new Backend.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null); Backend service = builder.build(); MessagesGetPrepays messagesGetPrepays = new MessagesGetPrepays(); messagesGetPrepays.setAccountNumber(accountNumber); MessagesGetPrepaysResponse response = service.prepay().get(messagesGetPrepays).execute(); if (response.getOk()) { List<MessagesPrepay> prepayArray = response.getPrepays(); erasePrepayDataFromLocalDB(); populateDBWithPrepay(prepayArray); Logger.json(response.toPrettyString()); responseOk = true; // Go back to main activity and call the rest of the backend tasks MainActivity.bus.post(new BackendObjectsEvent(BackendObjectsEvent.Type.PREPAY, BackendObjectsEvent.Status.NORMAL)); } else { responseOk = false; if (response.getError().contains("No Prepay events found under specified criteria")) { Logger.d(response.getError()); erasePrepayDataFromLocalDB(); retry = false; // we don't want to retry because there is not going to be new bills right away MainActivity.bus.post(new BackendObjectsEvent(BackendObjectsEvent.Type.PREPAY, BackendObjectsEvent.Status.NOT_FOUND)); } else { Logger.e(response.getError()); } } } /** * Database erase * Erases the db so we don't have to check if the reading already exists and don't put duplicates * erases all the bills so we don't have to compare */ private void erasePrepayDataFromLocalDB() { List<ChartPrepay> tempList = new Select().from(ChartPrepay.class).execute(); if (tempList != null && tempList.size() > 0) { ActiveAndroid.beginTransaction(); try { new Delete().from(ChartPrepay.class).execute(); ActiveAndroid.setTransactionSuccessful(); } catch (Exception e) { Logger.e(e, "error deleting existing db"); } finally { ActiveAndroid.endTransaction(); } } } /** * Database save * This will attempt to save the bills from the backend to the * * @param prepayArray from the backend */ private void populateDBWithPrepay(List<MessagesPrepay> prepayArray) { Time time = new Time(); ActiveAndroid.beginTransaction(); try { for (MessagesPrepay prepays : prepayArray) { long timeInMillis = prepays.getCreationDate().getValue(); time.set(timeInMillis); ChartPrepay chartPrepay = new ChartPrepay( time.monthDay, time.month, time.year, timeInMillis, prepays.getAmount(), prepays.getBalance(), prepays.getPrepay(), prepays.getUrlsafeKey(), prepays.getAccountNumber()); chartPrepay.save(); } ActiveAndroid.setTransactionSuccessful(); } catch (Exception e) { Logger.e(e, "there was an error saving to the database, most likely the data doesn't have" + "the needed fields from the database or they are null"); } finally { ActiveAndroid.endTransaction(); } } @Override protected void onCancel() { Logger.d("GetPrepaysJob canceled"); MainActivity.bus.post(new BackendObjectsEvent(BackendObjectsEvent.Type.PREPAY, BackendObjectsEvent.Status.ERROR)); } @Override protected boolean shouldReRunOnThrowable(Throwable throwable) { return retry; } }