From 0a275cb1d5cca3aa89a92ac9f23924e90d23f621 Mon Sep 17 00:00:00 2001 From: denkeni Date: Tue, 24 Dec 2019 18:13:38 +0800 Subject: [PATCH 1/2] Fix double precision issue and inconsistent return type on Android --- .../main/java/com/dooboolab/RNIap/RNIapModule.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/dooboolab/RNIap/RNIapModule.java b/android/src/main/java/com/dooboolab/RNIap/RNIapModule.java index a8dfd8909..b3aa3c426 100644 --- a/android/src/main/java/com/dooboolab/RNIap/RNIapModule.java +++ b/android/src/main/java/com/dooboolab/RNIap/RNIapModule.java @@ -18,6 +18,7 @@ import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ObjectAlreadyConsumedException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -255,7 +256,13 @@ public void onSkuDetailsResponse(BillingResult billingResult, List s for (SkuDetails skuDetails : skuDetailsList) { WritableMap item = Arguments.createMap(); item.putString("productId", skuDetails.getSku()); - item.putDouble("price", skuDetails.getPriceAmountMicros() / 1000000f); + long priceAmountMicros = skuDetails.getPriceAmountMicros(); + // Use valueOf instead of constructors. + // See: https://www.javaworld.com/article/2073176/caution--double-to-bigdecimal-in-java.html + BigDecimal priceAmount = BigDecimal.valueOf(priceAmountMicros); + BigDecimal microUnitsDivisor = BigDecimal.valueOf(1000000); + String price = priceAmount.divide(microUnitsDivisor).toString(); + item.putString("price", price); item.putString("currency", skuDetails.getPriceCurrencyCode()); item.putString("type", skuDetails.getType()); item.putString("localizedPrice", skuDetails.getPrice()); @@ -269,7 +276,9 @@ public void onSkuDetailsResponse(BillingResult billingResult, List s // new item.putString("iconUrl", skuDetails.getIconUrl()); item.putString("originalJson", skuDetails.getOriginalJson()); - item.putDouble("originalPrice", skuDetails.getOriginalPriceAmountMicros() / 1000000f); + BigDecimal originalPriceAmountMicros = BigDecimal.valueOf(skuDetails.getOriginalPriceAmountMicros()); + String originalPrice = originalPriceAmountMicros.divide(microUnitsDivisor).toString(); + item.putString("originalPrice", originalPrice); items.pushMap(item); } From 1766e93c8e297ec70d3915bf181a8b037255c6b2 Mon Sep 17 00:00:00 2001 From: denkeni Date: Tue, 24 Dec 2019 18:15:35 +0800 Subject: [PATCH 2/2] Improve document based on current implementations --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0c789bafb..9455e5caf 100644 --- a/README.md +++ b/README.md @@ -290,10 +290,10 @@ Each `product` returns from `getProducts()` contains: Property | iOS | And | Comment -------- | :-: | :-: | ------- -`price` | ✓ | ✓ | Will return localizedPrice on Android (default) or a string price (eg. `1.99`) (iOS). +`price` | ✓ | ✓ | Localized price string, with only number (eg. `1.99`). `productId` | ✓ | ✓ | Returns a string needed to purchase the item later. `currency` | ✓ | ✓ | Returns the currency code. -`localizedPrice` | ✓ | ✓ | Use localizedPrice if you want to display the price to the user so you don't need to worry about currency symbols. +`localizedPrice` | ✓ | ✓ | Localized price string, with number and currency symbol (eg. `$1.99`). `title` | ✓ | ✓ | Returns the title Android and localizedTitle on iOS. `description` | ✓ | ✓ | Returns the localized description on Android and iOS. `introductoryPrice` | ✓ | ✓ | Formatted introductory price of a subscription, including its currency sign, such as €3.99.
The price doesn't include tax.