expo-iap 3.1.8 → 3.1.9

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.
Files changed (51) hide show
  1. package/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt +69 -2
  2. package/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +62 -4
  3. package/build/index.d.ts +32 -2
  4. package/build/index.d.ts.map +1 -1
  5. package/build/index.js +40 -15
  6. package/build/index.js.map +1 -1
  7. package/build/modules/android.d.ts +68 -0
  8. package/build/modules/android.d.ts.map +1 -1
  9. package/build/modules/android.js +74 -0
  10. package/build/modules/android.js.map +1 -1
  11. package/build/modules/ios.d.ts +23 -0
  12. package/build/modules/ios.d.ts.map +1 -1
  13. package/build/modules/ios.js +34 -3
  14. package/build/modules/ios.js.map +1 -1
  15. package/build/types.d.ts +116 -13
  16. package/build/types.d.ts.map +1 -1
  17. package/build/types.js.map +1 -1
  18. package/build/useIAP.d.ts +8 -0
  19. package/build/useIAP.d.ts.map +1 -1
  20. package/build/useIAP.js +11 -1
  21. package/build/useIAP.js.map +1 -1
  22. package/bun.lockb +0 -0
  23. package/coverage/clover.xml +258 -234
  24. package/coverage/coverage-final.json +3 -3
  25. package/coverage/lcov-report/index.html +27 -27
  26. package/coverage/lcov-report/src/helpers/index.html +1 -1
  27. package/coverage/lcov-report/src/helpers/subscription.ts.html +1 -1
  28. package/coverage/lcov-report/src/index.html +19 -19
  29. package/coverage/lcov-report/src/index.ts.html +136 -31
  30. package/coverage/lcov-report/src/modules/android.ts.html +257 -8
  31. package/coverage/lcov-report/src/modules/index.html +23 -23
  32. package/coverage/lcov-report/src/modules/ios.ts.html +137 -11
  33. package/coverage/lcov-report/src/utils/debug.ts.html +1 -1
  34. package/coverage/lcov-report/src/utils/errorMapping.ts.html +1 -1
  35. package/coverage/lcov-report/src/utils/index.html +1 -1
  36. package/coverage/lcov.info +473 -429
  37. package/ios/ExpoIapHelper.swift +4 -0
  38. package/ios/ExpoIapModule.swift +33 -1
  39. package/openiap-versions.json +3 -3
  40. package/package.json +1 -1
  41. package/plugin/build/withIAP.d.ts +26 -0
  42. package/plugin/build/withIAP.js +67 -3
  43. package/plugin/build/withLocalOpenIAP.d.ts +2 -0
  44. package/plugin/build/withLocalOpenIAP.js +7 -0
  45. package/plugin/src/withIAP.ts +141 -3
  46. package/plugin/src/withLocalOpenIAP.ts +14 -4
  47. package/src/index.ts +49 -14
  48. package/src/modules/android.ts +83 -0
  49. package/src/modules/ios.ts +45 -3
  50. package/src/types.ts +124 -13
  51. package/src/useIAP.ts +26 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">96.49% </span>
26
+ <span class="strong">94.43% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>496/514</span>
28
+ <span class='fraction'>509/539</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">87.23% </span>
33
+ <span class="strong">87.06% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>246/282</span>
35
+ <span class='fraction'>249/286</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">85.71% </span>
40
+ <span class="strong">78.78% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>78/91</span>
42
+ <span class='fraction'>78/99</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">96.7% </span>
47
+ <span class="strong">94.5% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>470/486</span>
49
+ <span class='fraction'>482/510</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83
- <td data-value="98.51" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 98%"></div><div class="cover-empty" style="width: 2%"></div></div>
83
+ <td data-value="96.61" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
85
85
  </td>
86
- <td data-value="98.51" class="pct high">98.51%</td>
87
- <td data-value="202" class="abs high">199/202</td>
88
- <td data-value="89.88" class="pct high">89.88%</td>
89
- <td data-value="89" class="abs high">80/89</td>
90
- <td data-value="76.92" class="pct medium">76.92%</td>
91
- <td data-value="39" class="abs medium">30/39</td>
92
- <td data-value="98.93" class="pct high">98.93%</td>
93
- <td data-value="188" class="abs high">186/188</td>
86
+ <td data-value="96.61" class="pct high">96.61%</td>
87
+ <td data-value="207" class="abs high">200/207</td>
88
+ <td data-value="89.24" class="pct high">89.24%</td>
89
+ <td data-value="93" class="abs high">83/93</td>
90
+ <td data-value="73.17" class="pct medium">73.17%</td>
91
+ <td data-value="41" class="abs medium">30/41</td>
92
+ <td data-value="96.87" class="pct high">96.87%</td>
93
+ <td data-value="192" class="abs high">186/192</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -110,17 +110,17 @@
110
110
 
111
111
  <tr>
112
112
  <td class="file high" data-value="src/modules"><a href="src/modules/index.html">src/modules</a></td>
113
- <td data-value="100" class="pic high">
114
- <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
113
+ <td data-value="94.44" class="pic high">
114
+ <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div>
115
115
  </td>
116
- <td data-value="100" class="pct high">100%</td>
117
- <td data-value="124" class="abs high">124/124</td>
116
+ <td data-value="94.44" class="pct high">94.44%</td>
117
+ <td data-value="144" class="abs high">136/144</td>
118
118
  <td data-value="98.18" class="pct high">98.18%</td>
119
119
  <td data-value="55" class="abs high">54/55</td>
120
- <td data-value="100" class="pct high">100%</td>
121
- <td data-value="24" class="abs high">24/24</td>
122
- <td data-value="100" class="pct high">100%</td>
123
- <td data-value="116" class="abs high">116/116</td>
120
+ <td data-value="80" class="pct high">80%</td>
121
+ <td data-value="30" class="abs high">24/30</td>
122
+ <td data-value="94.11" class="pct high">94.11%</td>
123
+ <td data-value="136" class="abs high">128/136</td>
124
124
  </tr>
125
125
 
126
126
  <tr>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2025-10-02T12:14:35.833Z
149
+ at 2025-10-04T11:58:08.312Z
150
150
  </div>
151
151
  <script src="prettify.js"></script>
152
152
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2025-10-02T12:14:35.833Z
104
+ at 2025-10-04T11:58:08.312Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <script>
@@ -484,7 +484,7 @@ export const hasActiveSubscriptions = async (
484
484
  <div class='footer quiet pad2 space-top1 center small'>
485
485
  Code coverage generated by
486
486
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
487
- at 2025-10-02T12:14:35.833Z
487
+ at 2025-10-04T11:58:08.312Z
488
488
  </div>
489
489
  <script src="../../prettify.js"></script>
490
490
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">98.51% </span>
26
+ <span class="strong">96.61% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>199/202</span>
28
+ <span class='fraction'>200/207</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">89.88% </span>
33
+ <span class="strong">89.24% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>80/89</span>
35
+ <span class='fraction'>83/93</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">76.92% </span>
40
+ <span class="strong">73.17% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>30/39</span>
42
+ <span class='fraction'>30/41</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">98.93% </span>
47
+ <span class="strong">96.87% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>186/188</span>
49
+ <span class='fraction'>186/192</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
83
- <td data-value="98.51" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 98%"></div><div class="cover-empty" style="width: 2%"></div></div>
83
+ <td data-value="96.61" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
85
85
  </td>
86
- <td data-value="98.51" class="pct high">98.51%</td>
87
- <td data-value="202" class="abs high">199/202</td>
88
- <td data-value="89.88" class="pct high">89.88%</td>
89
- <td data-value="89" class="abs high">80/89</td>
90
- <td data-value="76.92" class="pct medium">76.92%</td>
91
- <td data-value="39" class="abs medium">30/39</td>
92
- <td data-value="98.93" class="pct high">98.93%</td>
93
- <td data-value="188" class="abs high">186/188</td>
86
+ <td data-value="96.61" class="pct high">96.61%</td>
87
+ <td data-value="207" class="abs high">200/207</td>
88
+ <td data-value="89.24" class="pct high">89.24%</td>
89
+ <td data-value="93" class="abs high">83/93</td>
90
+ <td data-value="73.17" class="pct medium">73.17%</td>
91
+ <td data-value="41" class="abs medium">30/41</td>
92
+ <td data-value="96.87" class="pct high">96.87%</td>
93
+ <td data-value="192" class="abs high">186/192</td>
94
94
  </tr>
95
95
 
96
96
  </tbody>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2025-10-02T12:14:35.833Z
104
+ at 2025-10-04T11:58:08.312Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">98.51% </span>
26
+ <span class="strong">96.61% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>199/202</span>
28
+ <span class='fraction'>200/207</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">89.88% </span>
33
+ <span class="strong">89.24% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>80/89</span>
35
+ <span class='fraction'>83/93</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">76.92% </span>
40
+ <span class="strong">73.17% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>30/39</span>
42
+ <span class='fraction'>30/41</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">98.93% </span>
47
+ <span class="strong">96.87% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>186/188</span>
49
+ <span class='fraction'>186/192</span>
50
50
  </div>
51
51
 
52
52
 
@@ -696,7 +696,42 @@
696
696
  <a name='L631'></a><a href='#L631'>631</a>
697
697
  <a name='L632'></a><a href='#L632'>632</a>
698
698
  <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
700
735
  <span class="cline-any cline-yes">1x</span>
701
736
  <span class="cline-any cline-yes">1x</span>
702
737
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -736,6 +771,7 @@
736
771
  <span class="cline-any cline-neutral">&nbsp;</span>
737
772
  <span class="cline-any cline-neutral">&nbsp;</span>
738
773
  <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
775
  <span class="cline-any cline-yes">1x</span>
740
776
  <span class="cline-any cline-yes">1x</span>
741
777
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -755,6 +791,8 @@
755
791
  <span class="cline-any cline-yes">1x</span>
756
792
  <span class="cline-any cline-yes">1x</span>
757
793
  <span class="cline-any cline-yes">1x</span>
794
+ <span class="cline-any cline-yes">1x</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
796
  <span class="cline-any cline-neutral">&nbsp;</span>
759
797
  <span class="cline-any cline-neutral">&nbsp;</span>
760
798
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -891,6 +929,43 @@
891
929
  <span class="cline-any cline-yes">1x</span>
892
930
  <span class="cline-any cline-neutral">&nbsp;</span>
893
931
  <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-yes">1x</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
969
  <span class="cline-any cline-yes">1x</span>
895
970
  <span class="cline-any cline-yes">1x</span>
896
971
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1073,19 +1148,14 @@
1073
1148
  <span class="cline-any cline-neutral">&nbsp;</span>
1074
1149
  <span class="cline-any cline-neutral">&nbsp;</span>
1075
1150
  <span class="cline-any cline-neutral">&nbsp;</span>
1076
- <span class="cline-any cline-neutral">&nbsp;</span>
1077
1151
  <span class="cline-any cline-yes">5x</span>
1078
- <span class="cline-any cline-yes">2x</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1081
1153
  <span class="cline-any cline-neutral">&nbsp;</span>
1082
- <span class="cline-any cline-yes">3x</span>
1083
- <span class="cline-any cline-yes">2x</span>
1084
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-yes">4x</span>
1085
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
1086
1157
  <span class="cline-any cline-neutral">&nbsp;</span>
1087
1158
  <span class="cline-any cline-neutral">&nbsp;</span>
1088
- <span class="cline-any cline-yes">1x</span>
1089
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
1090
1160
  <span class="cline-any cline-neutral">&nbsp;</span>
1091
1161
  <span class="cline-any cline-yes">4x</span>
@@ -1368,6 +1438,7 @@ import type {
1368
1438
  RequestSubscriptionPropsByPlatforms,
1369
1439
  RequestSubscriptionAndroidProps,
1370
1440
  RequestSubscriptionIosProps,
1441
+ UserChoiceBillingDetails,
1371
1442
  } from './types';
1372
1443
  import {ErrorCode} from './types';
1373
1444
  import {createPurchaseError, type PurchaseError} from './utils/errorMapping';
@@ -1388,12 +1459,14 @@ export enum OpenIapEvent {
1388
1459
  PurchaseUpdated = 'purchase-updated',
1389
1460
  PurchaseError = 'purchase-error',
1390
1461
  PromotedProductIOS = 'promoted-product-ios',
1462
+ UserChoiceBillingAndroid = 'user-choice-billing-android',
1391
1463
  }
1392
1464
  &nbsp;
1393
1465
  type ExpoIapEventPayloads = {
1394
1466
  [OpenIapEvent.PurchaseUpdated]: Purchase;
1395
1467
  [OpenIapEvent.PurchaseError]: PurchaseError;
1396
1468
  [OpenIapEvent.PromotedProductIOS]: Product;
1469
+ [OpenIapEvent.UserChoiceBillingAndroid]: UserChoiceBillingDetails;
1397
1470
  };
1398
1471
  &nbsp;
1399
1472
  type ExpoIapEventListener&lt;E extends OpenIapEvent&gt; = (
@@ -1524,8 +1597,45 @@ export const promotedProductListenerIOS = (
1524
1597
  return emitter.addListener(OpenIapEvent.PromotedProductIOS, listener);
1525
1598
  };
1526
1599
  &nbsp;
1527
- export const initConnection: MutationField&lt;'initConnection'&gt; = async () =&gt;
1528
- ExpoIapModule.initConnection();
1600
+ /**
1601
+ * Android-only listener for User Choice Billing events.
1602
+ * This fires when a user selects alternative billing instead of Google Play billing
1603
+ * in the User Choice Billing dialog (only in 'user-choice' mode).
1604
+ *
1605
+ * @param listener - Callback function that receives the external transaction token and product IDs
1606
+ * @returns EventSubscription that can be used to unsubscribe
1607
+ *
1608
+ * @example
1609
+ * ```typescript
1610
+ * const subscription = userChoiceBillingListenerAndroid((details) =&gt; {
1611
+ * console.log('User selected alternative billing');
1612
+ * console.log('Token:', details.externalTransactionToken);
1613
+ * console.log('Products:', details.products);
1614
+ *
1615
+ * // Process payment in your system, then report token to Google
1616
+ * await processPaymentAndReportToken(details);
1617
+ * });
1618
+ *
1619
+ * // Later, clean up
1620
+ * subscription.remove();
1621
+ * ```
1622
+ *
1623
+ * @platform Android
1624
+ */
1625
+ export const userChoiceBillingListenerAndroid = <span class="fstat-no" title="function not covered" >(</span>
1626
+ listener: (details: UserChoiceBillingDetails) =&gt; void,
1627
+ ) =&gt; {
1628
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Platform.OS !== 'android') {</span>
1629
+ <span class="cstat-no" title="statement not covered" > ExpoIapConsole.warn(</span>
1630
+ 'userChoiceBillingListenerAndroid: This listener is only available on Android',
1631
+ );
1632
+ <span class="cstat-no" title="statement not covered" > return {remove: <span class="fstat-no" title="function not covered" >() =</span>&gt; {}};</span>
1633
+ }
1634
+ <span class="cstat-no" title="statement not covered" > return emitter.addListener(OpenIapEvent.UserChoiceBillingAndroid, listener);</span>
1635
+ };
1636
+ &nbsp;
1637
+ export const initConnection: MutationField&lt;'initConnection'&gt; = async (config) =&gt;
1638
+ ExpoIapModule.initConnection(config ?? null);
1529
1639
  &nbsp;
1530
1640
  export const endConnection: MutationField&lt;'endConnection'&gt; = async () =&gt;
1531
1641
  ExpoIapModule.endConnection();
@@ -1706,20 +1816,15 @@ export const requestPurchase: MutationField&lt;'requestPurchase'&gt; = async (
1706
1816
  );
1707
1817
  }
1708
1818
  &nbsp;
1709
- let payload: MutationRequestPurchaseArgs;
1710
- if (canonical === 'in-app') {
1711
- payload = {
1712
- type: 'in-app',
1713
- request: request as RequestPurchasePropsByPlatforms,
1714
- };
1715
- } else if (canonical === 'subs') {
1716
- payload = {
1717
- type: 'subs',
1718
- request: request as RequestSubscriptionPropsByPlatforms,
1719
- };
1720
- } else {
1819
+ if (canonical !== 'in-app' &amp;&amp; canonical !== 'subs') {
1721
1820
  throw new Error(`Unsupported product type: ${canonical}`);
1722
1821
  }
1822
+ &nbsp;
1823
+ const payload: MutationRequestPurchaseArgs = {
1824
+ type: canonical === 'in-app' ? 'in-app' : 'subs',
1825
+ request,
1826
+ useAlternativeBilling: args.useAlternativeBilling,
1827
+ };
1723
1828
  &nbsp;
1724
1829
  const purchase = (await ExpoIapModule.requestPurchase(payload)) as
1725
1830
  | Purchase
@@ -1969,7 +2074,7 @@ export {<span class="fstat-no" title="function not covered" >ExpoIapConsole}</sp
1969
2074
  <div class='footer quiet pad2 space-top1 center small'>
1970
2075
  Code coverage generated by
1971
2076
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1972
- at 2025-10-02T12:14:35.833Z
2077
+ at 2025-10-04T11:58:08.312Z
1973
2078
  </div>
1974
2079
  <script src="../prettify.js"></script>
1975
2080
  <script>