react-native-iap 8.0.5 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/android/src/amazon/java/com/dooboolab/RNIap/RNIapAmazonListener.kt +46 -56
- package/android/src/amazon/java/com/dooboolab/RNIap/RNIapAmazonModule.kt +10 -31
- package/android/src/amazon/java/com/dooboolab/RNIap/RNIapPackage.kt +3 -34
- package/android/src/main/java/com/dooboolab/RNIap/DoobooUtils.kt +17 -16
- package/android/src/play/java/com/dooboolab/RNIap/PlayUtils.kt +3 -42
- package/android/src/play/java/com/dooboolab/RNIap/RNIapModule.kt +56 -50
- package/android/src/play/java/com/dooboolab/RNIap/RNIapPackage.kt +3 -41
- package/ios/RNIapIos.m +4 -2
- package/ios/RNIapIos.swift +20 -18
- package/package.json +1 -1
package/.yarn/install-state.gz
CHANGED
|
Binary file
|
|
@@ -1,40 +1,24 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import java.lang.Class
|
|
5
|
-
import com.facebook.react.bridge.JavaScriptModule
|
|
6
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
|
-
import com.facebook.react.bridge.NativeModule
|
|
8
|
-
import java.util.ArrayList
|
|
9
|
-
import com.dooboolab.RNIap.RNIapAmazonModule
|
|
10
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
11
|
-
import com.facebook.react.bridge.ReactMethod
|
|
12
|
-
import com.facebook.react.bridge.Promise
|
|
13
|
-
import com.amazon.device.iap.PurchasingService
|
|
14
|
-
import com.dooboolab.RNIap.RNIapAmazonListener
|
|
15
|
-
import com.amazon.device.iap.model.RequestId
|
|
16
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
17
|
-
import com.facebook.react.bridge.WritableNativeArray
|
|
18
|
-
import com.facebook.react.bridge.ReadableArray
|
|
19
|
-
import java.util.HashSet
|
|
20
|
-
import com.amazon.device.iap.model.FulfillmentResult
|
|
21
|
-
import com.facebook.react.bridge.ReactContext
|
|
3
|
+
import android.util.Log
|
|
22
4
|
import com.amazon.device.iap.PurchasingListener
|
|
5
|
+
import com.amazon.device.iap.PurchasingService
|
|
23
6
|
import com.amazon.device.iap.model.Product
|
|
24
7
|
import com.amazon.device.iap.model.ProductDataResponse
|
|
25
8
|
import com.amazon.device.iap.model.ProductType
|
|
26
|
-
import
|
|
27
|
-
import android.util.Log
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
|
-
import com.facebook.react.bridge.Arguments
|
|
30
|
-
import com.amazon.device.iap.model.CoinsReward
|
|
9
|
+
import com.amazon.device.iap.model.PurchaseResponse
|
|
31
10
|
import com.amazon.device.iap.model.PurchaseUpdatesResponse
|
|
32
11
|
import com.amazon.device.iap.model.Receipt
|
|
33
|
-
import com.facebook.react.bridge.WritableNativeMap
|
|
34
|
-
import com.amazon.device.iap.model.PurchaseResponse
|
|
35
12
|
import com.amazon.device.iap.model.UserData
|
|
36
13
|
import com.amazon.device.iap.model.UserDataResponse
|
|
14
|
+
import com.facebook.react.bridge.Arguments
|
|
15
|
+
import com.facebook.react.bridge.ReactContext
|
|
16
|
+
import com.facebook.react.bridge.WritableMap
|
|
17
|
+
import com.facebook.react.bridge.WritableNativeArray
|
|
18
|
+
import com.facebook.react.bridge.WritableNativeMap
|
|
37
19
|
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
20
|
+
import java.lang.NumberFormatException
|
|
21
|
+
import java.util.ArrayList
|
|
38
22
|
|
|
39
23
|
class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingListener {
|
|
40
24
|
val TAG = "RNIapAmazonListener"
|
|
@@ -96,20 +80,22 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
|
|
|
96
80
|
items
|
|
97
81
|
)
|
|
98
82
|
}
|
|
99
|
-
ProductDataResponse.RequestStatus.FAILED ->
|
|
100
|
-
.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
83
|
+
ProductDataResponse.RequestStatus.FAILED ->
|
|
84
|
+
DoobooUtils.instance
|
|
85
|
+
.rejectPromisesForKey(
|
|
86
|
+
RNIapAmazonModule.Companion.PROMISE_GET_PRODUCT_DATA,
|
|
87
|
+
E_PRODUCT_DATA_RESPONSE_FAILED,
|
|
88
|
+
null,
|
|
89
|
+
null
|
|
90
|
+
)
|
|
91
|
+
ProductDataResponse.RequestStatus.NOT_SUPPORTED ->
|
|
92
|
+
DoobooUtils.instance
|
|
93
|
+
.rejectPromisesForKey(
|
|
94
|
+
RNIapAmazonModule.Companion.PROMISE_GET_PRODUCT_DATA,
|
|
95
|
+
E_PRODUCT_DATA_RESPONSE_NOT_SUPPORTED,
|
|
96
|
+
null,
|
|
97
|
+
null
|
|
98
|
+
)
|
|
113
99
|
}
|
|
114
100
|
}
|
|
115
101
|
|
|
@@ -317,25 +303,29 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
|
|
|
317
303
|
DoobooUtils.instance
|
|
318
304
|
.resolvePromisesForKey(RNIapAmazonModule.Companion.PROMISE_GET_USER_DATA, item)
|
|
319
305
|
}
|
|
320
|
-
UserDataResponse.RequestStatus.NOT_SUPPORTED ->
|
|
321
|
-
.
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
306
|
+
UserDataResponse.RequestStatus.NOT_SUPPORTED ->
|
|
307
|
+
DoobooUtils.instance
|
|
308
|
+
.rejectPromisesForKey(
|
|
309
|
+
RNIapAmazonModule.Companion.PROMISE_GET_USER_DATA,
|
|
310
|
+
E_USER_DATA_RESPONSE_NOT_SUPPORTED,
|
|
311
|
+
null,
|
|
312
|
+
null
|
|
313
|
+
)
|
|
314
|
+
UserDataResponse.RequestStatus.FAILED ->
|
|
315
|
+
DoobooUtils.instance
|
|
316
|
+
.rejectPromisesForKey(
|
|
317
|
+
RNIapAmazonModule.Companion.PROMISE_GET_USER_DATA,
|
|
318
|
+
E_USER_DATA_RESPONSE_FAILED,
|
|
319
|
+
null,
|
|
320
|
+
null
|
|
321
|
+
)
|
|
334
322
|
}
|
|
335
323
|
}
|
|
336
324
|
|
|
337
325
|
private fun sendEvent(
|
|
338
|
-
reactContext: ReactContext,
|
|
326
|
+
reactContext: ReactContext,
|
|
327
|
+
eventName: String,
|
|
328
|
+
params: WritableMap?
|
|
339
329
|
) {
|
|
340
330
|
reactContext
|
|
341
331
|
.getJSModule(RCTDeviceEventEmitter::class.java)
|
|
@@ -363,4 +353,4 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
|
|
|
363
353
|
availableItems = WritableNativeArray()
|
|
364
354
|
availableItemsType = null
|
|
365
355
|
}
|
|
366
|
-
}
|
|
356
|
+
}
|
|
@@ -1,39 +1,14 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import com.
|
|
4
|
-
import
|
|
5
|
-
import com.facebook.react.bridge.
|
|
3
|
+
import com.amazon.device.iap.PurchasingService
|
|
4
|
+
import com.amazon.device.iap.model.FulfillmentResult
|
|
5
|
+
import com.facebook.react.bridge.Promise
|
|
6
6
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
|
-
import com.facebook.react.bridge.NativeModule
|
|
8
|
-
import java.util.ArrayList
|
|
9
|
-
import com.dooboolab.RNIap.RNIapAmazonModule
|
|
10
7
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
11
8
|
import com.facebook.react.bridge.ReactMethod
|
|
12
|
-
import com.facebook.react.bridge.Promise
|
|
13
|
-
import com.amazon.device.iap.PurchasingService
|
|
14
|
-
import com.dooboolab.RNIap.RNIapAmazonListener
|
|
15
|
-
import com.amazon.device.iap.model.RequestId
|
|
16
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
17
|
-
import com.facebook.react.bridge.WritableNativeArray
|
|
18
9
|
import com.facebook.react.bridge.ReadableArray
|
|
10
|
+
import com.facebook.react.bridge.WritableNativeArray
|
|
19
11
|
import java.util.HashSet
|
|
20
|
-
import com.amazon.device.iap.model.FulfillmentResult
|
|
21
|
-
import com.facebook.react.bridge.ReactContext
|
|
22
|
-
import com.amazon.device.iap.PurchasingListener
|
|
23
|
-
import com.amazon.device.iap.model.Product
|
|
24
|
-
import com.amazon.device.iap.model.ProductDataResponse
|
|
25
|
-
import com.amazon.device.iap.model.ProductType
|
|
26
|
-
import java.lang.NumberFormatException
|
|
27
|
-
import android.util.Log
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
|
-
import com.facebook.react.bridge.Arguments
|
|
30
|
-
import com.amazon.device.iap.model.CoinsReward
|
|
31
|
-
import com.amazon.device.iap.model.PurchaseUpdatesResponse
|
|
32
|
-
import com.amazon.device.iap.model.Receipt
|
|
33
|
-
import com.facebook.react.bridge.WritableNativeMap
|
|
34
|
-
import com.amazon.device.iap.model.PurchaseResponse
|
|
35
|
-
import com.amazon.device.iap.model.UserDataResponse
|
|
36
|
-
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
37
12
|
|
|
38
13
|
class RNIapAmazonModule(reactContext: ReactApplicationContext?) :
|
|
39
14
|
ReactContextBaseJavaModule(reactContext) {
|
|
@@ -105,7 +80,9 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext?) :
|
|
|
105
80
|
|
|
106
81
|
@ReactMethod
|
|
107
82
|
fun acknowledgePurchase(
|
|
108
|
-
token: String?,
|
|
83
|
+
token: String?,
|
|
84
|
+
developerPayLoad: String?,
|
|
85
|
+
promise: Promise
|
|
109
86
|
) {
|
|
110
87
|
PurchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
|
|
111
88
|
promise.resolve(true)
|
|
@@ -113,7 +90,9 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext?) :
|
|
|
113
90
|
|
|
114
91
|
@ReactMethod
|
|
115
92
|
fun consumeProduct(
|
|
116
|
-
token: String?,
|
|
93
|
+
token: String?,
|
|
94
|
+
developerPayLoad: String?,
|
|
95
|
+
promise: Promise
|
|
117
96
|
) {
|
|
118
97
|
PurchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
|
|
119
98
|
promise.resolve(true)
|
|
@@ -1,40 +1,10 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.ReactPackage
|
|
4
|
-
import java.lang.Class
|
|
5
|
-
import com.facebook.react.bridge.JavaScriptModule
|
|
6
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
4
|
import com.facebook.react.bridge.NativeModule
|
|
8
|
-
import
|
|
9
|
-
import com.dooboolab.RNIap.RNIapAmazonModule
|
|
10
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
11
|
-
import com.facebook.react.bridge.ReactMethod
|
|
12
|
-
import com.facebook.react.bridge.Promise
|
|
13
|
-
import com.amazon.device.iap.PurchasingService
|
|
14
|
-
import com.dooboolab.RNIap.RNIapAmazonListener
|
|
15
|
-
import com.amazon.device.iap.model.RequestId
|
|
16
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
17
|
-
import com.facebook.react.bridge.WritableNativeArray
|
|
18
|
-
import com.facebook.react.bridge.ReadableArray
|
|
19
|
-
import java.util.HashSet
|
|
20
|
-
import com.amazon.device.iap.model.FulfillmentResult
|
|
21
|
-
import com.facebook.react.bridge.ReactContext
|
|
22
|
-
import com.amazon.device.iap.PurchasingListener
|
|
23
|
-
import com.amazon.device.iap.model.Product
|
|
24
|
-
import com.amazon.device.iap.model.ProductDataResponse
|
|
25
|
-
import com.amazon.device.iap.model.ProductType
|
|
26
|
-
import java.lang.NumberFormatException
|
|
27
|
-
import android.util.Log
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
|
-
import com.facebook.react.bridge.Arguments
|
|
30
|
-
import com.amazon.device.iap.model.CoinsReward
|
|
31
|
-
import com.amazon.device.iap.model.PurchaseUpdatesResponse
|
|
32
|
-
import com.amazon.device.iap.model.Receipt
|
|
33
|
-
import com.facebook.react.bridge.WritableNativeMap
|
|
34
|
-
import com.amazon.device.iap.model.PurchaseResponse
|
|
35
|
-
import com.amazon.device.iap.model.UserDataResponse
|
|
36
|
-
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
37
6
|
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
import java.util.ArrayList
|
|
38
8
|
|
|
39
9
|
class RNIapPackage : ReactPackage {
|
|
40
10
|
|
|
@@ -47,5 +17,4 @@ class RNIapPackage : ReactPackage {
|
|
|
47
17
|
modules.add(RNIapAmazonModule(reactContext))
|
|
48
18
|
return modules
|
|
49
19
|
}
|
|
50
|
-
|
|
51
|
-
}
|
|
20
|
+
}
|
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import java.util.HashMap
|
|
4
|
-
import java.util.ArrayList
|
|
5
|
-
import com.facebook.react.bridge.Promise
|
|
6
|
-
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
7
3
|
import android.util.Log
|
|
8
|
-
import com.
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
4
|
+
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
5
|
+
import com.facebook.react.bridge.Promise
|
|
6
|
+
import com.facebook.react.bridge.ReadableArray
|
|
7
|
+
import com.facebook.react.bridge.ReadableMap
|
|
8
|
+
import com.facebook.react.bridge.ReadableType
|
|
9
|
+
import com.facebook.react.bridge.WritableArray
|
|
13
10
|
import com.facebook.react.bridge.WritableMap
|
|
11
|
+
import com.facebook.react.bridge.WritableNativeArray
|
|
14
12
|
import com.facebook.react.bridge.WritableNativeMap
|
|
15
13
|
import org.json.JSONArray
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
14
|
+
import org.json.JSONException
|
|
15
|
+
import org.json.JSONObject
|
|
16
|
+
import java.lang.Exception
|
|
17
|
+
import java.util.ArrayList
|
|
18
|
+
import java.util.HashMap
|
|
19
|
+
import kotlin.Throws
|
|
22
20
|
|
|
23
21
|
class DoobooUtils {
|
|
24
22
|
private val promises = HashMap<String, ArrayList<Promise>>()
|
|
@@ -52,7 +50,10 @@ class DoobooUtils {
|
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
fun rejectPromisesForKey(
|
|
55
|
-
key: String,
|
|
53
|
+
key: String,
|
|
54
|
+
code: String?,
|
|
55
|
+
message: String?,
|
|
56
|
+
err: Exception?
|
|
56
57
|
) {
|
|
57
58
|
try {
|
|
58
59
|
if (promises.containsKey(key)) {
|
|
@@ -1,47 +1,8 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import com.facebook.react.bridge.Promise
|
|
4
|
-
import com.android.billingclient.api.BillingClient
|
|
5
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
6
3
|
import android.util.Log
|
|
7
|
-
import com.
|
|
8
|
-
import com.facebook.react.bridge.
|
|
9
|
-
import com.android.billingclient.api.PurchasesUpdatedListener
|
|
10
|
-
import com.facebook.react.bridge.ReactContext
|
|
11
|
-
import com.android.billingclient.api.SkuDetails
|
|
12
|
-
import com.facebook.react.bridge.ReactMethod
|
|
13
|
-
import com.google.android.gms.common.GoogleApiAvailability
|
|
14
|
-
import com.google.android.gms.common.ConnectionResult
|
|
15
|
-
import com.android.billingclient.api.BillingClientStateListener
|
|
16
|
-
import com.android.billingclient.api.BillingResult
|
|
17
|
-
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
18
|
-
import java.lang.Exception
|
|
19
|
-
import com.android.billingclient.api.Purchase
|
|
20
|
-
import com.android.billingclient.api.ConsumeParams
|
|
21
|
-
import com.android.billingclient.api.ConsumeResponseListener
|
|
22
|
-
import com.facebook.react.bridge.WritableNativeArray
|
|
23
|
-
import com.android.billingclient.api.PurchasesResponseListener
|
|
24
|
-
import java.util.ArrayList
|
|
25
|
-
import com.facebook.react.bridge.ReadableArray
|
|
26
|
-
import com.android.billingclient.api.SkuDetailsParams
|
|
27
|
-
import com.android.billingclient.api.SkuDetailsResponseListener
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
|
-
import com.facebook.react.bridge.Arguments
|
|
30
|
-
import com.facebook.react.bridge.WritableNativeMap
|
|
31
|
-
import com.android.billingclient.api.PurchaseHistoryResponseListener
|
|
32
|
-
import com.android.billingclient.api.PurchaseHistoryRecord
|
|
33
|
-
import com.facebook.react.bridge.WritableArray
|
|
34
|
-
import android.app.Activity
|
|
35
|
-
import com.android.billingclient.api.BillingFlowParams
|
|
36
|
-
import com.android.billingclient.api.BillingFlowParams.SubscriptionUpdateParams
|
|
37
|
-
import com.android.billingclient.api.AcknowledgePurchaseParams
|
|
38
|
-
import com.android.billingclient.api.AcknowledgePurchaseResponseListener
|
|
39
|
-
import com.android.billingclient.api.AccountIdentifiers
|
|
40
|
-
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
41
|
-
import com.facebook.react.bridge.LifecycleEventListener
|
|
42
|
-
import com.facebook.react.ReactPackage
|
|
43
|
-
import com.facebook.react.bridge.JavaScriptModule
|
|
44
|
-
import com.facebook.react.bridge.NativeModule
|
|
4
|
+
import com.android.billingclient.api.BillingClient
|
|
5
|
+
import com.facebook.react.bridge.Promise
|
|
45
6
|
|
|
46
7
|
class PlayUtils {
|
|
47
8
|
fun rejectPromiseWithBillingError(promise: Promise, responseCode: Int) {
|
|
@@ -113,4 +74,4 @@ class PlayUtils {
|
|
|
113
74
|
const val E_PLAY_SERVICES_UNAVAILABLE = "E_PLAY_SERVICES_UNAVAILABLE"
|
|
114
75
|
val instance = PlayUtils()
|
|
115
76
|
}
|
|
116
|
-
}
|
|
77
|
+
}
|
|
@@ -1,50 +1,39 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import com.facebook.react.bridge.Promise
|
|
4
|
-
import com.android.billingclient.api.BillingClient
|
|
5
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
6
3
|
import android.util.Log
|
|
7
|
-
import com.
|
|
8
|
-
import com.
|
|
9
|
-
import com.android.billingclient.api.PurchasesUpdatedListener
|
|
10
|
-
import com.facebook.react.bridge.ReactContext
|
|
11
|
-
import com.android.billingclient.api.SkuDetails
|
|
12
|
-
import com.facebook.react.bridge.ReactMethod
|
|
13
|
-
import com.google.android.gms.common.GoogleApiAvailability
|
|
14
|
-
import com.google.android.gms.common.ConnectionResult
|
|
4
|
+
import com.android.billingclient.api.AcknowledgePurchaseParams
|
|
5
|
+
import com.android.billingclient.api.BillingClient
|
|
15
6
|
import com.android.billingclient.api.BillingClientStateListener
|
|
7
|
+
import com.android.billingclient.api.BillingFlowParams
|
|
8
|
+
import com.android.billingclient.api.BillingFlowParams.SubscriptionUpdateParams
|
|
16
9
|
import com.android.billingclient.api.BillingResult
|
|
17
|
-
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
18
|
-
import java.lang.Exception
|
|
19
|
-
import com.android.billingclient.api.Purchase
|
|
20
10
|
import com.android.billingclient.api.ConsumeParams
|
|
21
11
|
import com.android.billingclient.api.ConsumeResponseListener
|
|
22
|
-
import com.
|
|
23
|
-
import com.android.billingclient.api.
|
|
24
|
-
import
|
|
25
|
-
import com.facebook.react.bridge.ReadableArray
|
|
12
|
+
import com.android.billingclient.api.Purchase
|
|
13
|
+
import com.android.billingclient.api.PurchasesUpdatedListener
|
|
14
|
+
import com.android.billingclient.api.SkuDetails
|
|
26
15
|
import com.android.billingclient.api.SkuDetailsParams
|
|
27
|
-
import com.android.billingclient.api.SkuDetailsResponseListener
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
16
|
import com.facebook.react.bridge.Arguments
|
|
17
|
+
import com.facebook.react.bridge.LifecycleEventListener
|
|
18
|
+
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
19
|
+
import com.facebook.react.bridge.Promise
|
|
20
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
21
|
+
import com.facebook.react.bridge.ReactContext
|
|
22
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
23
|
+
import com.facebook.react.bridge.ReactMethod
|
|
24
|
+
import com.facebook.react.bridge.ReadableArray
|
|
25
|
+
import com.facebook.react.bridge.WritableMap
|
|
26
|
+
import com.facebook.react.bridge.WritableNativeArray
|
|
30
27
|
import com.facebook.react.bridge.WritableNativeMap
|
|
31
|
-
import com.android.billingclient.api.PurchaseHistoryResponseListener
|
|
32
|
-
import com.android.billingclient.api.PurchaseHistoryRecord
|
|
33
|
-
import com.facebook.react.bridge.WritableArray
|
|
34
|
-
import android.app.Activity
|
|
35
|
-
import com.android.billingclient.api.BillingFlowParams
|
|
36
|
-
import com.android.billingclient.api.BillingFlowParams.SubscriptionUpdateParams
|
|
37
|
-
import com.android.billingclient.api.AcknowledgePurchaseParams
|
|
38
|
-
import com.android.billingclient.api.AcknowledgePurchaseResponseListener
|
|
39
|
-
import com.android.billingclient.api.AccountIdentifiers
|
|
40
28
|
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
41
|
-
import com.
|
|
42
|
-
import com.
|
|
43
|
-
import
|
|
44
|
-
import com.facebook.react.bridge.NativeModule
|
|
29
|
+
import com.google.android.gms.common.ConnectionResult
|
|
30
|
+
import com.google.android.gms.common.GoogleApiAvailability
|
|
31
|
+
import java.lang.Exception
|
|
45
32
|
import java.math.BigDecimal
|
|
33
|
+
import java.util.ArrayList
|
|
46
34
|
|
|
47
|
-
class RNIapModule(reactContext: ReactApplicationContext) :
|
|
35
|
+
class RNIapModule(reactContext: ReactApplicationContext) :
|
|
36
|
+
ReactContextBaseJavaModule(reactContext),
|
|
48
37
|
PurchasesUpdatedListener {
|
|
49
38
|
val TAG = "RNIapModule"
|
|
50
39
|
private val reactContext: ReactContext
|
|
@@ -162,7 +151,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
162
151
|
}
|
|
163
152
|
billingClient.consumeAsync(consumeParams, listener)
|
|
164
153
|
}
|
|
165
|
-
}
|
|
154
|
+
}
|
|
155
|
+
)
|
|
166
156
|
}
|
|
167
157
|
}
|
|
168
158
|
|
|
@@ -201,7 +191,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
201
191
|
)
|
|
202
192
|
}
|
|
203
193
|
}
|
|
204
|
-
}
|
|
194
|
+
}
|
|
195
|
+
)
|
|
205
196
|
}
|
|
206
197
|
|
|
207
198
|
@ReactMethod
|
|
@@ -287,7 +278,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
287
278
|
}
|
|
288
279
|
}
|
|
289
280
|
}
|
|
290
|
-
}
|
|
281
|
+
}
|
|
282
|
+
)
|
|
291
283
|
}
|
|
292
284
|
|
|
293
285
|
@ReactMethod
|
|
@@ -336,7 +328,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
336
328
|
}
|
|
337
329
|
}
|
|
338
330
|
}
|
|
339
|
-
}
|
|
331
|
+
}
|
|
332
|
+
)
|
|
340
333
|
}
|
|
341
334
|
|
|
342
335
|
@ReactMethod
|
|
@@ -374,7 +367,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
374
367
|
}
|
|
375
368
|
}
|
|
376
369
|
}
|
|
377
|
-
}
|
|
370
|
+
}
|
|
371
|
+
)
|
|
378
372
|
}
|
|
379
373
|
|
|
380
374
|
@ReactMethod
|
|
@@ -433,8 +427,10 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
433
427
|
)
|
|
434
428
|
if (type != BillingClient.SkuType.SUBS) {
|
|
435
429
|
val debugMessage =
|
|
436
|
-
(
|
|
437
|
-
|
|
430
|
+
(
|
|
431
|
+
"IMMEDIATE_AND_CHARGE_PRORATED_PRICE for proration mode only works in" +
|
|
432
|
+
" subscription purchase."
|
|
433
|
+
)
|
|
438
434
|
val error = Arguments.createMap()
|
|
439
435
|
error.putString("debugMessage", debugMessage)
|
|
440
436
|
error.putString("code", PROMISE_BUY_ITEM)
|
|
@@ -481,12 +477,15 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
481
477
|
val errorData: Array<String?> =
|
|
482
478
|
PlayUtils.instance.getBillingResponseData(billingResult.responseCode)
|
|
483
479
|
}
|
|
484
|
-
}
|
|
480
|
+
}
|
|
481
|
+
)
|
|
485
482
|
}
|
|
486
483
|
|
|
487
484
|
@ReactMethod
|
|
488
485
|
fun acknowledgePurchase(
|
|
489
|
-
token: String?,
|
|
486
|
+
token: String?,
|
|
487
|
+
developerPayLoad: String?,
|
|
488
|
+
promise: Promise
|
|
490
489
|
) {
|
|
491
490
|
ensureConnection(
|
|
492
491
|
promise,
|
|
@@ -517,12 +516,15 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
517
516
|
}
|
|
518
517
|
}
|
|
519
518
|
}
|
|
520
|
-
}
|
|
519
|
+
}
|
|
520
|
+
)
|
|
521
521
|
}
|
|
522
522
|
|
|
523
523
|
@ReactMethod
|
|
524
524
|
fun consumeProduct(
|
|
525
|
-
token: String?,
|
|
525
|
+
token: String?,
|
|
526
|
+
developerPayLoad: String?,
|
|
527
|
+
promise: Promise
|
|
526
528
|
) {
|
|
527
529
|
val params = ConsumeParams.newBuilder().setPurchaseToken(token!!).build()
|
|
528
530
|
ensureConnection(
|
|
@@ -550,7 +552,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
550
552
|
}
|
|
551
553
|
}
|
|
552
554
|
}
|
|
553
|
-
}
|
|
555
|
+
}
|
|
556
|
+
)
|
|
554
557
|
}
|
|
555
558
|
|
|
556
559
|
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
|
|
@@ -608,8 +611,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
608
611
|
result.putString("debugMessage", billingResult.debugMessage)
|
|
609
612
|
result.putString(
|
|
610
613
|
"extraMessage",
|
|
611
|
-
"The purchases are null. This is a normal behavior if you have requested DEFERRED"
|
|
612
|
-
|
|
614
|
+
"The purchases are null. This is a normal behavior if you have requested DEFERRED" +
|
|
615
|
+
" proration. If not please report an issue."
|
|
613
616
|
)
|
|
614
617
|
sendEvent(reactContext, "purchase-updated", result)
|
|
615
618
|
DoobooUtils.instance.resolvePromisesForKey(PROMISE_BUY_ITEM, null)
|
|
@@ -640,7 +643,8 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
640
643
|
}
|
|
641
644
|
promise.resolve(true)
|
|
642
645
|
}
|
|
643
|
-
}
|
|
646
|
+
}
|
|
647
|
+
)
|
|
644
648
|
}
|
|
645
649
|
|
|
646
650
|
@ReactMethod
|
|
@@ -663,7 +667,9 @@ class RNIapModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaM
|
|
|
663
667
|
get() = reactApplicationContext.packageName
|
|
664
668
|
|
|
665
669
|
private fun sendEvent(
|
|
666
|
-
reactContext: ReactContext,
|
|
670
|
+
reactContext: ReactContext,
|
|
671
|
+
eventName: String,
|
|
672
|
+
params: WritableMap?
|
|
667
673
|
) {
|
|
668
674
|
reactContext
|
|
669
675
|
.getJSModule(RCTDeviceEventEmitter::class.java)
|
|
@@ -1,48 +1,10 @@
|
|
|
1
1
|
package com.dooboolab.RNIap
|
|
2
2
|
|
|
3
|
-
import com.facebook.react.bridge.Promise
|
|
4
|
-
import com.android.billingclient.api.BillingClient
|
|
5
|
-
import com.dooboolab.RNIap.DoobooUtils
|
|
6
|
-
import android.util.Log
|
|
7
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
|
-
import com.android.billingclient.api.PurchasesUpdatedListener
|
|
10
|
-
import com.facebook.react.bridge.ReactContext
|
|
11
|
-
import com.android.billingclient.api.SkuDetails
|
|
12
|
-
import com.facebook.react.bridge.ReactMethod
|
|
13
|
-
import com.google.android.gms.common.GoogleApiAvailability
|
|
14
|
-
import com.google.android.gms.common.ConnectionResult
|
|
15
|
-
import com.android.billingclient.api.BillingClientStateListener
|
|
16
|
-
import com.android.billingclient.api.BillingResult
|
|
17
|
-
import com.facebook.react.bridge.ObjectAlreadyConsumedException
|
|
18
|
-
import java.lang.Exception
|
|
19
|
-
import com.android.billingclient.api.Purchase
|
|
20
|
-
import com.android.billingclient.api.ConsumeParams
|
|
21
|
-
import com.android.billingclient.api.ConsumeResponseListener
|
|
22
|
-
import com.facebook.react.bridge.WritableNativeArray
|
|
23
|
-
import com.android.billingclient.api.PurchasesResponseListener
|
|
24
|
-
import java.util.ArrayList
|
|
25
|
-
import com.facebook.react.bridge.ReadableArray
|
|
26
|
-
import com.android.billingclient.api.SkuDetailsParams
|
|
27
|
-
import com.android.billingclient.api.SkuDetailsResponseListener
|
|
28
|
-
import com.facebook.react.bridge.WritableMap
|
|
29
|
-
import com.facebook.react.bridge.Arguments
|
|
30
|
-
import com.facebook.react.bridge.WritableNativeMap
|
|
31
|
-
import com.android.billingclient.api.PurchaseHistoryResponseListener
|
|
32
|
-
import com.android.billingclient.api.PurchaseHistoryRecord
|
|
33
|
-
import com.facebook.react.bridge.WritableArray
|
|
34
|
-
import android.app.Activity
|
|
35
|
-
import com.android.billingclient.api.BillingFlowParams
|
|
36
|
-
import com.android.billingclient.api.BillingFlowParams.SubscriptionUpdateParams
|
|
37
|
-
import com.android.billingclient.api.AcknowledgePurchaseParams
|
|
38
|
-
import com.android.billingclient.api.AcknowledgePurchaseResponseListener
|
|
39
|
-
import com.android.billingclient.api.AccountIdentifiers
|
|
40
|
-
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
|
|
41
|
-
import com.facebook.react.bridge.LifecycleEventListener
|
|
42
3
|
import com.facebook.react.ReactPackage
|
|
43
|
-
import com.facebook.react.bridge.JavaScriptModule
|
|
44
4
|
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
45
6
|
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
import java.util.ArrayList
|
|
46
8
|
|
|
47
9
|
class RNIapPackage : ReactPackage {
|
|
48
10
|
|
|
@@ -55,4 +17,4 @@ class RNIapPackage : ReactPackage {
|
|
|
55
17
|
modules.add(RNIapModule(reactContext))
|
|
56
18
|
return modules
|
|
57
19
|
}
|
|
58
|
-
}
|
|
20
|
+
}
|
package/ios/RNIapIos.m
CHANGED
|
@@ -11,7 +11,7 @@ RCT_EXTERN_METHOD(endConnection:
|
|
|
11
11
|
reject:(RCTPromiseRejectBlock)reject)
|
|
12
12
|
RCT_EXTERN_METHOD(getItems:
|
|
13
13
|
(NSArray*)skus
|
|
14
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
14
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
15
15
|
reject:(RCTPromiseRejectBlock)reject)
|
|
16
16
|
RCT_EXTERN_METHOD(getAvailableItems:
|
|
17
17
|
(RCTPromiseResolveBlock)resolve
|
|
@@ -35,7 +35,9 @@ RCT_EXTERN_METHOD(buyProductWithQuantityIOS:
|
|
|
35
35
|
RCT_EXTERN_METHOD(clearTransaction:
|
|
36
36
|
(RCTPromiseResolveBlock)resolve
|
|
37
37
|
reject:(RCTPromiseRejectBlock)reject)
|
|
38
|
-
RCT_EXTERN_METHOD(clearProducts
|
|
38
|
+
RCT_EXTERN_METHOD(clearProducts:
|
|
39
|
+
(RCTPromiseResolveBlock)resolve
|
|
40
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
39
41
|
RCT_EXTERN_METHOD(promotedProduct:
|
|
40
42
|
(RCTPromiseResolveBlock)resolve
|
|
41
43
|
reject:(RCTPromiseRejectBlock)reject)
|
package/ios/RNIapIos.swift
CHANGED
|
@@ -236,8 +236,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
236
236
|
addPromise(forKey: prod.productIdentifier, resolve: resolve, reject: reject)
|
|
237
237
|
|
|
238
238
|
let payment: SKMutablePayment = SKMutablePayment(product: prod)
|
|
239
|
-
|
|
240
|
-
if #available(iOS 12.2, *) {
|
|
239
|
+
|
|
240
|
+
if #available(iOS 12.2, tvOS 12.2, *) {
|
|
241
241
|
let discount: SKPaymentDiscount = SKPaymentDiscount(
|
|
242
242
|
identifier: discountOffer["identifier"]!,
|
|
243
243
|
keyIdentifier: discountOffer["keyIdentifier"]!,
|
|
@@ -318,9 +318,9 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
318
318
|
for transaction in pendingTrans {
|
|
319
319
|
SKPaymentQueue.default().finishTransaction(transaction)
|
|
320
320
|
}
|
|
321
|
-
} else {
|
|
322
|
-
resolve(nil)
|
|
323
321
|
}
|
|
322
|
+
resolve(nil)
|
|
323
|
+
|
|
324
324
|
}
|
|
325
325
|
|
|
326
326
|
|
|
@@ -333,6 +333,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
333
333
|
lockQueue.sync {
|
|
334
334
|
validProducts.removeAll()
|
|
335
335
|
}
|
|
336
|
+
resolve(nil)
|
|
336
337
|
}
|
|
337
338
|
|
|
338
339
|
@objc public func promotedProduct(
|
|
@@ -379,6 +380,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
379
380
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
380
381
|
) {
|
|
381
382
|
finishTransaction(withIdentifier: transactionIdentifier)
|
|
383
|
+
resolve(nil)
|
|
382
384
|
}
|
|
383
385
|
|
|
384
386
|
|
|
@@ -414,7 +416,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
414
416
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
415
417
|
) {
|
|
416
418
|
#if !os(tvOS)
|
|
417
|
-
if #available(iOS 14.0, *) {
|
|
419
|
+
if #available(iOS 14.0, tvOS 14.0, *) {
|
|
418
420
|
SKPaymentQueue.default().presentCodeRedemptionSheet()
|
|
419
421
|
resolve(nil)
|
|
420
422
|
} else {
|
|
@@ -625,7 +627,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
625
627
|
return descriptions[0]
|
|
626
628
|
}
|
|
627
629
|
|
|
628
|
-
if code > descriptions.count - 1 {
|
|
630
|
+
if code > descriptions.count - 1 || code < 0 { // Fix crash app without internet connection
|
|
629
631
|
return descriptions[0]
|
|
630
632
|
}
|
|
631
633
|
return descriptions[code]
|
|
@@ -652,8 +654,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
652
654
|
var periodUnitIOS = ""
|
|
653
655
|
|
|
654
656
|
var itemType = "iap"
|
|
655
|
-
|
|
656
|
-
if #available(iOS 11.2, *) {
|
|
657
|
+
|
|
658
|
+
if #available(iOS 11.2, tvOS 11.2, *) {
|
|
657
659
|
let numOfUnits = UInt(product.subscriptionPeriod?.numberOfUnits ?? 0)
|
|
658
660
|
let unit = product.subscriptionPeriod?.unit
|
|
659
661
|
|
|
@@ -716,22 +718,22 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
716
718
|
introductoryPriceSubscriptionPeriod = ""
|
|
717
719
|
}
|
|
718
720
|
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
if #available(iOS 10.0, *) {
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
if #available(iOS 10.0, tvOS 10.0, *) {
|
|
723
725
|
currencyCode = product.priceLocale.currencyCode
|
|
724
726
|
}
|
|
725
|
-
|
|
726
|
-
if #available(iOS 13.0, *) {
|
|
727
|
+
|
|
728
|
+
if #available(iOS 13.0, tvOS 13.0, *) {
|
|
727
729
|
countryCode = SKPaymentQueue.default().storefront?.countryCode
|
|
728
|
-
} else if #available(iOS 10.0, *) {
|
|
730
|
+
} else if #available(iOS 10.0, tvOS 10.0, *) {
|
|
729
731
|
countryCode = product.priceLocale.regionCode
|
|
730
732
|
}
|
|
731
733
|
|
|
732
734
|
var discounts: [[String: String?]]?
|
|
733
|
-
|
|
734
|
-
if #available(iOS 12.2, *) {
|
|
735
|
+
|
|
736
|
+
if #available(iOS 12.2, tvOS 12.2, *) {
|
|
735
737
|
discounts = getDiscountData(product)
|
|
736
738
|
}
|
|
737
739
|
|
|
@@ -761,7 +763,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
761
763
|
|
|
762
764
|
|
|
763
765
|
func getDiscountData(_ product: SKProduct) -> [[String:String?]]? {
|
|
764
|
-
if #available(iOS 12.2, *) {
|
|
766
|
+
if #available(iOS 12.2, tvOS 12.2, *) {
|
|
765
767
|
var mappedDiscounts : [[String:String?]] = []
|
|
766
768
|
var localizedPrice: String?
|
|
767
769
|
var paymendMode: String?
|