@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.
- package/CapacitorCommunityStripeTerminal.podspec +1 -1
- package/README.md +85 -12
- package/android/build.gradle +14 -8
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.java +280 -110
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminalPlugin.java +23 -12
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalEvent.kt +2 -0
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/TokenProvider.java +3 -0
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/helper/MetaData.java +2 -0
- package/android/src/main/java/com/getcapacitor/community/stripe/terminal/models/Executor.java +2 -3
- package/dist/docs.json +54 -0
- package/dist/esm/definitions.d.ts +6 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/events.enum.d.ts +2 -0
- package/dist/esm/events.enum.js +2 -0
- package/dist/esm/events.enum.js.map +1 -1
- package/dist/esm/web.d.ts +6 -0
- package/dist/esm/web.js +17 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +19 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +19 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/StripeTerminal.swift +129 -16
- package/ios/Plugin/StripeTerminalPlugin.m +4 -0
- package/ios/Plugin/StripeTerminalPlugin.swift +21 -1
- package/ios/Plugin/TerminalEvents.swift +1 -0
- package/package.json +1 -1
package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.java
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
61
|
+
private TerminalConnectTypes terminalConnectType;
|
|
47
62
|
|
|
48
63
|
public StripeTerminal(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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.
|
|
177
|
+
if (this.terminalConnectType == TerminalConnectTypes.TapToPay) {
|
|
146
178
|
this.connectLocalMobileReader(call);
|
|
147
|
-
} else if (this.
|
|
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
|
-
|
|
155
|
-
|
|
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
|
-
.
|
|
260
|
+
.connectUsbReader(
|
|
160
261
|
this.readers.get(reader.getInteger("index")),
|
|
161
262
|
config,
|
|
162
|
-
|
|
163
|
-
|
|
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
|
|
268
|
+
private void connectBluetoothReader(final PluginCall call) {
|
|
179
269
|
JSObject reader = call.getObject("reader");
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
242
|
-
|
|
243
|
-
|
|
353
|
+
public void onSuccess(PaymentIntent paymentIntent) {
|
|
354
|
+
collectCancelable = null;
|
|
355
|
+
notifyListeners(TerminalEnumEvent.Completed.getWebEventName(), emptyObject);
|
|
244
356
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
};
|
|
357
|
+
PaymentMethod pm = paymentIntent.getPaymentMethod();
|
|
358
|
+
CardPresentDetails card = pm.getCardPresentDetails() != null
|
|
359
|
+
? pm.getCardPresentDetails()
|
|
360
|
+
: pm.getInteracPresentDetails();
|
|
251
361
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
}
|
package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminalPlugin.java
CHANGED
|
@@ -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
|
|
package/android/src/main/java/com/getcapacitor/community/stripe/terminal/helper/MetaData.java
CHANGED
|
@@ -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 {
|
package/android/src/main/java/com/getcapacitor/community/stripe/terminal/models/Executor.java
CHANGED
|
@@ -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
|
|