@capacitor-community/stripe-terminal 6.0.0-1 → 6.0.0

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.
@@ -13,6 +13,6 @@ Pod::Spec.new do |s|
13
13
  s.source_files = 'ios/Plugin/**/*.{swift,h,m,c,cc,mm,cpp}'
14
14
  s.ios.deployment_target = '13.0'
15
15
  s.dependency 'Capacitor'
16
- s.dependency 'StripeTerminal', '~> 2.17.1'
16
+ s.dependency 'StripeTerminal', '~> 3.4.0'
17
17
  s.swift_version = '5.1'
18
18
  end
package/README.md CHANGED
@@ -5,8 +5,8 @@ We have confirmed that it works well in the demo project. Please refer to https:
5
5
 
6
6
  - [x] Tap To Pay
7
7
  - [x] Internet
8
- - [ ] Bluetooth
9
- - [ ] USB
8
+ - [x] Bluetooth
9
+ - [x] USB
10
10
 
11
11
  ## Install
12
12
 
@@ -27,8 +27,9 @@ Add permissions to your `android/app/src/main/AndroidManifest.xml` file:
27
27
  + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
28
28
  + <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
29
29
  + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
30
- + <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
31
30
  + <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
31
+ + <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
32
+ + <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
32
33
  ```
33
34
 
34
35
  If used in conjunction with the `@capacitor-community/stripe` plugin, the following settings may be necessary
@@ -50,12 +51,14 @@ And update minSdkVersion to 26 And compileSdkVersion to 34 in your `android/app/
50
51
  ext {
51
52
  - minSdkVersion = 22
52
53
  - compileSdkVersion = 33
53
- + minSdkVersion = 26
54
+ + minSdkVersion = 30
54
55
  + compileSdkVersion = 34
55
56
  ```
56
57
 
57
58
  ## Usage
58
59
 
60
+ ### use native http client for getting a token
61
+
59
62
  ```typescript
60
63
  (async ()=> {
61
64
  /**
@@ -69,26 +72,63 @@ And update minSdkVersion to 26 And compileSdkVersion to 34 in your `android/app/
69
72
  await StripeTerminal.connectReader({
70
73
  reader: readers[0],
71
74
  });
72
- await StripeTerminal.collect({ paymentIntent: "**************" });
75
+ // Collect payment intent
76
+ await StripeTerminal.collectPaymentMethod({ paymentIntent: "**************" });
77
+ // Process and confirm payment intent
78
+ await StripeTerminal.confirmPaymentIntent();
79
+ // disconnect reader
80
+ await StripeTerminal.disconnectReader();
73
81
  });
74
82
  ```
75
83
 
84
+ ### set string token
85
+
86
+ ```typescript
87
+ (async ()=> {
88
+ // run before StripeTerminal.initialize
89
+ StripeTerminal.addListener(TerminalEventsEnum.RequestedConnectionToken, async () => {
90
+ const { token } = (await fetch("https://example.com/token")).json();
91
+ StripeTerminal.setConnectionToken({ token });
92
+ });
93
+ });
94
+ (async ()=> {
95
+ await StripeTerminal.initialize({ isTest: true })
96
+ const { readers } = await StripeTerminal.discoverReaders({
97
+ type: TerminalConnectTypes.TapToPay,
98
+ locationId: "**************",
99
+ });
100
+ await StripeTerminal.connectReader({
101
+ reader: readers[0],
102
+ });
103
+ // Collect payment intent
104
+ await StripeTerminal.collectPaymentMethod({ paymentIntent: "**************" });
105
+ // Process and confirm payment intent
106
+ await StripeTerminal.confirmPaymentIntent();
107
+ // disconnect reader
108
+ await StripeTerminal.disconnectReader();
109
+ });
110
+ ````
111
+
76
112
  ## API
77
113
 
78
114
  <docgen-index>
79
115
 
80
116
  * [`initialize(...)`](#initialize)
81
117
  * [`discoverReaders(...)`](#discoverreaders)
118
+ * [`setConnectionToken(...)`](#setconnectiontoken)
82
119
  * [`connectReader(...)`](#connectreader)
83
120
  * [`getConnectedReader()`](#getconnectedreader)
84
121
  * [`disconnectReader()`](#disconnectreader)
85
122
  * [`cancelDiscoverReaders()`](#canceldiscoverreaders)
86
- * [`collect(...)`](#collect)
87
- * [`cancelCollect()`](#cancelcollect)
123
+ * [`collectPaymentMethod(...)`](#collectpaymentmethod)
124
+ * [`cancelCollectPaymentMethod()`](#cancelcollectpaymentmethod)
125
+ * [`confirmPaymentIntent()`](#confirmpaymentintent)
88
126
  * [`addListener(TerminalEventsEnum.Loaded, ...)`](#addlistenerterminaleventsenumloaded)
127
+ * [`addListener(TerminalEventsEnum.RequestedConnectionToken, ...)`](#addlistenerterminaleventsenumrequestedconnectiontoken)
89
128
  * [`addListener(TerminalEventsEnum.DiscoveredReaders, ...)`](#addlistenerterminaleventsenumdiscoveredreaders)
90
129
  * [`addListener(TerminalEventsEnum.ConnectedReader, ...)`](#addlistenerterminaleventsenumconnectedreader)
91
- * [`addListener(TerminalEventsEnum.Completed, ...)`](#addlistenerterminaleventsenumcompleted)
130
+ * [`addListener(TerminalEventsEnum.ConfirmedPaymentIntent, ...)`](#addlistenerterminaleventsenumconfirmedpaymentintent)
131
+ * [`addListener(TerminalEventsEnum.CollectedPaymentIntent, ...)`](#addlistenerterminaleventsenumcollectedpaymentintent)
92
132
  * [`addListener(TerminalEventsEnum.Canceled, ...)`](#addlistenerterminaleventsenumcanceled)
93
133
  * [`addListener(TerminalEventsEnum.Failed, ...)`](#addlistenerterminaleventsenumfailed)
94
134
  * [Interfaces](#interfaces)
@@ -103,12 +143,12 @@ And update minSdkVersion to 26 And compileSdkVersion to 34 in your `android/app/
103
143
  ### initialize(...)
104
144
 
105
145
  ```typescript
106
- initialize(options: { tokenProviderEndpoint: string; isTest: boolean; }) => Promise<void>
146
+ initialize(options: { tokenProviderEndpoint?: string; isTest: boolean; }) => Promise<void>
107
147
  ```
108
148
 
109
- | Param | Type |
110
- | ------------- | ---------------------------------------------------------------- |
111
- | **`options`** | <code>{ tokenProviderEndpoint: string; isTest: boolean; }</code> |
149
+ | Param | Type |
150
+ | ------------- | ----------------------------------------------------------------- |
151
+ | **`options`** | <code>{ tokenProviderEndpoint?: string; isTest: boolean; }</code> |
112
152
 
113
153
  --------------------
114
154
 
@@ -128,6 +168,19 @@ discoverReaders(options: { type: TerminalConnectTypes; locationId?: string; }) =
128
168
  --------------------
129
169
 
130
170
 
171
+ ### setConnectionToken(...)
172
+
173
+ ```typescript
174
+ setConnectionToken(options: { token: string; }) => Promise<void>
175
+ ```
176
+
177
+ | Param | Type |
178
+ | ------------- | ------------------------------- |
179
+ | **`options`** | <code>{ token: string; }</code> |
180
+
181
+ --------------------
182
+
183
+
131
184
  ### connectReader(...)
132
185
 
133
186
  ```typescript
@@ -170,10 +223,10 @@ cancelDiscoverReaders() => Promise<void>
170
223
  --------------------
171
224
 
172
225
 
173
- ### collect(...)
226
+ ### collectPaymentMethod(...)
174
227
 
175
228
  ```typescript
176
- collect(options: { paymentIntent: string; }) => Promise<void>
229
+ collectPaymentMethod(options: { paymentIntent: string; }) => Promise<void>
177
230
  ```
178
231
 
179
232
  | Param | Type |
@@ -183,10 +236,19 @@ collect(options: { paymentIntent: string; }) => Promise<void>
183
236
  --------------------
184
237
 
185
238
 
186
- ### cancelCollect()
239
+ ### cancelCollectPaymentMethod()
187
240
 
188
241
  ```typescript
189
- cancelCollect() => Promise<void>
242
+ cancelCollectPaymentMethod() => Promise<void>
243
+ ```
244
+
245
+ --------------------
246
+
247
+
248
+ ### confirmPaymentIntent()
249
+
250
+ ```typescript
251
+ confirmPaymentIntent() => Promise<void>
190
252
  ```
191
253
 
192
254
  --------------------
@@ -208,6 +270,22 @@ addListener(eventName: TerminalEventsEnum.Loaded, listenerFunc: () => void) => P
208
270
  --------------------
209
271
 
210
272
 
273
+ ### addListener(TerminalEventsEnum.RequestedConnectionToken, ...)
274
+
275
+ ```typescript
276
+ addListener(eventName: TerminalEventsEnum.RequestedConnectionToken, listenerFunc: () => void) => Promise<PluginListenerHandle>
277
+ ```
278
+
279
+ | Param | Type |
280
+ | ------------------ | ------------------------------------------------------------------------------------------ |
281
+ | **`eventName`** | <code><a href="#terminaleventsenum">TerminalEventsEnum.RequestedConnectionToken</a></code> |
282
+ | **`listenerFunc`** | <code>() =&gt; void</code> |
283
+
284
+ **Returns:** <code>Promise&lt;<a href="#pluginlistenerhandle">PluginListenerHandle</a>&gt;</code>
285
+
286
+ --------------------
287
+
288
+
211
289
  ### addListener(TerminalEventsEnum.DiscoveredReaders, ...)
212
290
 
213
291
  ```typescript
@@ -240,16 +318,32 @@ addListener(eventName: TerminalEventsEnum.ConnectedReader, listenerFunc: () => v
240
318
  --------------------
241
319
 
242
320
 
243
- ### addListener(TerminalEventsEnum.Completed, ...)
321
+ ### addListener(TerminalEventsEnum.ConfirmedPaymentIntent, ...)
322
+
323
+ ```typescript
324
+ addListener(eventName: TerminalEventsEnum.ConfirmedPaymentIntent, listenerFunc: () => void) => Promise<PluginListenerHandle>
325
+ ```
326
+
327
+ | Param | Type |
328
+ | ------------------ | ---------------------------------------------------------------------------------------- |
329
+ | **`eventName`** | <code><a href="#terminaleventsenum">TerminalEventsEnum.ConfirmedPaymentIntent</a></code> |
330
+ | **`listenerFunc`** | <code>() =&gt; void</code> |
331
+
332
+ **Returns:** <code>Promise&lt;<a href="#pluginlistenerhandle">PluginListenerHandle</a>&gt;</code>
333
+
334
+ --------------------
335
+
336
+
337
+ ### addListener(TerminalEventsEnum.CollectedPaymentIntent, ...)
244
338
 
245
339
  ```typescript
246
- addListener(eventName: TerminalEventsEnum.Completed, listenerFunc: () => void) => Promise<PluginListenerHandle>
340
+ addListener(eventName: TerminalEventsEnum.CollectedPaymentIntent, listenerFunc: () => void) => Promise<PluginListenerHandle>
247
341
  ```
248
342
 
249
- | Param | Type |
250
- | ------------------ | --------------------------------------------------------------------------- |
251
- | **`eventName`** | <code><a href="#terminaleventsenum">TerminalEventsEnum.Completed</a></code> |
252
- | **`listenerFunc`** | <code>() =&gt; void</code> |
343
+ | Param | Type |
344
+ | ------------------ | ---------------------------------------------------------------------------------------- |
345
+ | **`eventName`** | <code><a href="#terminaleventsenum">TerminalEventsEnum.CollectedPaymentIntent</a></code> |
346
+ | **`listenerFunc`** | <code>() =&gt; void</code> |
253
347
 
254
348
  **Returns:** <code>Promise&lt;<a href="#pluginlistenerhandle">PluginListenerHandle</a>&gt;</code>
255
349
 
@@ -322,15 +416,17 @@ addListener(eventName: TerminalEventsEnum.Failed, listenerFunc: () => void) => P
322
416
 
323
417
  #### TerminalEventsEnum
324
418
 
325
- | Members | Value |
326
- | ----------------------------- | ---------------------------------------------- |
327
- | **`Loaded`** | <code>'terminalLoaded'</code> |
328
- | **`DiscoveredReaders`** | <code>'terminalDiscoveredReaders'</code> |
329
- | **`CancelDiscoveredReaders`** | <code>'terminalCancelDiscoveredReaders'</code> |
330
- | **`ConnectedReader`** | <code>'terminalConnectedReader'</code> |
331
- | **`DisconnectedReader`** | <code>'terminalDisconnectedReader'</code> |
332
- | **`Completed`** | <code>'terminalCompleted'</code> |
333
- | **`Canceled`** | <code>'terminalCanceled'</code> |
334
- | **`Failed`** | <code>'terminalFailed'</code> |
419
+ | Members | Value |
420
+ | ------------------------------ | ----------------------------------------------- |
421
+ | **`Loaded`** | <code>'terminalLoaded'</code> |
422
+ | **`DiscoveredReaders`** | <code>'terminalDiscoveredReaders'</code> |
423
+ | **`CancelDiscoveredReaders`** | <code>'terminalCancelDiscoveredReaders'</code> |
424
+ | **`ConnectedReader`** | <code>'terminalConnectedReader'</code> |
425
+ | **`DisconnectedReader`** | <code>'terminalDisconnectedReader'</code> |
426
+ | **`ConfirmedPaymentIntent`** | <code>'terminalConfirmedPaymentIntent'</code> |
427
+ | **`CollectedPaymentIntent`** | <code>'terminalCollectedPaymentIntent'</code> |
428
+ | **`Canceled`** | <code>'terminalCanceled'</code> |
429
+ | **`Failed`** | <code>'terminalFailed'</code> |
430
+ | **`RequestedConnectionToken`** | <code>'terminalRequestedConnectionToken'</code> |
335
431
 
336
432
  </docgen-api>
@@ -7,11 +7,11 @@ ext {
7
7
  playServicesWalletVersion = project.hasProperty('playServicesWalletVersion') ? rootProject.ext.playServicesWalletVersion : '19.2.+'
8
8
  volleyVersion = project.hasProperty('volleyVersion') ? rootProject.ext.volleyVersion : '1.2.1'
9
9
  stripeterminalLocalmobileVersion = project.hasProperty('stripeterminalLocalmobileVersion') ? rootProject.ext.stripeterminalLocalmobileVersion : '3.0.+'
10
- stripeterminalCoreVersion = project.hasProperty('stripeterminalCoreVersion') ? rootProject.ext.stripeterminalCoreVersion : '3.1.+'
10
+ stripeterminalCoreVersion = project.hasProperty('stripeterminalCoreVersion') ? rootProject.ext.stripeterminalCoreVersion : '3.4.+'
11
11
  }
12
12
 
13
13
  buildscript {
14
- ext.kotlin_version = project.hasProperty("kotlin_version") ? rootProject.ext.kotlin_version : '1.9.10'
14
+ ext.kotlin_version = project.hasProperty("kotlin_version") ? rootProject.ext.kotlin_version : '1.8.20'
15
15
  repositories {
16
16
  google()
17
17
  mavenCentral()
@@ -27,7 +27,7 @@ apply plugin: 'kotlin-android'
27
27
 
28
28
  android {
29
29
  namespace "com.getcapacitor.community.stripe.terminal"
30
- compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
30
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
31
31
  defaultConfig {
32
32
  minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
33
33
  targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34
@@ -7,12 +7,10 @@ import android.bluetooth.BluetoothAdapter;
7
7
  import android.content.Context;
8
8
  import android.content.pm.PackageManager;
9
9
  import android.util.Log;
10
-
11
10
  import androidx.annotation.NonNull;
12
11
  import androidx.annotation.Nullable;
13
12
  import androidx.core.app.ActivityCompat;
14
13
  import androidx.core.util.Supplier;
15
-
16
14
  import com.getcapacitor.JSArray;
17
15
  import com.getcapacitor.JSObject;
18
16
  import com.getcapacitor.PluginCall;
@@ -26,6 +24,7 @@ import com.stripe.stripeterminal.external.callable.DiscoveryListener;
26
24
  import com.stripe.stripeterminal.external.callable.PaymentIntentCallback;
27
25
  import com.stripe.stripeterminal.external.callable.ReaderCallback;
28
26
  import com.stripe.stripeterminal.external.callable.ReaderListener;
27
+ import com.stripe.stripeterminal.external.callable.ReaderReconnectionListener;
29
28
  import com.stripe.stripeterminal.external.callable.TerminalListener;
30
29
  import com.stripe.stripeterminal.external.models.CardPresentDetails;
31
30
  import com.stripe.stripeterminal.external.models.CollectConfiguration;
@@ -42,29 +41,30 @@ import com.stripe.stripeterminal.external.models.Reader;
42
41
  import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate;
43
42
  import com.stripe.stripeterminal.external.models.TerminalException;
44
43
  import com.stripe.stripeterminal.log.LogLevel;
45
-
46
- import org.jetbrains.annotations.NotNull;
47
-
48
44
  import java.util.ArrayList;
49
45
  import java.util.List;
50
46
  import java.util.Objects;
47
+ import org.jetbrains.annotations.NotNull;
51
48
 
52
49
  public class StripeTerminal extends Executor {
53
50
 
51
+ private TokenProvider tokenProvider;
54
52
  private Cancelable discoveryCancelable;
55
53
  private Cancelable collectCancelable;
56
54
  private List<Reader> readers;
57
55
  private String locationId;
58
56
  private PluginCall collectCall;
57
+ private PluginCall confirmPaymentIntentCall;
59
58
  private final JSObject emptyObject = new JSObject();
60
59
  private Boolean isTest;
61
60
  private TerminalConnectTypes terminalConnectType;
61
+ private PaymentIntent paymentIntentInstance;
62
62
 
63
63
  public StripeTerminal(
64
- Supplier<Context> contextSupplier,
65
- Supplier<Activity> activitySupplier,
66
- BiConsumer<String, JSObject> notifyListenersFunction,
67
- String pluginLogTag
64
+ Supplier<Context> contextSupplier,
65
+ Supplier<Activity> activitySupplier,
66
+ BiConsumer<String, JSObject> notifyListenersFunction,
67
+ String pluginLogTag
68
68
  ) {
69
69
  super(contextSupplier, activitySupplier, notifyListenersFunction, pluginLogTag, "StripeTerminalExecutor");
70
70
  this.contextSupplier = contextSupplier;
@@ -77,21 +77,21 @@ public class StripeTerminal extends Executor {
77
77
  BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
78
78
  if (!bluetooth.isEnabled()) {
79
79
  if (
80
- ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.BLUETOOTH_CONNECT) ==
81
- PackageManager.PERMISSION_GRANTED
80
+ ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.BLUETOOTH_CONNECT) ==
81
+ PackageManager.PERMISSION_GRANTED
82
82
  ) {
83
83
  bluetooth.enable();
84
84
  }
85
85
  }
86
86
 
87
87
  this.activitySupplier.get()
88
- .runOnUiThread(
89
- () -> {
90
- TerminalApplicationDelegate.onCreate((Application) this.contextSupplier.get().getApplicationContext());
91
- notifyListeners(TerminalEnumEvent.Loaded.getWebEventName(), emptyObject);
92
- call.resolve();
93
- }
94
- );
88
+ .runOnUiThread(
89
+ () -> {
90
+ TerminalApplicationDelegate.onCreate((Application) this.contextSupplier.get().getApplicationContext());
91
+ notifyListeners(TerminalEnumEvent.Loaded.getWebEventName(), emptyObject);
92
+ call.resolve();
93
+ }
94
+ );
95
95
  TerminalListener listener = new TerminalListener() {
96
96
  @Override
97
97
  public void onUnexpectedReaderDisconnect(@NonNull Reader reader) {
@@ -100,24 +100,32 @@ public class StripeTerminal extends Executor {
100
100
 
101
101
  @Override
102
102
  public void onConnectionStatusChange(@NonNull ConnectionStatus status) {
103
- // TODO: Listenerを追加
103
+ // TODO: Listenerを追加
104
104
  }
105
105
 
106
106
  @Override
107
107
  public void onPaymentStatusChange(@NonNull PaymentStatus status) {
108
- // TODO: Listenerを追加
108
+ // TODO: Listenerを追加
109
109
  }
110
110
  };
111
111
  LogLevel logLevel = LogLevel.VERBOSE;
112
- TokenProvider tokenProvider = new TokenProvider(this.contextSupplier, call.getString("tokenProviderEndpoint"));
112
+ this.tokenProvider =
113
+ new TokenProvider(this.contextSupplier, call.getString("tokenProviderEndpoint", ""), this.notifyListenersFunction);
113
114
  if (!Terminal.isInitialized()) {
114
- Terminal.initTerminal(this.contextSupplier.get().getApplicationContext(), logLevel, tokenProvider, listener);
115
+ Terminal.initTerminal(this.contextSupplier.get().getApplicationContext(), logLevel, this.tokenProvider, listener);
115
116
  }
116
117
  Terminal.getInstance();
117
118
  }
118
119
 
119
- public void onDiscoverReaders(final PluginCall call) {
120
- if (ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
120
+ public void setConnectionToken(PluginCall call) {
121
+ this.tokenProvider.setConnectionToken(call);
122
+ }
123
+
124
+ public void onDiscoverReaders(final PluginCall call) {
125
+ if (
126
+ ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.ACCESS_FINE_LOCATION) !=
127
+ PackageManager.PERMISSION_GRANTED
128
+ ) {
121
129
  Log.d(this.logTag, "android.permission.ACCESS_FINE_LOCATION permission is not granted.");
122
130
  call.reject("android.permission.ACCESS_FINE_LOCATION permission is not granted.");
123
131
  return;
@@ -134,7 +142,10 @@ public class StripeTerminal extends Executor {
134
142
  } else if (Objects.equals(call.getString("type"), TerminalConnectTypes.Usb.getWebEventName())) {
135
143
  config = new DiscoveryConfiguration.UsbDiscoveryConfiguration(0, this.isTest);
136
144
  this.terminalConnectType = TerminalConnectTypes.Usb;
137
- } else if (Objects.equals(call.getString("type"), TerminalConnectTypes.Bluetooth.getWebEventName()) || Objects.equals(call.getString("type"), TerminalConnectTypes.Simulated.getWebEventName())) {
145
+ } else if (
146
+ Objects.equals(call.getString("type"), TerminalConnectTypes.Bluetooth.getWebEventName()) ||
147
+ Objects.equals(call.getString("type"), TerminalConnectTypes.Simulated.getWebEventName())
148
+ ) {
138
149
  config = new DiscoveryConfiguration.BluetoothDiscoveryConfiguration(0, this.isTest);
139
150
  this.terminalConnectType = TerminalConnectTypes.Bluetooth;
140
151
  } else {
@@ -156,21 +167,23 @@ public class StripeTerminal extends Executor {
156
167
  call.resolve(new JSObject().put("readers", readersJSObject));
157
168
  };
158
169
  discoveryCancelable =
159
- Terminal.getInstance()
160
- .discoverReaders(
161
- config,
162
- discoveryListener,
163
- new Callback() {
164
- @Override
165
- public void onSuccess() {
166
- Log.d(logTag, "Finished discovering readers");
167
- }
168
- @Override
169
- public void onFailure(@NonNull TerminalException ex) {
170
- Log.d(logTag, ex.getLocalizedMessage());
171
- }
172
- }
173
- );
170
+ Terminal
171
+ .getInstance()
172
+ .discoverReaders(
173
+ config,
174
+ discoveryListener,
175
+ new Callback() {
176
+ @Override
177
+ public void onSuccess() {
178
+ Log.d(logTag, "Finished discovering readers");
179
+ }
180
+
181
+ @Override
182
+ public void onFailure(@NonNull TerminalException ex) {
183
+ Log.d(logTag, ex.getLocalizedMessage());
184
+ }
185
+ }
186
+ );
174
187
  }
175
188
 
176
189
  public void connectReader(final PluginCall call) {
@@ -229,53 +242,53 @@ public class StripeTerminal extends Executor {
229
242
  }
230
243
 
231
244
  LocalMobileConnectionConfiguration config = new LocalMobileConnectionConfiguration(
232
- this.locationId
245
+ this.locationId,
246
+ true,
247
+ this.localMobileReaderReconnectionListener
233
248
  );
234
- Terminal
235
- .getInstance()
236
- .connectLocalMobileReader(
237
- this.readers.get(reader.getInteger("index")),
238
- config,
239
- this.readerCallback(call)
240
- );
249
+ Terminal.getInstance().connectLocalMobileReader(this.readers.get(reader.getInteger("index")), config, this.readerCallback(call));
241
250
  }
242
251
 
252
+ ReaderReconnectionListener localMobileReaderReconnectionListener = new ReaderReconnectionListener() {
253
+ @Override
254
+ public void onReaderReconnectStarted(@NonNull Reader reader, @NonNull Cancelable cancelReconnect) {
255
+ // 1. Notified at the start of a reconnection attempt
256
+ // Use cancelable to stop reconnection at any time
257
+ }
258
+
259
+ @Override
260
+ public void onReaderReconnectSucceeded(@NonNull Reader reader) {
261
+ // 2. Notified when reader reconnection succeeds
262
+ // App is now connected
263
+ }
264
+
265
+ @Override
266
+ public void onReaderReconnectFailed(@NonNull Reader reader) {
267
+ // 3. Notified when reader reconnection fails
268
+ // App is now disconnected
269
+ }
270
+ };
271
+
243
272
  private void connectInternetReader(final PluginCall call) {
244
273
  JSObject reader = call.getObject("reader");
245
274
  InternetConnectionConfiguration config = new InternetConnectionConfiguration();
246
- Terminal
247
- .getInstance()
248
- .connectInternetReader(
249
- this.readers.get(reader.getInteger("index")),
250
- config,
251
- this.readerCallback(call)
252
- );
275
+ Terminal.getInstance().connectInternetReader(this.readers.get(reader.getInteger("index")), config, this.readerCallback(call));
253
276
  }
254
277
 
255
278
  private void connectUsbReader(final PluginCall call) {
256
279
  JSObject reader = call.getObject("reader");
257
280
  UsbConnectionConfiguration config = new UsbConnectionConfiguration(this.locationId);
258
281
  Terminal
259
- .getInstance()
260
- .connectUsbReader(
261
- this.readers.get(reader.getInteger("index")),
262
- config,
263
- this.readerListener(),
264
- this.readerCallback(call)
265
- );
282
+ .getInstance()
283
+ .connectUsbReader(this.readers.get(reader.getInteger("index")), config, this.readerListener(), this.readerCallback(call));
266
284
  }
267
285
 
268
286
  private void connectBluetoothReader(final PluginCall call) {
269
287
  JSObject reader = call.getObject("reader");
270
288
  BluetoothConnectionConfiguration config = new BluetoothConnectionConfiguration(this.locationId);
271
289
  Terminal
272
- .getInstance()
273
- .connectBluetoothReader(
274
- this.readers.get(reader.getInteger("index")),
275
- config,
276
- this.readerListener(),
277
- this.readerCallback(call)
278
- );
290
+ .getInstance()
291
+ .connectBluetoothReader(this.readers.get(reader.getInteger("index")), config, this.readerListener(), this.readerCallback(call));
279
292
  }
280
293
 
281
294
  public void cancelDiscoverReaders(final PluginCall call) {
@@ -299,7 +312,7 @@ public class StripeTerminal extends Executor {
299
312
  }
300
313
  }
301
314
 
302
- public void collect(final PluginCall call) {
315
+ public void collectPaymentMethod(final PluginCall call) {
303
316
  if (call.getString("paymentIntent") == null) {
304
317
  call.reject("The value of paymentIntent is not set correctly.");
305
318
  return;
@@ -308,7 +321,7 @@ public class StripeTerminal extends Executor {
308
321
  Terminal.getInstance().retrievePaymentIntent(call.getString("paymentIntent"), createPaymentIntentCallback);
309
322
  }
310
323
 
311
- public void cancelCollect(final PluginCall call) {
324
+ public void cancelCollectPaymentMethod(final PluginCall call) {
312
325
  if (this.collectCancelable == null || this.collectCancelable.isCompleted()) {
313
326
  call.resolve();
314
327
  return;
@@ -334,9 +347,7 @@ public class StripeTerminal extends Executor {
334
347
  private final PaymentIntentCallback createPaymentIntentCallback = new PaymentIntentCallback() {
335
348
  @Override
336
349
  public void onSuccess(@NonNull PaymentIntent paymentIntent) {
337
- CollectConfiguration collectConfig = new CollectConfiguration.Builder()
338
- .updatePaymentIntent(true)
339
- .build();
350
+ CollectConfiguration collectConfig = new CollectConfiguration.Builder().updatePaymentIntent(true).build();
340
351
  collectCancelable = Terminal.getInstance().collectPaymentMethod(paymentIntent, collectPaymentMethodCallback, collectConfig);
341
352
  }
342
353
 
@@ -347,20 +358,19 @@ public class StripeTerminal extends Executor {
347
358
  }
348
359
  };
349
360
 
350
- // Step 3 - we've collected the payment method, so it's time to process the payment
351
361
  private final PaymentIntentCallback collectPaymentMethodCallback = new PaymentIntentCallback() {
352
362
  @Override
353
363
  public void onSuccess(PaymentIntent paymentIntent) {
354
364
  collectCancelable = null;
355
- notifyListeners(TerminalEnumEvent.Completed.getWebEventName(), emptyObject);
365
+ paymentIntentInstance = paymentIntent;
366
+ notifyListeners(TerminalEnumEvent.CollectedPaymentIntent.getWebEventName(), emptyObject);
356
367
 
357
368
  PaymentMethod pm = paymentIntent.getPaymentMethod();
358
- CardPresentDetails card = pm.getCardPresentDetails() != null
359
- ? pm.getCardPresentDetails()
360
- : pm.getInteracPresentDetails();
369
+ CardPresentDetails card = pm.getCardPresentDetails() != null ? pm.getCardPresentDetails() : pm.getInteracPresentDetails();
361
370
 
362
371
  if (card != null) {
363
- collectCall.resolve(new JSObject()
372
+ collectCall.resolve(
373
+ new JSObject()
364
374
  .put("brand", card.getBrand())
365
375
  .put("cardholderName", card.getCardholderName())
366
376
  .put("country", card.getCountry())
@@ -373,7 +383,6 @@ public class StripeTerminal extends Executor {
373
383
  .put("last4", card.getLast4())
374
384
  .put("networks", card.getNetworks())
375
385
  .put("readMethod", card.getReadMethod())
376
-
377
386
  );
378
387
  } else {
379
388
  collectCall.resolve();
@@ -388,6 +397,31 @@ public class StripeTerminal extends Executor {
388
397
  }
389
398
  };
390
399
 
400
+ public void confirmPaymentIntent(final PluginCall call) {
401
+ if (this.paymentIntentInstance == null) {
402
+ call.reject("PaymentIntent not found for confirmPaymentIntent. Use collect method first and try again.");
403
+ return;
404
+ }
405
+
406
+ this.confirmPaymentIntentCall = call;
407
+ Terminal.getInstance().confirmPaymentIntent(this.paymentIntentInstance, confirmPaymentMethodCallback);
408
+ }
409
+
410
+ private final PaymentIntentCallback confirmPaymentMethodCallback = new PaymentIntentCallback() {
411
+ @Override
412
+ public void onSuccess(PaymentIntent paymentIntent) {
413
+ notifyListeners(TerminalEnumEvent.ConfirmedPaymentIntent.getWebEventName(), emptyObject);
414
+ paymentIntentInstance = null;
415
+ confirmPaymentIntentCall.resolve();
416
+ }
417
+
418
+ @Override
419
+ public void onFailure(TerminalException exception) {
420
+ notifyListeners(TerminalEnumEvent.Failed.getWebEventName(), emptyObject);
421
+ confirmPaymentIntentCall.reject(exception.getLocalizedMessage());
422
+ }
423
+ };
424
+
391
425
  private ReaderCallback readerCallback(final PluginCall call) {
392
426
  return new ReaderCallback() {
393
427
  @Override
@@ -422,9 +456,7 @@ public class StripeTerminal extends Executor {
422
456
  }
423
457
 
424
458
  @Override
425
- public void onReportLowBatteryWarning() {
426
-
427
- }
459
+ public void onReportLowBatteryWarning() {}
428
460
 
429
461
  @Override
430
462
  public void onReportAvailableUpdate(@NotNull ReaderSoftwareUpdate update) {