@capacitor-community/stripe-terminal 5.1.0 → 5.3.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.
@@ -1,12 +1,18 @@
1
1
  package com.getcapacitor.community.stripe.terminal;
2
2
 
3
+ import android.Manifest;
3
4
  import android.app.Activity;
4
5
  import android.app.Application;
6
+ import android.bluetooth.BluetoothAdapter;
5
7
  import android.content.Context;
6
- import android.content.pm.ApplicationInfo;
8
+ import android.content.pm.PackageManager;
7
9
  import android.util.Log;
10
+
8
11
  import androidx.annotation.NonNull;
12
+ import androidx.annotation.Nullable;
13
+ import androidx.core.app.ActivityCompat;
9
14
  import androidx.core.util.Supplier;
15
+
10
16
  import com.getcapacitor.JSArray;
11
17
  import com.getcapacitor.JSObject;
12
18
  import com.getcapacitor.PluginCall;
@@ -19,68 +25,88 @@ import com.stripe.stripeterminal.external.callable.Cancelable;
19
25
  import com.stripe.stripeterminal.external.callable.DiscoveryListener;
20
26
  import com.stripe.stripeterminal.external.callable.PaymentIntentCallback;
21
27
  import com.stripe.stripeterminal.external.callable.ReaderCallback;
28
+ import com.stripe.stripeterminal.external.callable.ReaderListener;
22
29
  import com.stripe.stripeterminal.external.callable.TerminalListener;
23
- import com.stripe.stripeterminal.external.models.ConnectionConfiguration;
30
+ import com.stripe.stripeterminal.external.models.CardPresentDetails;
31
+ import com.stripe.stripeterminal.external.models.CollectConfiguration;
32
+ import com.stripe.stripeterminal.external.models.ConnectionConfiguration.BluetoothConnectionConfiguration;
33
+ import com.stripe.stripeterminal.external.models.ConnectionConfiguration.InternetConnectionConfiguration;
34
+ import com.stripe.stripeterminal.external.models.ConnectionConfiguration.LocalMobileConnectionConfiguration;
35
+ import com.stripe.stripeterminal.external.models.ConnectionConfiguration.UsbConnectionConfiguration;
24
36
  import com.stripe.stripeterminal.external.models.ConnectionStatus;
25
37
  import com.stripe.stripeterminal.external.models.DiscoveryConfiguration;
26
- import com.stripe.stripeterminal.external.models.DiscoveryMethod;
27
38
  import com.stripe.stripeterminal.external.models.PaymentIntent;
39
+ import com.stripe.stripeterminal.external.models.PaymentMethod;
28
40
  import com.stripe.stripeterminal.external.models.PaymentStatus;
29
41
  import com.stripe.stripeterminal.external.models.Reader;
42
+ import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate;
30
43
  import com.stripe.stripeterminal.external.models.TerminalException;
31
44
  import com.stripe.stripeterminal.log.LogLevel;
45
+
46
+ import org.jetbrains.annotations.NotNull;
47
+
32
48
  import java.util.ArrayList;
33
49
  import java.util.List;
34
50
  import java.util.Objects;
35
51
 
36
- import org.json.JSONException;
37
-
38
52
  public class StripeTerminal extends Executor {
39
53
 
40
54
  private Cancelable discoveryCancelable;
55
+ private Cancelable collectCancelable;
41
56
  private List<Reader> readers;
42
57
  private String locationId;
43
58
  private PluginCall collectCall;
44
59
  private final JSObject emptyObject = new JSObject();
45
60
  private Boolean isTest;
46
- private DiscoveryMethod type;
61
+ private TerminalConnectTypes terminalConnectType;
47
62
 
48
63
  public StripeTerminal(
49
- Supplier<Context> contextSupplier,
50
- Supplier<Activity> activitySupplier,
51
- BiConsumer<String, JSObject> notifyListenersFunction,
52
- String pluginLogTag
64
+ Supplier<Context> contextSupplier,
65
+ Supplier<Activity> activitySupplier,
66
+ BiConsumer<String, JSObject> notifyListenersFunction,
67
+ String pluginLogTag
53
68
  ) {
54
69
  super(contextSupplier, activitySupplier, notifyListenersFunction, pluginLogTag, "StripeTerminalExecutor");
55
70
  this.contextSupplier = contextSupplier;
56
- this.readers = new ArrayList<Reader>();
71
+ this.readers = new ArrayList<>();
57
72
  }
58
73
 
59
74
  public void initialize(final PluginCall call) throws TerminalException {
60
75
  this.isTest = call.getBoolean("isTest", true);
76
+
77
+ BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
78
+ if (!bluetooth.isEnabled()) {
79
+ if (
80
+ ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.BLUETOOTH_CONNECT) ==
81
+ PackageManager.PERMISSION_GRANTED
82
+ ) {
83
+ bluetooth.enable();
84
+ }
85
+ }
86
+
61
87
  this.activitySupplier.get()
62
- .runOnUiThread(
63
- () -> {
64
- TerminalApplicationDelegate.onCreate((Application) this.contextSupplier.get().getApplicationContext());
65
- notifyListeners(TerminalEnumEvent.Loaded.getWebEventName(), emptyObject);
66
- call.resolve();
67
- }
68
- );
88
+ .runOnUiThread(
89
+ () -> {
90
+ TerminalApplicationDelegate.onCreate((Application) this.contextSupplier.get().getApplicationContext());
91
+ notifyListeners(TerminalEnumEvent.Loaded.getWebEventName(), emptyObject);
92
+ call.resolve();
93
+ }
94
+ );
69
95
  TerminalListener listener = new TerminalListener() {
70
96
  @Override
71
97
  public void onUnexpectedReaderDisconnect(@NonNull Reader reader) {
72
98
  // TODO: Listenerを追加
73
99
  }
74
- //
75
- // @Override
76
- // public void onConnectionStatusChange(@NonNull ConnectionStatus status) {
77
- // // TODO: Listenerを追加
78
- // }
79
- //
80
- // @Override
81
- // public void onPaymentStatusChange(@NonNull PaymentStatus status) {
82
- // // TODO: Listenerを追加
83
- // }
100
+
101
+ @Override
102
+ public void onConnectionStatusChange(@NonNull ConnectionStatus status) {
103
+ // TODO: Listenerを追加
104
+ }
105
+
106
+ @Override
107
+ public void onPaymentStatusChange(@NonNull PaymentStatus status) {
108
+ // TODO: Listenerを追加
109
+ }
84
110
  };
85
111
  LogLevel logLevel = LogLevel.VERBOSE;
86
112
  TokenProvider tokenProvider = new TokenProvider(this.contextSupplier, call.getString("tokenProviderEndpoint"));
@@ -90,23 +116,32 @@ public class StripeTerminal extends Executor {
90
116
  Terminal.getInstance();
91
117
  }
92
118
 
93
- public void onDiscoverReaders(final PluginCall call) {
119
+ public void onDiscoverReaders(final PluginCall call) {
120
+ if (ActivityCompat.checkSelfPermission(this.contextSupplier.get(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
121
+ Log.d(this.logTag, "android.permission.ACCESS_FINE_LOCATION permission is not granted.");
122
+ call.reject("android.permission.ACCESS_FINE_LOCATION permission is not granted.");
123
+ return;
124
+ }
125
+
94
126
  this.locationId = call.getString("locationId");
127
+ final DiscoveryConfiguration config;
95
128
  if (Objects.equals(call.getString("type"), TerminalConnectTypes.TapToPay.getWebEventName())) {
96
- this.type = DiscoveryMethod.LOCAL_MOBILE;
129
+ config = new DiscoveryConfiguration.LocalMobileDiscoveryConfiguration(this.isTest);
130
+ this.terminalConnectType = TerminalConnectTypes.TapToPay;
97
131
  } else if (Objects.equals(call.getString("type"), TerminalConnectTypes.Internet.getWebEventName())) {
98
- this.type = DiscoveryMethod.INTERNET;
132
+ config = new DiscoveryConfiguration.InternetDiscoveryConfiguration(this.locationId, this.isTest);
133
+ this.terminalConnectType = TerminalConnectTypes.Internet;
134
+ } else if (Objects.equals(call.getString("type"), TerminalConnectTypes.Usb.getWebEventName())) {
135
+ config = new DiscoveryConfiguration.UsbDiscoveryConfiguration(0, this.isTest);
136
+ this.terminalConnectType = TerminalConnectTypes.Usb;
137
+ } else if (Objects.equals(call.getString("type"), TerminalConnectTypes.Bluetooth.getWebEventName()) || Objects.equals(call.getString("type"), TerminalConnectTypes.Simulated.getWebEventName())) {
138
+ config = new DiscoveryConfiguration.BluetoothDiscoveryConfiguration(0, this.isTest);
139
+ this.terminalConnectType = TerminalConnectTypes.Bluetooth;
99
140
  } else {
100
141
  call.unimplemented(call.getString("type") + " is not support now");
101
142
  return;
102
143
  }
103
144
 
104
- final DiscoveryConfiguration config = new DiscoveryConfiguration(
105
- 0,
106
- this.type,
107
- this.isTest,
108
- call.getString("locationId")
109
- );
110
145
  final DiscoveryListener discoveryListener = readers -> {
111
146
  // 検索したReaderの一覧をListenerで渡す
112
147
  Log.d(logTag, String.valueOf(readers.get(0).getSerialNumber()));
@@ -121,91 +156,140 @@ public class StripeTerminal extends Executor {
121
156
  call.resolve(new JSObject().put("readers", readersJSObject));
122
157
  };
123
158
  discoveryCancelable =
124
- Terminal
125
- .getInstance()
126
- .discoverReaders(
127
- config,
128
- discoveryListener,
129
- // Callback run after connectReader
130
- new Callback() {
131
- @Override
132
- public void onSuccess() {
133
- Log.d(logTag, "Finished discovering readers");
134
- }
135
-
136
- @Override
137
- public void onFailure(@NonNull TerminalException ex) {
138
- Log.d(logTag, ex.getLocalizedMessage());
139
- }
140
- }
141
- );
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
+ );
142
174
  }
143
175
 
144
176
  public void connectReader(final PluginCall call) {
145
- if (this.type == DiscoveryMethod.LOCAL_MOBILE) {
177
+ if (this.terminalConnectType == TerminalConnectTypes.TapToPay) {
146
178
  this.connectLocalMobileReader(call);
147
- } else if (this.type == DiscoveryMethod.INTERNET) {
179
+ } else if (this.terminalConnectType == TerminalConnectTypes.Internet) {
148
180
  this.connectInternetReader(call);
181
+ } else if (this.terminalConnectType == TerminalConnectTypes.Usb) {
182
+ this.connectUsbReader(call);
183
+ } else if (this.terminalConnectType == TerminalConnectTypes.Bluetooth) {
184
+ this.connectBluetoothReader(call);
185
+ } else {
186
+ call.reject("type is not defined.");
187
+ }
188
+ }
189
+
190
+ public void getConnectedReader(final PluginCall call) {
191
+ Reader reader = Terminal.getInstance().getConnectedReader();
192
+ if (reader == null) {
193
+ call.resolve(new JSObject().put("reader", JSObject.NULL));
194
+ } else {
195
+ call.resolve(new JSObject().put("reader", new JSObject().put("serialNumber", reader.getSerialNumber())));
196
+ }
197
+ }
198
+
199
+ public void disconnectReader(final PluginCall call) {
200
+ if (Terminal.getInstance().getConnectedReader() == null) {
201
+ call.resolve();
202
+ return;
149
203
  }
204
+
205
+ Terminal
206
+ .getInstance()
207
+ .disconnectReader(
208
+ new Callback() {
209
+ @Override
210
+ public void onSuccess() {
211
+ notifyListeners(TerminalEnumEvent.DisconnectedReader.getWebEventName(), emptyObject);
212
+ call.resolve();
213
+ }
214
+
215
+ @Override
216
+ public void onFailure(@NonNull TerminalException ex) {
217
+ call.reject(ex.getLocalizedMessage(), ex);
218
+ }
219
+ }
220
+ );
150
221
  }
151
222
 
152
223
  private void connectLocalMobileReader(final PluginCall call) {
153
224
  JSObject reader = call.getObject("reader");
154
- ConnectionConfiguration.LocalMobileConnectionConfiguration config = new ConnectionConfiguration.LocalMobileConnectionConfiguration(
155
- this.locationId
225
+
226
+ if (reader.getInteger("index") == null) {
227
+ call.reject("The reader value is not set correctly.");
228
+ return;
229
+ }
230
+
231
+ LocalMobileConnectionConfiguration config = new LocalMobileConnectionConfiguration(
232
+ this.locationId
156
233
  );
234
+ Terminal
235
+ .getInstance()
236
+ .connectLocalMobileReader(
237
+ this.readers.get(reader.getInteger("index")),
238
+ config,
239
+ this.readerCallback(call)
240
+ );
241
+ }
242
+
243
+ private void connectInternetReader(final PluginCall call) {
244
+ JSObject reader = call.getObject("reader");
245
+ InternetConnectionConfiguration config = new InternetConnectionConfiguration();
246
+ Terminal
247
+ .getInstance()
248
+ .connectInternetReader(
249
+ this.readers.get(reader.getInteger("index")),
250
+ config,
251
+ this.readerCallback(call)
252
+ );
253
+ }
254
+
255
+ private void connectUsbReader(final PluginCall call) {
256
+ JSObject reader = call.getObject("reader");
257
+ UsbConnectionConfiguration config = new UsbConnectionConfiguration(this.locationId);
157
258
  Terminal
158
259
  .getInstance()
159
- .connectLocalMobileReader(
260
+ .connectUsbReader(
160
261
  this.readers.get(reader.getInteger("index")),
161
262
  config,
162
- new ReaderCallback() {
163
- @Override
164
- public void onSuccess(Reader r) {
165
- notifyListeners(TerminalEnumEvent.ConnectedReader.getWebEventName(), emptyObject);
166
- call.resolve();
167
- }
168
-
169
- @Override
170
- public void onFailure(@NonNull TerminalException ex) {
171
- ex.printStackTrace();
172
- call.reject(ex.getLocalizedMessage(), ex);
173
- }
174
- }
263
+ this.readerListener(),
264
+ this.readerCallback(call)
175
265
  );
176
266
  }
177
267
 
178
- private void connectInternetReader(final PluginCall call) {
268
+ private void connectBluetoothReader(final PluginCall call) {
179
269
  JSObject reader = call.getObject("reader");
180
- ConnectionConfiguration.InternetConnectionConfiguration config =
181
- new ConnectionConfiguration.InternetConnectionConfiguration();
182
- Terminal.getInstance().connectInternetReader(this.readers.get(reader.getInteger("index")), config, new ReaderCallback() {
183
- @Override
184
- public void onSuccess(@NonNull Reader r) {
185
- notifyListeners(TerminalEnumEvent.ConnectedReader.getWebEventName(), emptyObject);
186
- call.resolve();
187
- }
188
-
189
- @Override
190
- public void onFailure(@NonNull TerminalException ex) {
191
- ex.printStackTrace();
192
- call.reject(ex.getLocalizedMessage(), ex);
193
- }
194
- });
270
+ BluetoothConnectionConfiguration config = new BluetoothConnectionConfiguration(this.locationId);
271
+ Terminal
272
+ .getInstance()
273
+ .connectBluetoothReader(
274
+ this.readers.get(reader.getInteger("index")),
275
+ config,
276
+ this.readerListener(),
277
+ this.readerCallback(call)
278
+ );
195
279
  }
196
280
 
197
- public void cancelDiscovering(final PluginCall call) {
281
+ public void cancelDiscoverReaders(final PluginCall call) {
198
282
  if (discoveryCancelable != null) {
199
283
  discoveryCancelable.cancel(
200
284
  new Callback() {
201
285
  @Override
202
286
  public void onSuccess() {
287
+ notifyListeners(TerminalEnumEvent.CancelDiscoveredReaders.getWebEventName(), emptyObject);
203
288
  call.resolve();
204
289
  }
205
290
 
206
291
  @Override
207
- public void onFailure(TerminalException ex) {
208
- Log.d(logTag, ex.getLocalizedMessage());
292
+ public void onFailure(@NonNull TerminalException ex) {
209
293
  call.reject(ex.getLocalizedMessage(), ex);
210
294
  }
211
295
  }
@@ -216,16 +300,44 @@ public class StripeTerminal extends Executor {
216
300
  }
217
301
 
218
302
  public void collect(final PluginCall call) {
219
- // メソッドを分割するためcallを永続化
303
+ if (call.getString("paymentIntent") == null) {
304
+ call.reject("The value of paymentIntent is not set correctly.");
305
+ return;
306
+ }
220
307
  this.collectCall = call;
221
-
222
308
  Terminal.getInstance().retrievePaymentIntent(call.getString("paymentIntent"), createPaymentIntentCallback);
223
309
  }
224
310
 
311
+ public void cancelCollect(final PluginCall call) {
312
+ if (this.collectCancelable == null || this.collectCancelable.isCompleted()) {
313
+ call.resolve();
314
+ return;
315
+ }
316
+
317
+ this.collectCancelable.cancel(
318
+ new Callback() {
319
+ @Override
320
+ public void onSuccess() {
321
+ collectCancelable = null;
322
+ notifyListeners(TerminalEnumEvent.Canceled.getWebEventName(), emptyObject);
323
+ call.resolve();
324
+ }
325
+
326
+ @Override
327
+ public void onFailure(@NonNull TerminalException e) {
328
+ call.reject(e.getErrorMessage());
329
+ }
330
+ }
331
+ );
332
+ }
333
+
225
334
  private final PaymentIntentCallback createPaymentIntentCallback = new PaymentIntentCallback() {
226
335
  @Override
227
336
  public void onSuccess(@NonNull PaymentIntent paymentIntent) {
228
- Terminal.getInstance().collectPaymentMethod(paymentIntent, collectPaymentMethodCallback);
337
+ CollectConfiguration collectConfig = new CollectConfiguration.Builder()
338
+ .updatePaymentIntent(true)
339
+ .build();
340
+ collectCancelable = Terminal.getInstance().collectPaymentMethod(paymentIntent, collectPaymentMethodCallback, collectConfig);
229
341
  }
230
342
 
231
343
  @Override
@@ -238,29 +350,87 @@ public class StripeTerminal extends Executor {
238
350
  // Step 3 - we've collected the payment method, so it's time to process the payment
239
351
  private final PaymentIntentCallback collectPaymentMethodCallback = new PaymentIntentCallback() {
240
352
  @Override
241
- public void onSuccess(@NonNull PaymentIntent paymentIntent) {
242
- Terminal.getInstance().processPayment(paymentIntent, processPaymentCallback);
243
- }
353
+ public void onSuccess(PaymentIntent paymentIntent) {
354
+ collectCancelable = null;
355
+ notifyListeners(TerminalEnumEvent.Completed.getWebEventName(), emptyObject);
244
356
 
245
- @Override
246
- public void onFailure(@NonNull TerminalException ex) {
247
- notifyListeners(TerminalEnumEvent.Failed.getWebEventName(), emptyObject);
248
- collectCall.reject(ex.getLocalizedMessage(), ex);
249
- }
250
- };
357
+ PaymentMethod pm = paymentIntent.getPaymentMethod();
358
+ CardPresentDetails card = pm.getCardPresentDetails() != null
359
+ ? pm.getCardPresentDetails()
360
+ : pm.getInteracPresentDetails();
251
361
 
252
- // Step 4 - we've processed the payment! Show a success screen
253
- private final PaymentIntentCallback processPaymentCallback = new PaymentIntentCallback() {
254
- @Override
255
- public void onSuccess(@NonNull PaymentIntent paymentIntent) {
256
- notifyListeners(TerminalEnumEvent.Completed.getWebEventName(), emptyObject);
257
- collectCall.resolve();
362
+ if (card != null) {
363
+ collectCall.resolve(new JSObject()
364
+ .put("brand", card.getBrand())
365
+ .put("cardholderName", card.getCardholderName())
366
+ .put("country", card.getCountry())
367
+ .put("emvAuthData", card.getEmvAuthData())
368
+ .put("expMonth", card.getExpMonth())
369
+ .put("expYear", card.getExpYear())
370
+ .put("funding", card.getFunding())
371
+ .put("generatedCard", card.getGeneratedCard())
372
+ .put("incrementalAuthorizationStatus", card.getIncrementalAuthorizationStatus())
373
+ .put("last4", card.getLast4())
374
+ .put("networks", card.getNetworks())
375
+ .put("readMethod", card.getReadMethod())
376
+
377
+ );
378
+ } else {
379
+ collectCall.resolve();
380
+ }
258
381
  }
259
382
 
260
383
  @Override
261
384
  public void onFailure(@NonNull TerminalException ex) {
385
+ collectCancelable = null;
262
386
  notifyListeners(TerminalEnumEvent.Failed.getWebEventName(), emptyObject);
263
387
  collectCall.reject(ex.getLocalizedMessage(), ex);
264
388
  }
265
389
  };
390
+
391
+ private ReaderCallback readerCallback(final PluginCall call) {
392
+ return new ReaderCallback() {
393
+ @Override
394
+ public void onSuccess(@NonNull Reader r) {
395
+ notifyListeners(TerminalEnumEvent.ConnectedReader.getWebEventName(), emptyObject);
396
+ call.resolve();
397
+ }
398
+
399
+ @Override
400
+ public void onFailure(@NonNull TerminalException ex) {
401
+ ex.printStackTrace();
402
+ call.reject(ex.getLocalizedMessage(), ex);
403
+ }
404
+ };
405
+ }
406
+
407
+ private ReaderListener readerListener() {
408
+ return new ReaderListener() {
409
+ @Override
410
+ public void onStartInstallingUpdate(@NotNull ReaderSoftwareUpdate update, @NotNull Cancelable cancelable) {
411
+ // Show UI communicating that a required update has started installing
412
+ }
413
+
414
+ @Override
415
+ public void onReportReaderSoftwareUpdateProgress(float progress) {
416
+ // Update the progress of the install
417
+ }
418
+
419
+ @Override
420
+ public void onFinishInstallingUpdate(@Nullable ReaderSoftwareUpdate update, @Nullable TerminalException e) {
421
+ // Report success or failure of the update
422
+ }
423
+
424
+ @Override
425
+ public void onReportLowBatteryWarning() {
426
+
427
+ }
428
+
429
+ @Override
430
+ public void onReportAvailableUpdate(@NotNull ReaderSoftwareUpdate update) {
431
+ // An update is available for the connected reader. Show this update in your application.
432
+ // This update can be installed using `Terminal.getInstance().installAvailableUpdate`.
433
+ }
434
+ };
435
+ }
266
436
  }
@@ -2,7 +2,9 @@ package com.getcapacitor.community.stripe.terminal;
2
2
 
3
3
  import android.Manifest;
4
4
  import android.os.Build;
5
+
5
6
  import androidx.annotation.RequiresApi;
7
+
6
8
  import com.getcapacitor.PermissionState;
7
9
  import com.getcapacitor.Plugin;
8
10
  import com.getcapacitor.PluginCall;
@@ -11,24 +13,13 @@ import com.getcapacitor.annotation.CapacitorPlugin;
11
13
  import com.getcapacitor.annotation.Permission;
12
14
  import com.getcapacitor.annotation.PermissionCallback;
13
15
  import com.stripe.stripeterminal.external.models.TerminalException;
14
- import java.util.Objects;
15
- import org.json.JSONException;
16
16
 
17
17
  @RequiresApi(api = Build.VERSION_CODES.S)
18
18
  @CapacitorPlugin(
19
19
  name = "StripeTerminal",
20
20
  permissions = {
21
21
  @Permission(alias = "location", strings = { Manifest.permission.ACCESS_FINE_LOCATION }),
22
- @Permission(
23
- alias = "bluetooth",
24
- strings = {
25
- Manifest.permission.BLUETOOTH,
26
- Manifest.permission.BLUETOOTH_ADMIN,
27
- Manifest.permission.BLUETOOTH_SCAN,
28
- Manifest.permission.BLUETOOTH_ADVERTISE,
29
- Manifest.permission.BLUETOOTH_CONNECT
30
- }
31
- )
22
+ @Permission(alias = "bluetooth", strings = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT })
32
23
  }
33
24
  )
34
25
  public class StripeTerminalPlugin extends Plugin {
@@ -78,13 +69,33 @@ public class StripeTerminalPlugin extends Plugin {
78
69
  this.implementation.onDiscoverReaders(call);
79
70
  }
80
71
 
72
+ @PluginMethod
73
+ public void cancelDiscoverReaders(PluginCall call) {
74
+ this.implementation.cancelDiscoverReaders(call);
75
+ }
76
+
81
77
  @PluginMethod
82
78
  public void connectReader(PluginCall call) {
83
79
  this.implementation.connectReader(call);
84
80
  }
85
81
 
82
+ @PluginMethod
83
+ public void getConnectedReader(final PluginCall call) {
84
+ this.implementation.getConnectedReader(call);
85
+ }
86
+
87
+ @PluginMethod
88
+ public void disconnectReader(final PluginCall call) {
89
+ this.implementation.disconnectReader(call);
90
+ }
91
+
86
92
  @PluginMethod
87
93
  public void collect(PluginCall call) {
88
94
  this.implementation.collect(call);
89
95
  }
96
+
97
+ @PluginMethod
98
+ public void cancelCollect(final PluginCall call) {
99
+ this.implementation.cancelCollect(call);
100
+ }
90
101
  }
@@ -3,7 +3,9 @@ package com.getcapacitor.community.stripe.terminal;
3
3
  enum class TerminalEnumEvent(val webEventName: String) {
4
4
  Loaded("terminalLoaded"),
5
5
  DiscoveredReaders("terminalDiscoveredReaders"),
6
+ CancelDiscoveredReaders("terminalCancelDiscoveredReaders"),
6
7
  ConnectedReader("terminalConnectedReader"),
8
+ DisconnectedReader("terminalDisconnectedReader"),
7
9
  Completed("terminalCompleted"),
8
10
  Canceled("terminalCanceled"),
9
11
  Failed("terminalFailed"),
@@ -2,7 +2,9 @@ package com.getcapacitor.community.stripe.terminal;
2
2
 
3
3
  import android.content.Context;
4
4
  import android.util.Log;
5
+
5
6
  import androidx.core.util.Supplier;
7
+
6
8
  import com.android.volley.Request;
7
9
  import com.android.volley.RequestQueue;
8
10
  import com.android.volley.Response;
@@ -12,6 +14,7 @@ import com.android.volley.toolbox.Volley;
12
14
  import com.stripe.stripeterminal.external.callable.ConnectionTokenCallback;
13
15
  import com.stripe.stripeterminal.external.callable.ConnectionTokenProvider;
14
16
  import com.stripe.stripeterminal.external.models.ConnectionTokenException;
17
+
15
18
  import org.json.JSONException;
16
19
  import org.json.JSONObject;
17
20
 
@@ -3,7 +3,9 @@ package com.getcapacitor.community.stripe.terminal.helper;
3
3
  import android.content.Context;
4
4
  import android.content.pm.ApplicationInfo;
5
5
  import android.content.pm.PackageManager;
6
+
6
7
  import androidx.core.util.Supplier;
8
+
7
9
  import com.getcapacitor.Logger;
8
10
 
9
11
  public class MetaData {
@@ -1,13 +1,12 @@
1
1
  package com.getcapacitor.community.stripe.terminal.models;
2
2
 
3
3
  import android.app.Activity;
4
- import android.app.Application;
5
4
  import android.content.Context;
5
+
6
6
  import androidx.core.util.Supplier;
7
+
7
8
  import com.getcapacitor.JSObject;
8
- import com.getcapacitor.Plugin;
9
9
  import com.google.android.gms.common.util.BiConsumer;
10
- import com.stripe.stripeterminal.TerminalApplicationDelegate;
11
10
 
12
11
  public abstract class Executor {
13
12