@aigens/aigens-sdk-core 0.0.3 → 0.0.7
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/README.md +21 -5
- package/android/build.gradle +0 -3
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/com/aigens/sdk/WebContainerActivity.java +162 -14
- package/android/src/main/java/com/aigens/sdk/plugins/CorePlugin.java +56 -76
- package/android/src/main/res/layout/sdk_layout_main.xml +55 -0
- package/dist/docs.json +20 -4
- package/dist/esm/definitions.d.ts +2 -1
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.d.ts +2 -1
- package/dist/esm/web.js +12 -4
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +12 -4
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +12 -4
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/CorePlugin.m +2 -1
- package/ios/Plugin/CorePlugin.swift +49 -633
- package/ios/Plugin/WebContainerViewController.swift +45 -14
- package/package.json +1 -1
@@ -1,6 +1,5 @@
|
|
1
1
|
import Foundation
|
2
2
|
import Capacitor
|
3
|
-
import AVFoundation
|
4
3
|
import UIKit
|
5
4
|
|
6
5
|
/**
|
@@ -8,634 +7,107 @@ import UIKit
|
|
8
7
|
* here: https://capacitorjs.com/docs/plugins/ios
|
9
8
|
*/
|
10
9
|
@objc(CorePlugin)
|
11
|
-
public class CorePlugin: CAPPlugin
|
10
|
+
public class CorePlugin: CAPPlugin {
|
11
|
+
|
12
12
|
private let implementation = Core()
|
13
|
-
|
13
|
+
public static var member: Dictionary<String, Any>?
|
14
|
+
|
14
15
|
@objc func echo(_ call: CAPPluginCall) {
|
16
|
+
|
17
|
+
print("CorePlugin echo")
|
15
18
|
|
16
19
|
let value = call.getString("value") ?? ""
|
17
20
|
call.resolve([
|
18
21
|
"value": implementation.echo(value)
|
19
22
|
])
|
23
|
+
|
24
|
+
|
20
25
|
}
|
21
26
|
|
22
|
-
|
23
|
-
@objc func finish(_ call: CAPPluginCall) {
|
27
|
+
@objc func dismiss(_ call: CAPPluginCall) {
|
24
28
|
|
29
|
+
print("CorePlugin dismiss")
|
30
|
+
|
25
31
|
DispatchQueue.main.async {
|
26
32
|
self.bridge?.viewController?.dismiss(animated: true);
|
27
33
|
}
|
28
|
-
|
29
|
-
|
34
|
+
|
35
|
+
|
30
36
|
//let value = call.getString("value") ?? ""
|
31
37
|
call.resolve([
|
32
38
|
"success": true
|
33
39
|
//"value": implementation.echo(value)
|
34
40
|
])
|
35
|
-
}
|
36
|
-
|
37
|
-
@objc func scan(_ call: CAPPluginCall) {
|
38
41
|
|
39
|
-
let cancelButton = call.getString("cancelButton")
|
40
|
-
if(cancelButton != nil){
|
41
|
-
self.cancelText = cancelButton!
|
42
|
-
}else{
|
43
|
-
self.cancelText = "Cancel"
|
44
|
-
}
|
45
|
-
|
46
|
-
DispatchQueue.main.async {
|
47
|
-
self.loadScan()
|
48
|
-
self.startScan(call)
|
49
|
-
}
|
50
|
-
}
|
51
|
-
|
52
|
-
|
53
|
-
@objc func openBrowser(_ call: CAPPluginCall) {
|
54
|
-
|
55
|
-
let url = call.getString("url")
|
56
|
-
|
57
|
-
|
58
|
-
if(url == nil){
|
59
|
-
return
|
60
|
-
}
|
61
|
-
|
62
|
-
DispatchQueue.main.async {
|
63
|
-
|
64
|
-
let bridgeVC = WebContainerViewController()
|
65
|
-
|
66
|
-
var options = [String: AnyObject]()
|
67
|
-
options["url"] = url as AnyObject;
|
68
42
|
|
69
|
-
bridgeVC.options = options;
|
70
|
-
|
71
|
-
bridgeVC.modalPresentationStyle = .fullScreen
|
72
|
-
let currentVC = self.bridge?.viewController;
|
73
|
-
currentVC?.present(bridgeVC, animated: true);
|
74
|
-
}
|
75
|
-
|
76
|
-
|
77
|
-
call.resolve([
|
78
|
-
"success": true
|
79
|
-
//"value": implementation.echo(value)
|
80
|
-
])
|
81
43
|
}
|
82
|
-
|
83
|
-
//SCAN PLAUGIN HERE
|
84
|
-
|
85
|
-
class CameraView: UIView {
|
86
|
-
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
|
87
|
-
|
88
|
-
func interfaceOrientationToVideoOrientation(_ orientation : UIInterfaceOrientation) -> AVCaptureVideoOrientation {
|
89
|
-
switch (orientation) {
|
90
|
-
case UIInterfaceOrientation.portrait:
|
91
|
-
return AVCaptureVideoOrientation.portrait
|
92
|
-
case UIInterfaceOrientation.portraitUpsideDown:
|
93
|
-
return AVCaptureVideoOrientation.portraitUpsideDown
|
94
|
-
case UIInterfaceOrientation.landscapeLeft:
|
95
|
-
return AVCaptureVideoOrientation.landscapeLeft
|
96
|
-
case UIInterfaceOrientation.landscapeRight:
|
97
|
-
return AVCaptureVideoOrientation.landscapeRight
|
98
|
-
default:
|
99
|
-
return AVCaptureVideoOrientation.portraitUpsideDown
|
100
|
-
}
|
101
|
-
}
|
102
44
|
|
103
|
-
|
104
|
-
super.layoutSubviews()
|
105
|
-
if let sublayers = self.layer.sublayers {
|
106
|
-
for layer in sublayers {
|
107
|
-
layer.frame = self.bounds
|
108
|
-
}
|
109
|
-
}
|
110
|
-
|
111
|
-
self.videoPreviewLayer?.connection?.videoOrientation = interfaceOrientationToVideoOrientation(UIApplication.shared.statusBarOrientation)
|
112
|
-
}
|
45
|
+
@objc func getMember(_ call: CAPPluginCall) {
|
113
46
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
previewLayer!.frame = self.bounds
|
118
|
-
self.layer.addSublayer(previewLayer!)
|
119
|
-
self.videoPreviewLayer = previewLayer
|
120
|
-
}
|
121
|
-
|
122
|
-
func removePreviewLayer() {
|
123
|
-
if self.videoPreviewLayer != nil {
|
124
|
-
self.videoPreviewLayer!.removeFromSuperlayer()
|
125
|
-
self.videoPreviewLayer = nil
|
126
|
-
}
|
127
|
-
}
|
128
|
-
}
|
129
|
-
|
130
|
-
var cameraView: CameraView!
|
131
|
-
var cancelButton: UIButton!
|
132
|
-
var captureSession:AVCaptureSession?
|
133
|
-
var captureVideoPreviewLayer:AVCaptureVideoPreviewLayer?
|
134
|
-
var metaOutput: AVCaptureMetadataOutput?
|
135
|
-
|
136
|
-
var currentCamera: Int = 0
|
137
|
-
var frontCamera: AVCaptureDevice?
|
138
|
-
var backCamera: AVCaptureDevice?
|
139
|
-
|
140
|
-
var cancelText: String = "Cancel"
|
141
|
-
var isScanning: Bool = false
|
142
|
-
var shouldRunScan: Bool = false
|
143
|
-
var didRunCameraSetup: Bool = false
|
144
|
-
var didRunCameraPrepare: Bool = false
|
145
|
-
var isBackgroundHidden: Bool = false
|
146
|
-
|
147
|
-
var savedCall: CAPPluginCall? = nil
|
148
|
-
var scanningPaused: Bool = false
|
149
|
-
var lastScanResult: String? = nil
|
150
|
-
|
151
|
-
enum SupportedFormat: String, CaseIterable {
|
152
|
-
// 1D Product
|
153
|
-
//!\ UPC_A is part of EAN_13 according to Apple docs
|
154
|
-
case UPC_E
|
155
|
-
//!\ UPC_EAN_EXTENSION is not supported by AVFoundation
|
156
|
-
case EAN_8
|
157
|
-
case EAN_13
|
158
|
-
// 1D Industrial
|
159
|
-
case CODE_39
|
160
|
-
case CODE_39_MOD_43
|
161
|
-
case CODE_93
|
162
|
-
case CODE_128
|
163
|
-
//!\ CODABAR is not supported by AVFoundation
|
164
|
-
case ITF
|
165
|
-
case ITF_14
|
166
|
-
// 2D
|
167
|
-
case AZTEC
|
168
|
-
case DATA_MATRIX
|
169
|
-
//!\ MAXICODE is not supported by AVFoundation
|
170
|
-
case PDF_417
|
171
|
-
case QR_CODE
|
172
|
-
//!\ RSS_14 is not supported by AVFoundation
|
173
|
-
//!\ RSS_EXPANDED is not supported by AVFoundation
|
174
|
-
|
175
|
-
var value: AVMetadataObject.ObjectType {
|
176
|
-
switch self {
|
177
|
-
// 1D Product
|
178
|
-
case .UPC_E: return AVMetadataObject.ObjectType.upce
|
179
|
-
case .EAN_8: return AVMetadataObject.ObjectType.ean8
|
180
|
-
case .EAN_13: return AVMetadataObject.ObjectType.ean13
|
181
|
-
// 1D Industrial
|
182
|
-
case .CODE_39: return AVMetadataObject.ObjectType.code39
|
183
|
-
case .CODE_39_MOD_43: return AVMetadataObject.ObjectType.code39Mod43
|
184
|
-
case .CODE_93: return AVMetadataObject.ObjectType.code93
|
185
|
-
case .CODE_128: return AVMetadataObject.ObjectType.code128
|
186
|
-
case .ITF: return AVMetadataObject.ObjectType.interleaved2of5
|
187
|
-
case .ITF_14: return AVMetadataObject.ObjectType.itf14
|
188
|
-
// 2D
|
189
|
-
case .AZTEC: return AVMetadataObject.ObjectType.aztec
|
190
|
-
case .DATA_MATRIX: return AVMetadataObject.ObjectType.dataMatrix
|
191
|
-
case .PDF_417: return AVMetadataObject.ObjectType.pdf417
|
192
|
-
case .QR_CODE: return AVMetadataObject.ObjectType.qr
|
193
|
-
}
|
194
|
-
}
|
195
|
-
}
|
196
|
-
|
197
|
-
var targetedFormats = [AVMetadataObject.ObjectType]()
|
198
|
-
|
199
|
-
enum CaptureError: Error {
|
200
|
-
case backCameraUnavailable
|
201
|
-
case frontCameraUnavailable
|
202
|
-
case couldNotCaptureInput(error: NSError)
|
203
|
-
}
|
204
|
-
|
205
|
-
@objc func buttonTapped( _ button : UIButton)
|
206
|
-
{
|
207
|
-
|
208
|
-
self.destroy()
|
47
|
+
call.resolve([
|
48
|
+
"member": CorePlugin.member!
|
49
|
+
])
|
209
50
|
}
|
210
|
-
|
211
|
-
|
212
51
|
|
213
|
-
|
214
|
-
|
215
|
-
if(self.cameraView != nil){
|
216
|
-
return
|
217
|
-
}
|
218
|
-
|
219
|
-
|
220
|
-
self.cameraView = CameraView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
|
221
|
-
self.cameraView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
222
|
-
|
223
|
-
let button = UIButton()
|
224
|
-
//button.backgroundColor = UIColor.orange
|
225
|
-
|
226
|
-
//let iconImage = UIImage(named: "search")
|
227
|
-
//button.setImage(iconImage, for: .normal)
|
228
|
-
|
229
|
-
button.setTitle("< " + self.cancelText, for: .normal)
|
230
|
-
button.contentMode = UIView.ContentMode.scaleToFill
|
231
|
-
button.frame = CGRect(x: 20, y: 10, width:200 , height:100)
|
232
|
-
button.titleLabel?.textColor = UIColor.white
|
233
|
-
button.contentHorizontalAlignment = .left
|
234
|
-
|
235
|
-
button.addTarget(self, action: #selector(self.buttonTapped(_:)), for: UIControl.Event.touchUpInside)
|
236
|
-
|
237
|
-
self.cancelButton = button
|
238
|
-
|
239
|
-
}
|
52
|
+
@objc func finish(_ call: CAPPluginCall) {
|
240
53
|
|
241
|
-
|
242
|
-
let status = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
|
243
|
-
if (status == AVAuthorizationStatus.authorized) {
|
244
|
-
return true
|
245
|
-
}
|
246
|
-
return false
|
247
|
-
}
|
248
|
-
|
249
|
-
private func addViews(){
|
250
|
-
self.webView!.superview!.insertSubview(cameraView, aboveSubview: self.webView!)
|
251
|
-
self.webView!.superview!.insertSubview(cancelButton, aboveSubview: cameraView)
|
252
|
-
}
|
253
|
-
|
254
|
-
private func removeViews(){
|
54
|
+
print("CorePlugin finish")
|
255
55
|
|
256
56
|
DispatchQueue.main.async {
|
257
|
-
self.
|
258
|
-
self.cameraView.removeFromSuperview()
|
259
|
-
}
|
260
|
-
|
261
|
-
}
|
262
|
-
|
263
|
-
private func setupCamera(cameraDirection: String? = "back") -> Bool {
|
264
|
-
do {
|
265
|
-
var cameraDir = cameraDirection
|
266
|
-
cameraView.backgroundColor = UIColor.clear
|
267
|
-
//self.webView!.superview!.insertSubview(cameraView, belowSubview: self.webView!)
|
268
|
-
|
269
|
-
//self.webView!.superview!.insertSubview(cameraView, aboveSubview: self.webView!)
|
270
|
-
//self.webView!.superview!.insertSubview(cancelButton, aboveSubview: cameraView)
|
271
|
-
addViews()
|
272
|
-
|
273
|
-
let availableVideoDevices = discoverCaptureDevices()
|
274
|
-
for device in availableVideoDevices {
|
275
|
-
if device.position == AVCaptureDevice.Position.back {
|
276
|
-
backCamera = device
|
277
|
-
}
|
278
|
-
else if device.position == AVCaptureDevice.Position.front {
|
279
|
-
frontCamera = device
|
280
|
-
}
|
281
|
-
}
|
282
|
-
// older iPods have no back camera
|
283
|
-
if (cameraDir == "back") {
|
284
|
-
if (backCamera == nil) {
|
285
|
-
cameraDir = "front"
|
286
|
-
}
|
287
|
-
} else {
|
288
|
-
if (frontCamera == nil) {
|
289
|
-
cameraDir = "back"
|
290
|
-
}
|
291
|
-
}
|
292
|
-
let input: AVCaptureDeviceInput
|
293
|
-
input = try self.createCaptureDeviceInput(cameraDirection: cameraDir)
|
294
|
-
captureSession = AVCaptureSession()
|
295
|
-
captureSession!.addInput(input)
|
296
|
-
metaOutput = AVCaptureMetadataOutput()
|
297
|
-
captureSession!.addOutput(metaOutput!)
|
298
|
-
metaOutput!.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
|
299
|
-
captureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
|
300
|
-
cameraView.addPreviewLayer(captureVideoPreviewLayer)
|
301
|
-
self.didRunCameraSetup = true
|
302
|
-
return true
|
303
|
-
} catch CaptureError.backCameraUnavailable {
|
304
|
-
//
|
305
|
-
} catch CaptureError.frontCameraUnavailable {
|
306
|
-
//
|
307
|
-
} catch CaptureError.couldNotCaptureInput {
|
308
|
-
//
|
309
|
-
} catch {
|
310
|
-
//
|
311
|
-
}
|
312
|
-
return false
|
313
|
-
}
|
314
|
-
|
315
|
-
@available(swift, deprecated: 5.6, message: "New Xcode? Check if `AVCaptureDevice.DeviceType` has new types and add them accordingly.")
|
316
|
-
private func discoverCaptureDevices() -> [AVCaptureDevice] {
|
317
|
-
if #available(iOS 13.0, *) {
|
318
|
-
return AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualCamera, .builtInTelephotoCamera, .builtInTrueDepthCamera, .builtInUltraWideCamera, .builtInDualWideCamera, .builtInWideAngleCamera], mediaType: .video, position: .unspecified).devices
|
319
|
-
} else {
|
320
|
-
return AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera, .builtInTelephotoCamera, .builtInTrueDepthCamera], mediaType: .video, position: .unspecified).devices
|
321
|
-
}
|
322
|
-
}
|
323
|
-
|
324
|
-
private func createCaptureDeviceInput(cameraDirection: String? = "back") throws -> AVCaptureDeviceInput {
|
325
|
-
var captureDevice: AVCaptureDevice
|
326
|
-
if(cameraDirection == "back"){
|
327
|
-
if(backCamera != nil){
|
328
|
-
captureDevice = backCamera!
|
329
|
-
} else {
|
330
|
-
throw CaptureError.backCameraUnavailable
|
331
|
-
}
|
332
|
-
} else {
|
333
|
-
if(frontCamera != nil){
|
334
|
-
captureDevice = frontCamera!
|
335
|
-
} else {
|
336
|
-
throw CaptureError.frontCameraUnavailable
|
337
|
-
}
|
338
|
-
}
|
339
|
-
let captureDeviceInput: AVCaptureDeviceInput
|
340
|
-
do {
|
341
|
-
captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)
|
342
|
-
} catch let error as NSError {
|
343
|
-
throw CaptureError.couldNotCaptureInput(error: error)
|
344
|
-
}
|
345
|
-
return captureDeviceInput
|
346
|
-
}
|
347
|
-
|
348
|
-
private func dismantleCamera() {
|
349
|
-
// opposite of setupCamera
|
350
|
-
|
351
|
-
if (self.captureSession != nil) {
|
352
|
-
DispatchQueue.main.async {
|
353
|
-
self.captureSession!.stopRunning()
|
354
|
-
self.cameraView.removePreviewLayer()
|
355
|
-
self.captureVideoPreviewLayer = nil
|
356
|
-
self.metaOutput = nil
|
357
|
-
self.captureSession = nil
|
358
|
-
self.frontCamera = nil
|
359
|
-
self.backCamera = nil
|
360
|
-
}
|
57
|
+
self.bridge?.viewController?.dismiss(animated: true);
|
361
58
|
}
|
362
59
|
|
363
|
-
self.isScanning = false
|
364
|
-
self.didRunCameraSetup = false
|
365
|
-
self.didRunCameraPrepare = false
|
366
60
|
|
367
|
-
//
|
368
|
-
|
369
|
-
|
370
|
-
|
61
|
+
//let value = call.getString("value") ?? ""
|
62
|
+
call.resolve([
|
63
|
+
"success": true
|
64
|
+
//"value": implementation.echo(value)
|
65
|
+
])
|
371
66
|
}
|
372
67
|
|
373
|
-
private func prepare(_ call: CAPPluginCall? = nil) {
|
374
|
-
// undo previous setup
|
375
|
-
// because it may be prepared with a different config
|
376
|
-
self.dismantleCamera()
|
377
68
|
|
378
|
-
|
379
|
-
// setup camera with new config
|
380
|
-
if (self.setupCamera(cameraDirection: call?.getString("cameraDirection") ?? "back")) {
|
381
|
-
// indicate this method was run
|
382
|
-
self.didRunCameraPrepare = true
|
383
|
-
|
384
|
-
if (self.shouldRunScan) {
|
385
|
-
self.scan()
|
386
|
-
}
|
387
|
-
} else {
|
388
|
-
self.shouldRunScan = false
|
389
|
-
}
|
390
|
-
}
|
391
|
-
}
|
69
|
+
@objc func openBrowser(_ call: CAPPluginCall) {
|
392
70
|
|
393
|
-
|
394
|
-
|
395
|
-
self.removeViews()
|
71
|
+
print("CorePlugin openBrowser")
|
396
72
|
|
397
|
-
|
398
|
-
|
399
|
-
self.dismantleCamera()
|
400
|
-
}
|
401
|
-
|
402
|
-
private func scan() {
|
403
|
-
if (!self.didRunCameraPrepare) {
|
404
|
-
//In iOS 14 don't identify permissions needed, so force to ask it's better than nothing. Provisional.
|
405
|
-
var iOS14min: Bool = false
|
406
|
-
if #available(iOS 14.0, *) { iOS14min = true; }
|
407
|
-
if (!self.hasCameraPermission() && !iOS14min) {
|
408
|
-
// @TODO()
|
409
|
-
// requestPermission()
|
410
|
-
} else {
|
411
|
-
self.shouldRunScan = true
|
412
|
-
self.prepare(savedCall)
|
413
|
-
}
|
414
|
-
} else {
|
415
|
-
self.didRunCameraPrepare = false
|
416
|
-
|
417
|
-
self.shouldRunScan = false
|
418
|
-
|
419
|
-
targetedFormats = [AVMetadataObject.ObjectType]();
|
420
|
-
|
421
|
-
if ((savedCall?.options["targetedFormats"]) != nil) {
|
422
|
-
let _targetedFormats = savedCall?.getArray("targetedFormats", String.self)
|
423
|
-
|
424
|
-
if (_targetedFormats != nil && _targetedFormats?.count ?? 0 > 0) {
|
425
|
-
_targetedFormats?.forEach { targetedFormat in
|
426
|
-
if let value = SupportedFormat(rawValue: targetedFormat)?.value {
|
427
|
-
print(value)
|
428
|
-
targetedFormats.append(value)
|
429
|
-
}
|
430
|
-
}
|
431
|
-
}
|
432
|
-
|
433
|
-
if (targetedFormats.count == 0) {
|
434
|
-
print("The property targetedFormats was not set correctly.")
|
435
|
-
}
|
436
|
-
}
|
437
|
-
|
438
|
-
if (targetedFormats.count == 0) {
|
439
|
-
for supportedFormat in SupportedFormat.allCases {
|
440
|
-
targetedFormats.append(supportedFormat.value)
|
441
|
-
}
|
442
|
-
}
|
443
|
-
|
444
|
-
DispatchQueue.main.async {
|
445
|
-
self.metaOutput!.metadataObjectTypes = self.targetedFormats
|
446
|
-
self.captureSession!.startRunning()
|
447
|
-
}
|
73
|
+
let url = call.getString("url")
|
448
74
|
|
449
|
-
self.hideBackground()
|
450
75
|
|
451
|
-
|
76
|
+
if(url == nil){
|
77
|
+
return
|
452
78
|
}
|
453
|
-
}
|
454
|
-
|
455
|
-
private func hideBackground() {
|
456
|
-
/*
|
457
|
-
DispatchQueue.main.async {
|
458
|
-
self.bridge?.webView!.isOpaque = false
|
459
|
-
self.bridge?.webView!.backgroundColor = UIColor.clear
|
460
|
-
self.bridge?.webView!.scrollView.backgroundColor = UIColor.clear
|
461
|
-
|
462
|
-
let javascript = "document.documentElement.style.backgroundColor = 'transparent'"
|
463
|
-
|
464
|
-
self.bridge?.webView!.evaluateJavaScript(javascript)
|
465
|
-
}*/
|
466
|
-
}
|
467
|
-
|
468
|
-
private func showBackground() {
|
469
79
|
|
470
|
-
|
80
|
+
let member = call.getObject("member")
|
81
|
+
|
471
82
|
DispatchQueue.main.async {
|
472
|
-
let javascript = "document.documentElement.style.backgroundColor = ''"
|
473
|
-
|
474
|
-
self.bridge?.webView!.evaluateJavaScript(javascript) { (result, error) in
|
475
|
-
self.bridge?.webView!.isOpaque = true
|
476
|
-
self.bridge?.webView!.backgroundColor = UIColor.white
|
477
|
-
self.bridge?.webView!.scrollView.backgroundColor = UIColor.white
|
478
|
-
}
|
479
|
-
}*/
|
480
|
-
}
|
481
|
-
|
482
|
-
// This method processes metadataObjects captured by iOS.
|
483
|
-
public func metadataOutput(_ captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
|
484
83
|
|
485
|
-
|
486
|
-
// while nothing is detected, or if scanning is false, do nothing.
|
487
|
-
return
|
488
|
-
}
|
489
|
-
|
490
|
-
let found = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
|
491
|
-
if (targetedFormats.contains(found.type)) {
|
492
|
-
var jsObject = PluginCallResultData()
|
493
|
-
|
494
|
-
if (found.stringValue != nil) {
|
495
|
-
jsObject["hasContent"] = true
|
496
|
-
jsObject["content"] = found.stringValue
|
497
|
-
jsObject["format"] = formatStringFromMetadata(found.type)
|
498
|
-
} else {
|
499
|
-
jsObject["hasContent"] = false
|
500
|
-
}
|
84
|
+
let bridgeVC = WebContainerViewController()
|
501
85
|
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
}
|
508
|
-
} else {
|
509
|
-
savedCall!.resolve(jsObject)
|
510
|
-
savedCall = nil
|
511
|
-
destroy()
|
512
|
-
}
|
513
|
-
} else {
|
514
|
-
self.destroy()
|
86
|
+
var options = [String: AnyObject]()
|
87
|
+
options["url"] = url as AnyObject;
|
88
|
+
|
89
|
+
if(member != nil){
|
90
|
+
options["member"] = member as AnyObject;
|
515
91
|
}
|
516
|
-
|
517
|
-
|
92
|
+
|
93
|
+
bridgeVC.options = options;
|
518
94
|
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
return "UPC_E"
|
523
|
-
case AVMetadataObject.ObjectType.ean8:
|
524
|
-
return "EAN_8"
|
525
|
-
case AVMetadataObject.ObjectType.ean13:
|
526
|
-
return "EAN_13"
|
527
|
-
case AVMetadataObject.ObjectType.code39:
|
528
|
-
return "CODE_39"
|
529
|
-
case AVMetadataObject.ObjectType.code39Mod43:
|
530
|
-
return "CODE_39_MOD_43"
|
531
|
-
case AVMetadataObject.ObjectType.code93:
|
532
|
-
return "CODE_93"
|
533
|
-
case AVMetadataObject.ObjectType.code128:
|
534
|
-
return "CODE_128"
|
535
|
-
case AVMetadataObject.ObjectType.interleaved2of5:
|
536
|
-
return "ITF"
|
537
|
-
case AVMetadataObject.ObjectType.itf14:
|
538
|
-
return "ITF_14"
|
539
|
-
case AVMetadataObject.ObjectType.aztec:
|
540
|
-
return "AZTEC"
|
541
|
-
case AVMetadataObject.ObjectType.dataMatrix:
|
542
|
-
return "DATA_MATRIX"
|
543
|
-
case AVMetadataObject.ObjectType.pdf417:
|
544
|
-
return "PDF_417"
|
545
|
-
case AVMetadataObject.ObjectType.qr:
|
546
|
-
return "QR_CODE"
|
547
|
-
default:
|
548
|
-
return type.rawValue
|
549
|
-
}
|
95
|
+
bridgeVC.modalPresentationStyle = .fullScreen
|
96
|
+
let currentVC = self.bridge?.viewController;
|
97
|
+
currentVC?.present(bridgeVC, animated: true);
|
550
98
|
}
|
551
99
|
|
552
|
-
@objc func prepare(_ call: CAPPluginCall) {
|
553
|
-
self.prepare()
|
554
|
-
call.resolve()
|
555
|
-
}
|
556
|
-
|
557
|
-
@objc func hideBackground(_ call: CAPPluginCall) {
|
558
|
-
self.hideBackground()
|
559
|
-
call.resolve()
|
560
|
-
}
|
561
|
-
|
562
|
-
@objc func showBackground(_ call: CAPPluginCall) {
|
563
|
-
self.showBackground()
|
564
|
-
call.resolve()
|
565
|
-
}
|
566
|
-
|
567
|
-
@objc func startScan(_ call: CAPPluginCall) {
|
568
|
-
self.savedCall = call
|
569
|
-
self.scan()
|
570
|
-
}
|
571
|
-
|
572
|
-
@objc func startScanning(_ call: CAPPluginCall) {
|
573
|
-
self.savedCall = call
|
574
|
-
self.savedCall?.keepAlive = true
|
575
|
-
scanningPaused = false
|
576
|
-
lastScanResult = nil
|
577
|
-
self.scan()
|
578
|
-
}
|
579
|
-
|
580
|
-
@objc func pauseScanning(_ call: CAPPluginCall) {
|
581
|
-
scanningPaused = true
|
582
|
-
call.resolve()
|
583
|
-
}
|
584
100
|
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
@objc func stopScan(_ call: CAPPluginCall) {
|
591
|
-
if ((call.getBool("resolveScan") ?? false) && self.savedCall != nil) {
|
592
|
-
var jsObject = PluginCallResultData()
|
593
|
-
jsObject["hasContent"] = false
|
594
|
-
|
595
|
-
savedCall?.resolve(jsObject)
|
596
|
-
savedCall = nil
|
597
|
-
}
|
598
|
-
|
599
|
-
self.destroy()
|
600
|
-
call.resolve()
|
101
|
+
call.resolve([
|
102
|
+
"success": true
|
103
|
+
//"value": implementation.echo(value)
|
104
|
+
])
|
601
105
|
}
|
602
106
|
|
603
|
-
@objc func checkPermission(_ call: CAPPluginCall) {
|
604
|
-
let force = call.getBool("force") ?? false
|
605
107
|
|
606
|
-
var savedReturnObject = PluginCallResultData()
|
607
108
|
|
608
|
-
DispatchQueue.main.async {
|
609
|
-
switch AVCaptureDevice.authorizationStatus(for: .video) {
|
610
|
-
case .authorized:
|
611
|
-
savedReturnObject["granted"] = true
|
612
|
-
case .denied:
|
613
|
-
savedReturnObject["denied"] = true
|
614
|
-
case .notDetermined:
|
615
|
-
savedReturnObject["neverAsked"] = true
|
616
|
-
case .restricted:
|
617
|
-
savedReturnObject["restricted"] = true
|
618
|
-
@unknown default:
|
619
|
-
savedReturnObject["unknown"] = true
|
620
|
-
}
|
621
|
-
|
622
|
-
if (force && savedReturnObject["neverAsked"] != nil) {
|
623
|
-
savedReturnObject["asked"] = true
|
624
|
-
|
625
|
-
AVCaptureDevice.requestAccess(for: .video) { (authorized) in
|
626
|
-
if (authorized) {
|
627
|
-
savedReturnObject["granted"] = true
|
628
|
-
} else {
|
629
|
-
savedReturnObject["denied"] = true
|
630
|
-
}
|
631
|
-
call.resolve(savedReturnObject)
|
632
|
-
}
|
633
|
-
} else {
|
634
|
-
call.resolve(savedReturnObject)
|
635
|
-
}
|
636
|
-
}
|
637
|
-
}
|
638
109
|
|
110
|
+
/*
|
639
111
|
@objc func openAppSettings(_ call: CAPPluginCall) {
|
640
112
|
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
|
641
113
|
return
|
@@ -649,66 +121,10 @@ public class CorePlugin: CAPPlugin, AVCaptureMetadataOutputObjectsDelegate {
|
|
649
121
|
}
|
650
122
|
}
|
651
123
|
}
|
124
|
+
*/
|
652
125
|
|
653
|
-
@objc func enableTorch(_ call: CAPPluginCall) {
|
654
|
-
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
|
655
|
-
guard device.hasTorch else { return }
|
656
|
-
guard device.isTorchAvailable else { return }
|
657
|
-
|
658
|
-
do {
|
659
|
-
try device.lockForConfiguration()
|
660
|
-
|
661
|
-
do {
|
662
|
-
try device.setTorchModeOn(level: 1.0)
|
663
|
-
} catch {
|
664
|
-
print(error)
|
665
|
-
}
|
666
|
-
|
667
|
-
device.unlockForConfiguration()
|
668
|
-
} catch {
|
669
|
-
print(error)
|
670
|
-
}
|
671
|
-
|
672
|
-
call.resolve()
|
673
|
-
}
|
674
|
-
|
675
|
-
@objc func disableTorch(_ call: CAPPluginCall) {
|
676
|
-
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
|
677
|
-
guard device.hasTorch else { return }
|
678
|
-
guard device.isTorchAvailable else { return }
|
679
|
-
|
680
|
-
do {
|
681
|
-
try device.lockForConfiguration()
|
682
|
-
device.torchMode = .off
|
683
|
-
|
684
|
-
device.unlockForConfiguration()
|
685
|
-
} catch {
|
686
|
-
print(error)
|
687
|
-
}
|
688
|
-
|
689
|
-
call.resolve()
|
690
|
-
}
|
691
|
-
|
692
|
-
@objc func toggleTorch(_ call: CAPPluginCall) {
|
693
|
-
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
|
694
|
-
guard device.hasTorch else { return }
|
695
|
-
guard device.isTorchAvailable else { return }
|
696
126
|
|
697
|
-
if (device.torchMode == .on) {
|
698
|
-
self.disableTorch(call)
|
699
|
-
} else {
|
700
|
-
self.enableTorch(call)
|
701
|
-
}
|
702
|
-
}
|
703
127
|
|
704
|
-
@objc func getTorchState(_ call: CAPPluginCall) {
|
705
|
-
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
|
706
128
|
|
707
|
-
var result = PluginCallResultData()
|
708
|
-
|
709
|
-
result["isEnabled"] = device.torchMode == .on
|
710
|
-
|
711
|
-
call.resolve(result)
|
712
|
-
}
|
713
129
|
|
714
130
|
}
|