diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 5c86b3b8f..b6b706a7a 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,8 +2,8 @@ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 4673d7f07..df54f465f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -288,17 +288,7 @@ public class APIHelper implements Action1 { this.showConnectionProblemDialog(R.string.network_error_no_network_body); } else if (throwableClass.equals(HttpException.class)) { HttpException error = (HttpException) throwable; - retrofit2.Response response = error.response(); - ErrorResponse res = null; - - Converter errorConverter = - gsonConverter - .responseBodyConverter(ErrorResponse.class, new Annotation[0], retrofitAdapter); - try { - res = (ErrorResponse) errorConverter.convert(response.errorBody()); - } catch (IOException e) { - e.printStackTrace(); - } + ErrorResponse res = getErrorResponse(error); int status = error.code(); if (status >= 400 && status < 500) { @@ -318,6 +308,18 @@ public class APIHelper implements Action1 { } } + public ErrorResponse getErrorResponse(HttpException error) { + retrofit2.Response response = error.response(); + Converter errorConverter = + gsonConverter + .responseBodyConverter(ErrorResponse.class, new Annotation[0], retrofitAdapter); + try { + return (ErrorResponse) errorConverter.convert(response.errorBody()); + } catch (IOException e) { + return new ErrorResponse(); + } + } + public Observable retrieveUser(boolean withTasks) { Observable userObservable = apiService.getUser(); if (withTasks) { @@ -382,11 +384,6 @@ public class APIHelper implements Action1 { }); } - public PurchaseValidationResult validatePurchase(PurchaseValidationRequest request) throws IOException { - Call response = apiService.validatePurchase(request); - return response.execute().body(); - } - @SuppressWarnings("unchecked") public Observable.Transformer configureApiCallObserver() { return (Observable.Transformer) apiCallTransformer; @@ -400,7 +397,7 @@ public class APIHelper implements Action1 { Amplitude.getInstance().setUserId(this.hostConfig.getUser()); } - public class ErrorResponse { + public static class ErrorResponse { public String message; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.java index e7b85279f..69fca147c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.java @@ -19,6 +19,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import retrofit2.adapter.rxjava.HttpException; + /** * Created by Negue on 26.11.2015. */ @@ -52,20 +54,29 @@ public class HabiticaPurchaseVerifier extends BasePurchaseVerifier { validationRequest.transaction.receipt = purchase.data; validationRequest.transaction.signature = purchase.signature; - try { - PurchaseValidationResult purchaseValidationResult = apiHelper.validatePurchase(validationRequest); - if (purchaseValidationResult.ok) { - purchasedOrderList.add(purchase.orderId); + apiHelper.apiService.validatePurchase(validationRequest).subscribe(purchaseValidationResult -> { + purchasedOrderList.add(purchase.orderId); - verifiedPurchases.add(purchase); + verifiedPurchases.add(purchase); - requestListener.onSuccess(verifiedPurchases); - } else { - requestListener.onError(purchases.indexOf(purchase), new Exception(purchaseValidationResult.data.toString())); + requestListener.onSuccess(verifiedPurchases); + }, throwable -> { + if (throwable.getClass().equals(HttpException.class)) { + HttpException error = (HttpException)throwable; + APIHelper.ErrorResponse res = apiHelper.getErrorResponse((HttpException) throwable); + if (error.code() == 401) { + if (res.message.equals("RECEIPT_ALREADY_USED")) { + purchasedOrderList.add(purchase.orderId); + + verifiedPurchases.add(purchase); + + requestListener.onSuccess(verifiedPurchases); + return; + } + } } - } catch (IOException e) { - e.printStackTrace(); - } + requestListener.onError(purchases.indexOf(purchase), new Exception()); + }); } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 672c7c64c..6ee58416c 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -214,7 +214,7 @@ public interface ApiService { Observable leaveQuest(@Path("gid") String groupId); @POST("/iap/android/verify") - Call validatePurchase(@Body PurchaseValidationRequest request); + Observable validatePurchase(@Body PurchaseValidationRequest request); //Members URL @POST("members/send-private-message")