X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FSendTransactionTask.java;h=5170b9337a362dbcafc55cd6e66360056521157a;hp=4c3bc477b8ddfeb43c82bd5e9268cb6f0105b232;hb=54002a662d97289a739d3cdb9888bbab58a8064f;hpb=d8ced1da25da339175349264b49dac379408f65a diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java index 4c3bc477..5170b933 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java @@ -17,17 +17,20 @@ package net.ktnx.mobileledger.async; +import android.content.res.Resources; import android.os.AsyncTask; import android.util.Log; +import android.util.SparseArray; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; -import net.ktnx.mobileledger.json.ParsedLedgerTransaction; +import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.model.LedgerTransactionAccount; import net.ktnx.mobileledger.model.MobileLedgerProfile; import net.ktnx.mobileledger.utils.Globals; +import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.NetworkUtil; import net.ktnx.mobileledger.utils.UrlEncodedFormData; @@ -38,6 +41,8 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.Map; @@ -54,36 +59,64 @@ public class SendTransactionTask extends AsyncTask 0.3) -// throw new RuntimeException("Simulated test exception"); -// } -// catch (InterruptedException ex) { -// Logger.debug("network", ex.toString()); -// } -// -// return true; -// } + private boolean send_1_15_OK() throws IOException { + HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add"); + http.setRequestMethod("PUT"); + http.setRequestProperty("Content-Type", "application/json"); + http.setRequestProperty("Accept", "*/*"); + net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction jsonTransaction = + net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction.fromLedgerTransaction(ltr); + ObjectMapper mapper = new ObjectMapper(); + ObjectWriter writer = + mapper.writerFor(net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction.class); + String body = writer.writeValueAsString(jsonTransaction); + + return sendRequest(http, body); + } + private boolean send_1_14_OK() throws IOException { HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add"); http.setRequestMethod("PUT"); http.setRequestProperty("Content-Type", "application/json"); http.setRequestProperty("Accept", "*/*"); - ParsedLedgerTransaction jsonTransaction; - jsonTransaction = ltr.toParsedLedgerTransaction(); + net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction jsonTransaction = + net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction.fromLedgerTransaction(ltr); ObjectMapper mapper = new ObjectMapper(); - ObjectWriter writer = mapper.writerFor(ParsedLedgerTransaction.class); + ObjectWriter writer = + mapper.writerFor(net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction.class); String body = writer.writeValueAsString(jsonTransaction); + return sendRequest(http, body); + } + private boolean sendRequest(HttpURLConnection http, String body) throws IOException { + if (simulate) { + debug("network", "The request would be: " + body); + try { + Thread.sleep(1500); + if (Math.random() > 0.3) + throw new RuntimeException("Simulated test exception"); + } + catch (InterruptedException ex) { + Logger.debug("network", ex.toString()); + } + + return true; + } + byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8); http.setDoOutput(true); http.setDoInput(true); @@ -106,6 +139,7 @@ public class SendTransactionTask extends AsyncTask= 2) - throw new IOException(String.format("aborting after %d tries", tried)); - sleep(100); - } + switch (mProfile.getApiVersion()) { + case auto: + Logger.debug("network", "Trying version 1.5."); + if (!send_1_15_OK()) { + Logger.debug("network", "Version 1.5 request failed. Trying with 1.14"); + if (!send_1_14_OK()) { + Logger.debug("network", "Version 1.14 failed too. Trying HTML form emulation"); + legacySendOkWithRetry(); + } + else { + Logger.debug("network", "Version 1.14 request succeeded"); + } + } + else { + Logger.debug("network", "Version 1.15 request succeeded"); + } + break; + case html: + legacySendOkWithRetry(); + break; + case pre_1_15: + send_1_14_OK(); + break; + case post_1_14: + send_1_15_OK(); + break; + default: + throw new IllegalStateException( + "Unexpected API version: " + mProfile.getApiVersion()); } } catch (Exception e) { @@ -233,10 +293,56 @@ public class SendTransactionTask extends AsyncTask= 2) + throw new IOException( + String.format("aborting after %d tries", tried)); + sleep(100); + } + } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); taskCallback.done(error); } + + public enum API { + auto(0), html(-1), pre_1_15(-2), post_1_14(-3); + private static SparseArray map = new SparseArray<>(); + + static { + for (API item : API.values()) { + map.put(item.value, item); + } + } + + private int value; + + API(int value) { + this.value = value; + } + public static API valueOf(int i) { + return map.get(i, auto); + } + public int toInt() { + return this.value; + } + public String getDescription(Resources resources) { + switch (this) { + case auto: + return resources.getString(R.string.api_auto); + case html: + return resources.getString(R.string.api_html); + case pre_1_15: + return resources.getString(R.string.api_pre_1_15); + case post_1_14: + return resources.getString(R.string.api_post_1_14); + default: + throw new IllegalStateException("Unexpected value: " + value); + } + } + } }