diff --git a/OsmAnd/src/net/osmand/AndroidNetworkUtils.java b/OsmAnd/src/net/osmand/AndroidNetworkUtils.java index ae143b7e79..5d4d251686 100644 --- a/OsmAnd/src/net/osmand/AndroidNetworkUtils.java +++ b/OsmAnd/src/net/osmand/AndroidNetworkUtils.java @@ -3,8 +3,9 @@ package net.osmand; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; -import net.osmand.osm.io.Base64; import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -18,7 +19,6 @@ import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -30,6 +30,7 @@ import java.net.URLConnection; import java.net.URLEncoder; import java.net.UnknownHostException; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.zip.GZIPOutputStream; @@ -43,29 +44,53 @@ public class AndroidNetworkUtils { void onResult(String result); } + public static class RequestResponse { + private Request request; + private String response; + + RequestResponse(@NonNull Request request, @Nullable String response) { + this.request = request; + this.response = response; + } + + public Request getRequest() { + return request; + } + + public String getResponse() { + return response; + } + } + + public interface OnRequestsResultListener { + void onResult(@NonNull List results); + } + public static void sendRequestsAsync(final OsmandApplication ctx, final List requests, - final OnRequestResultListener listener) { + final OnRequestsResultListener listener) { - new AsyncTask() { + new AsyncTask>() { @Override - protected String doInBackground(Void... params) { + protected List doInBackground(Void... params) { + List responses = new ArrayList<>(); for (Request request : requests) { try { - return sendRequest(ctx, request.getUrl(), request.getParameters(), + String response = sendRequest(ctx, request.getUrl(), request.getParameters(), request.getUserOperation(), request.isToastAllowed(), request.isPost()); + responses.add(new RequestResponse(request, response)); } catch (Exception e) { - // ignore + responses.add(new RequestResponse(request, null)); } } - return null; + return responses; } @Override - protected void onPostExecute(String response) { + protected void onPostExecute(@NonNull List results) { if (listener != null) { - listener.onResult(response); + listener.onResult(results); } } diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java index d79eb8b717..18dfac848c 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java @@ -17,6 +17,8 @@ import com.android.billingclient.api.SkuDetailsResponseListener; import net.osmand.AndroidNetworkUtils; import net.osmand.AndroidNetworkUtils.OnRequestResultListener; +import net.osmand.AndroidNetworkUtils.OnRequestsResultListener; +import net.osmand.AndroidNetworkUtils.RequestResponse; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -950,68 +952,91 @@ public class InAppPurchaseHelper { Map parameters = new HashMap<>(); parameters.put("userid", userId); parameters.put("sku", purchase.getSku()); + parameters.put("orderId", purchase.getOrderId()); parameters.put("purchaseToken", purchase.getPurchaseToken()); parameters.put("email", email); parameters.put("token", token); addUserInfo(parameters); requests.add(new AndroidNetworkUtils.Request(url, parameters, userOperation, true, true)); } - AndroidNetworkUtils.sendRequestsAsync(ctx, requests, new OnRequestResultListener() { + AndroidNetworkUtils.sendRequestsAsync(ctx, requests, new OnRequestsResultListener() { @Override - public void onResult(String result) { - if (result != null) { - try { - JSONObject obj = new JSONObject(result); - if (!obj.has("error")) { - String tokensSentStr = ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.get(); - Set tokensSent = new HashSet<>(Arrays.asList(tokensSentStr.split(";"))); - for (Purchase purchase : purchases) { - tokensSent.add(purchase.getSku()); - } - ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.set(TextUtils.join(";", tokensSent)); - - if (obj.has("visibleName") && !Algorithms.isEmpty(obj.getString("visibleName"))) { - ctx.getSettings().BILLING_USER_NAME.set(obj.getString("visibleName")); - ctx.getSettings().BILLING_HIDE_USER_NAME.set(false); - } else { - ctx.getSettings().BILLING_HIDE_USER_NAME.set(true); - } - if (obj.has("preferredCountry")) { - String prefferedCountry = obj.getString("preferredCountry"); - if (!ctx.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.get().equals(prefferedCountry)) { - ctx.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.set(prefferedCountry); - CountrySelectionFragment countrySelectionFragment = new CountrySelectionFragment(); - countrySelectionFragment.initCountries(ctx); - CountryItem countryItem = null; - if (Algorithms.isEmpty(prefferedCountry)) { - countryItem = countrySelectionFragment.getCountryItems().get(0); - } else if (!prefferedCountry.equals(OsmandSettings.BILLING_USER_DONATION_NONE_PARAMETER)) { - countryItem = countrySelectionFragment.getCountryItem(prefferedCountry); - } - if (countryItem != null) { - ctx.getSettings().BILLING_USER_COUNTRY.set(countryItem.getLocalName()); - } + public void onResult(@NonNull List results) { + for (RequestResponse rr : results) { + String sku = rr.getRequest().getParameters().get("sku"); + Purchase purchase = getPurchase(sku); + if (purchase != null) { + updateSentTokens(purchase); + String result = rr.getResponse(); + if (result != null) { + try { + JSONObject obj = new JSONObject(result); + if (!obj.has("error")) { + processPurchasedJson(obj); + } else { + complain("SendToken Error: " + + obj.getString("error") + + " (userId=" + userId + " token=" + token + " response=" + result + " google=" + purchase.toString() + ")"); } + } catch (JSONException e) { + logError("SendToken", e); + complain("SendToken Error: " + + (e.getMessage() != null ? e.getMessage() : "JSONException") + + " (userId=" + userId + " token=" + token + " response=" + result + " google=" + purchase.toString() + ")"); } - if (obj.has("email")) { - ctx.getSettings().BILLING_USER_EMAIL.set(obj.getString("email")); - } - } else { - complain("SendToken Error: " - + obj.getString("error") - + " (userId=" + userId + " token=" + token + " response=" + result + ")"); } - } catch (JSONException e) { - logError("SendToken", e); - complain("SendToken Error: " - + (e.getMessage() != null ? e.getMessage() : "JSONException") - + " (userId=" + userId + " token=" + token + " response=" + result + ")"); } } if (listener != null) { listener.onResult("OK"); } } + + private void updateSentTokens(@NonNull Purchase purchase) { + String tokensSentStr = ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.get(); + Set tokensSent = new HashSet<>(Arrays.asList(tokensSentStr.split(";"))); + tokensSent.add(purchase.getSku()); + ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.set(TextUtils.join(";", tokensSent)); + } + + private void processPurchasedJson(JSONObject obj) throws JSONException { + if (obj.has("visibleName") && !Algorithms.isEmpty(obj.getString("visibleName"))) { + ctx.getSettings().BILLING_USER_NAME.set(obj.getString("visibleName")); + ctx.getSettings().BILLING_HIDE_USER_NAME.set(false); + } else { + ctx.getSettings().BILLING_HIDE_USER_NAME.set(true); + } + if (obj.has("preferredCountry")) { + String prefferedCountry = obj.getString("preferredCountry"); + if (!ctx.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.get().equals(prefferedCountry)) { + ctx.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.set(prefferedCountry); + CountrySelectionFragment countrySelectionFragment = new CountrySelectionFragment(); + countrySelectionFragment.initCountries(ctx); + CountryItem countryItem = null; + if (Algorithms.isEmpty(prefferedCountry)) { + countryItem = countrySelectionFragment.getCountryItems().get(0); + } else if (!prefferedCountry.equals(OsmandSettings.BILLING_USER_DONATION_NONE_PARAMETER)) { + countryItem = countrySelectionFragment.getCountryItem(prefferedCountry); + } + if (countryItem != null) { + ctx.getSettings().BILLING_USER_COUNTRY.set(countryItem.getLocalName()); + } + } + } + if (obj.has("email")) { + ctx.getSettings().BILLING_USER_EMAIL.set(obj.getString("email")); + } + } + + @Nullable + private Purchase getPurchase(String sku) { + for (Purchase purchase : purchases) { + if (purchase.getSku().equals(sku)) { + return purchase; + } + } + return null; + } }); } catch (Exception e) { logError("SendToken Error", e);