capacitor-community-multilens-camerapreview 0.0.11-a → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CapacitorCommunityMultilensCamerapreview.podspec +17 -17
  2. package/README.md +16 -26
  3. package/android/build.gradle +55 -55
  4. package/android/src/main/AndroidManifest.xml +4 -4
  5. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +1008 -1008
  6. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +544 -544
  7. package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomSurfaceView.java +23 -23
  8. package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomTextureView.java +29 -29
  9. package/android/src/main/java/com/ahm/capacitor/camera/preview/Preview.java +386 -386
  10. package/android/src/main/java/com/ahm/capacitor/camera/preview/TapGestureDetector.java +24 -24
  11. package/android/src/main/res/layout/bridge_layout_main.xml +15 -15
  12. package/android/src/main/res/layout/camera_activity.xml +68 -68
  13. package/android/src/main/res/values/camera_ids.xml +4 -4
  14. package/android/src/main/res/values/camera_theme.xml +9 -9
  15. package/android/src/main/res/values/colors.xml +3 -3
  16. package/android/src/main/res/values/strings.xml +3 -3
  17. package/android/src/main/res/values/styles.xml +3 -3
  18. package/dist/docs.json +1 -11
  19. package/dist/esm/definitions.d.ts +80 -81
  20. package/dist/esm/definitions.js +1 -1
  21. package/dist/esm/definitions.js.map +1 -1
  22. package/dist/esm/index.d.ts +4 -4
  23. package/dist/esm/index.js +6 -6
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/web.d.ts +28 -29
  26. package/dist/esm/web.js +155 -158
  27. package/dist/esm/web.js.map +1 -1
  28. package/dist/plugin.cjs.js +149 -152
  29. package/dist/plugin.cjs.js.map +1 -1
  30. package/dist/plugin.js +149 -152
  31. package/dist/plugin.js.map +1 -1
  32. package/ios/Plugin/CameraController.swift +733 -783
  33. package/ios/Plugin/Info.plist +24 -24
  34. package/ios/Plugin/Plugin.h +10 -10
  35. package/ios/Plugin/Plugin.m +18 -19
  36. package/ios/Plugin/Plugin.swift +308 -316
  37. package/package.json +78 -78
@@ -1,316 +1,308 @@
1
- import Foundation
2
- import Capacitor
3
- import AVFoundation
4
- /**
5
- * Please read the Capacitor iOS Plugin Development Guide
6
- * here: https://capacitor.ionicframework.com/docs/plugins/ios
7
- */
8
- @objc(CameraPreview)
9
- public class CameraPreview: CAPPlugin {
10
-
11
- var previewView: UIView!
12
- var cameraPosition = String()
13
- let cameraController = CameraController()
14
- var x: CGFloat?
15
- var y: CGFloat?
16
- var width: CGFloat?
17
- var height: CGFloat?
18
- var paddingBottom: CGFloat?
19
- var rotateWhenOrientationChanged: Bool?
20
- var toBack: Bool?
21
- var storeToFile: Bool?
22
- var enableZoom: Bool?
23
- var highResolutionOutput: Bool = false
24
- var disableAudio: Bool = false
25
- var zoomFactor = String()
26
-
27
- @objc func rotated() {
28
- let height = self.paddingBottom != nil ? self.height! - self.paddingBottom!: self.height!;
29
-
30
- if UIApplication.shared.statusBarOrientation.isLandscape {
31
- self.previewView.frame = CGRect(x: self.y!, y: self.x!, width: max(height, self.width!), height: min(height, self.width!))
32
- self.cameraController.previewLayer?.frame = self.previewView.frame
33
- }
34
-
35
- if UIApplication.shared.statusBarOrientation.isPortrait {
36
- if (self.previewView != nil && self.x != nil && self.y != nil && self.width != nil && self.height != nil) {
37
- self.previewView.frame = CGRect(x: self.x!, y: self.y!, width: min(height, self.width!), height: max(height, self.width!))
38
- }
39
- self.cameraController.previewLayer?.frame = self.previewView.frame
40
- }
41
-
42
- cameraController.updateVideoOrientation()
43
- }
44
-
45
- @objc func start(_ call: CAPPluginCall) {
46
- self.cameraPosition = call.getString("position") ?? "rear"
47
- self.zoomFactor = call.getString("zoomFactor") ?? "wide"
48
- self.highResolutionOutput = call.getBool("enableHighResolution") ?? false
49
- self.cameraController.highResolutionOutput = self.highResolutionOutput
50
- if call.getInt("width") != nil {
51
- self.width = CGFloat(call.getInt("width")!)
52
- } else {
53
- self.width = UIScreen.main.bounds.size.width
54
- }
55
- if call.getInt("height") != nil {
56
- self.height = CGFloat(call.getInt("height")!)
57
- } else {
58
- self.height = UIScreen.main.bounds.size.height
59
- }
60
- self.x = call.getInt("x") != nil ? CGFloat(call.getInt("x")!)/UIScreen.main.scale: 0
61
- self.y = call.getInt("y") != nil ? CGFloat(call.getInt("y")!)/UIScreen.main.scale: 0
62
- if call.getInt("paddingBottom") != nil {
63
- self.paddingBottom = CGFloat(call.getInt("paddingBottom")!)
64
- }
65
-
66
- self.rotateWhenOrientationChanged = call.getBool("rotateWhenOrientationChanged") ?? true
67
- self.toBack = call.getBool("toBack") ?? false
68
- self.storeToFile = call.getBool("storeToFile") ?? false
69
- self.enableZoom = call.getBool("enableZoom") ?? false
70
- self.disableAudio = call.getBool("disableAudio") ?? false
71
-
72
- AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
73
- guard granted else {
74
- call.reject("permission failed")
75
- return
76
- }
77
-
78
- DispatchQueue.main.async {
79
- if self.cameraController.captureSession?.isRunning ?? false {
80
- call.reject("camera already started")
81
- } else {
82
- self.cameraController.prepare(cameraPosition: self.cameraPosition, zoomFactor: self.zoomFactor, disableAudio: self.disableAudio){error in
83
- if let error = error {
84
- print(error)
85
- call.reject(error.localizedDescription)
86
- return
87
- }
88
- let height = self.paddingBottom != nil ? self.height! - self.paddingBottom!: self.height!
89
- self.previewView = UIView(frame: CGRect(x: self.x ?? 0, y: self.y ?? 0, width: self.width!, height: height))
90
- self.webView?.isOpaque = false
91
- self.webView?.backgroundColor = UIColor.clear
92
- self.webView?.scrollView.backgroundColor = UIColor.clear
93
- self.webView?.superview?.addSubview(self.previewView)
94
- if self.toBack! {
95
- self.webView?.superview?.bringSubviewToFront(self.webView!)
96
- }
97
- try? self.cameraController.displayPreview(on: self.previewView)
98
-
99
- let frontView = self.toBack! ? self.webView : self.previewView
100
- self.cameraController.setupGestures(target: frontView ?? self.previewView, enableZoom: self.enableZoom!)
101
-
102
- if self.rotateWhenOrientationChanged == true {
103
- NotificationCenter.default.addObserver(self, selector: #selector(CameraPreview.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
104
- }
105
-
106
- call.resolve()
107
-
108
- }
109
- }
110
- }
111
- })
112
-
113
- }
114
-
115
- @objc func flip(_ call: CAPPluginCall) {
116
- do {
117
- try self.cameraController.switchCameras()
118
- call.resolve()
119
- } catch {
120
- call.reject("failed to flip camera")
121
- }
122
- }
123
- @objc func changeOrientation(_ call: CAPPluginCall) {
124
- do {
125
- try self.cameraController.changeOrientation()
126
- call.resolve()
127
- } catch {
128
- call.reject("failed to change orientation")
129
- }
130
- }
131
-
132
- @objc func stop(_ call: CAPPluginCall) {
133
- DispatchQueue.main.async {
134
- if self.cameraController.captureSession?.isRunning ?? false {
135
- self.cameraController.captureSession?.stopRunning()
136
- self.previewView.removeFromSuperview()
137
- self.webView?.isOpaque = true
138
- call.resolve()
139
- } else {
140
- call.reject("camera already stopped")
141
- }
142
- }
143
- }
144
- // Get user's cache directory path
145
- @objc func getTempFilePath() -> URL {
146
- let path = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
147
- let identifier = UUID()
148
- let randomIdentifier = identifier.uuidString.replacingOccurrences(of: "-", with: "")
149
- let finalIdentifier = String(randomIdentifier.prefix(8))
150
- let fileName="cpcp_capture_"+finalIdentifier+".jpg"
151
- let fileUrl=path.appendingPathComponent(fileName)
152
- return fileUrl
153
- }
154
-
155
- @objc func capture(_ call: CAPPluginCall) {
156
- DispatchQueue.main.async {
157
-
158
- let quality: Int? = call.getInt("quality", 85)
159
-
160
- self.cameraController.captureImage { (image, error) in
161
-
162
- guard let image = image else {
163
- print(error ?? "Image capture error")
164
- guard let error = error else {
165
- call.reject("Image capture error")
166
- return
167
- }
168
- call.reject(error.localizedDescription)
169
- return
170
- }
171
- let imageData: Data?
172
- if self.cameraController.currentCameraPosition == .front {
173
- let flippedImage = image.withHorizontallyFlippedOrientation()
174
- imageData = flippedImage.jpegData(compressionQuality: CGFloat(quality!/100))
175
- } else {
176
- imageData = image.jpegData(compressionQuality: CGFloat(quality!/100))
177
- }
178
-
179
- if self.storeToFile == false {
180
- let imageBase64 = imageData?.base64EncodedString()
181
- call.resolve(["value": imageBase64!])
182
- } else {
183
- do {
184
- let fileUrl=self.getTempFilePath()
185
- try imageData?.write(to: fileUrl)
186
- call.resolve(["value": fileUrl.absoluteString])
187
- } catch {
188
- call.reject("error writing image to file")
189
- }
190
- }
191
- }
192
- }
193
- }
194
-
195
- @objc func captureSample(_ call: CAPPluginCall) {
196
- DispatchQueue.main.async {
197
- let quality: Int? = call.getInt("quality", 85)
198
-
199
- self.cameraController.captureSample { image, error in
200
- guard let image = image else {
201
- print("Image capture error: \(String(describing: error))")
202
- call.reject("Image capture error: \(String(describing: error))")
203
- return
204
- }
205
-
206
- let imageData: Data?
207
- if self.cameraPosition == "front" {
208
- let flippedImage = image.withHorizontallyFlippedOrientation()
209
- imageData = flippedImage.jpegData(compressionQuality: CGFloat(quality!/100))
210
- } else {
211
- imageData = image.jpegData(compressionQuality: CGFloat(quality!/100))
212
- }
213
-
214
- if self.storeToFile == false {
215
- let imageBase64 = imageData?.base64EncodedString()
216
- call.resolve(["value": imageBase64!])
217
- } else {
218
- do {
219
- let fileUrl = self.getTempFilePath()
220
- try imageData?.write(to: fileUrl)
221
- call.resolve(["value": fileUrl.absoluteString])
222
- } catch {
223
- call.reject("Error writing image to file")
224
- }
225
- }
226
- }
227
- }
228
- }
229
-
230
- @objc func getSupportedFlashModes(_ call: CAPPluginCall) {
231
- do {
232
- let supportedFlashModes = try self.cameraController.getSupportedFlashModes()
233
- call.resolve(["result": supportedFlashModes])
234
- } catch {
235
- call.reject("failed to get supported flash modes")
236
- }
237
- }
238
- @objc func getSupportedZoomLevels(_ call: CAPPluginCall) {
239
- do {
240
- let supportedCameras = try self.cameraController.getSupportedCameras()
241
- call.resolve(["result": supportedCameras])
242
- } catch {
243
- call.reject("failed to get supported cameras")
244
- }
245
- }
246
- @objc func setZoom(_ call: CAPPluginCall) {
247
- self.zoomFactor = call.getString("zoomFactor") ?? "wide"
248
- do {
249
- try self.cameraController.setZoom(lens: self.zoomFactor)
250
- call.resolve()
251
- } catch {
252
- call.reject("failed to set zoom")
253
- }
254
- }
255
- @objc func setFlashMode(_ call: CAPPluginCall) {
256
- guard let flashMode = call.getString("flashMode") else {
257
- call.reject("failed to set flash mode. required parameter flashMode is missing")
258
- return
259
- }
260
- do {
261
- var flashModeAsEnum: AVCaptureDevice.FlashMode?
262
- switch flashMode {
263
- case "off" :
264
- flashModeAsEnum = AVCaptureDevice.FlashMode.off
265
- case "on":
266
- flashModeAsEnum = AVCaptureDevice.FlashMode.on
267
- case "auto":
268
- flashModeAsEnum = AVCaptureDevice.FlashMode.auto
269
- default: break
270
- }
271
- if flashModeAsEnum != nil {
272
- try self.cameraController.setFlashMode(flashMode: flashModeAsEnum!)
273
- } else if flashMode == "torch" {
274
- try self.cameraController.setTorchMode()
275
- } else {
276
- call.reject("Flash Mode not supported")
277
- return
278
- }
279
- call.resolve()
280
- } catch {
281
- call.reject("failed to set flash mode")
282
- }
283
- }
284
-
285
- @objc func startRecordVideo(_ call: CAPPluginCall) {
286
- DispatchQueue.main.async {
287
-
288
- let quality: Int? = call.getInt("quality", 85)
289
-
290
- self.cameraController.captureVideo { (image, error) in
291
-
292
- guard let image = image else {
293
- print(error ?? "Image capture error")
294
- guard let error = error else {
295
- call.reject("Image capture error")
296
- return
297
- }
298
- call.reject(error.localizedDescription)
299
- return
300
- }
301
-
302
- // self.videoUrl = image
303
-
304
- call.resolve(["value": image.absoluteString])
305
- }
306
- }
307
- }
308
-
309
- @objc func stopRecordVideo(_ call: CAPPluginCall) {
310
-
311
- self.cameraController.stopRecording { (_) in
312
-
313
- }
314
- }
315
-
316
- }
1
+ import Foundation
2
+ import Capacitor
3
+ import AVFoundation
4
+ /**
5
+ * Please read the Capacitor iOS Plugin Development Guide
6
+ * here: https://capacitor.ionicframework.com/docs/plugins/ios
7
+ */
8
+ @objc(CameraPreview)
9
+ public class CameraPreview: CAPPlugin {
10
+
11
+ var previewView: UIView!
12
+ var cameraPosition = String()
13
+ let cameraController = CameraController()
14
+ var x: CGFloat?
15
+ var y: CGFloat?
16
+ var width: CGFloat?
17
+ var height: CGFloat?
18
+ var paddingBottom: CGFloat?
19
+ var rotateWhenOrientationChanged: Bool?
20
+ var toBack: Bool?
21
+ var storeToFile: Bool?
22
+ var enableZoom: Bool?
23
+ var highResolutionOutput: Bool = false
24
+ var disableAudio: Bool = false
25
+ var zoomFactor = String()
26
+
27
+ @objc func rotated() {
28
+ let height = self.paddingBottom != nil ? self.height! - self.paddingBottom!: self.height!;
29
+
30
+ if UIApplication.shared.statusBarOrientation.isLandscape {
31
+ self.previewView.frame = CGRect(x: self.y!, y: self.x!, width: max(height, self.width!), height: min(height, self.width!))
32
+ self.cameraController.previewLayer?.frame = self.previewView.frame
33
+ }
34
+
35
+ if UIApplication.shared.statusBarOrientation.isPortrait {
36
+ if (self.previewView != nil && self.x != nil && self.y != nil && self.width != nil && self.height != nil) {
37
+ self.previewView.frame = CGRect(x: self.x!, y: self.y!, width: min(height, self.width!), height: max(height, self.width!))
38
+ }
39
+ self.cameraController.previewLayer?.frame = self.previewView.frame
40
+ }
41
+
42
+ cameraController.updateVideoOrientation()
43
+ }
44
+
45
+ @objc func start(_ call: CAPPluginCall) {
46
+ self.cameraPosition = call.getString("position") ?? "rear"
47
+ self.zoomFactor = call.getString("zoomFactor") ?? "wide"
48
+ self.highResolutionOutput = call.getBool("enableHighResolution") ?? false
49
+ self.cameraController.highResolutionOutput = self.highResolutionOutput
50
+ if call.getInt("width") != nil {
51
+ self.width = CGFloat(call.getInt("width")!)
52
+ } else {
53
+ self.width = UIScreen.main.bounds.size.width
54
+ }
55
+ if call.getInt("height") != nil {
56
+ self.height = CGFloat(call.getInt("height")!)
57
+ } else {
58
+ self.height = UIScreen.main.bounds.size.height
59
+ }
60
+ self.x = call.getInt("x") != nil ? CGFloat(call.getInt("x")!)/UIScreen.main.scale: 0
61
+ self.y = call.getInt("y") != nil ? CGFloat(call.getInt("y")!)/UIScreen.main.scale: 0
62
+ if call.getInt("paddingBottom") != nil {
63
+ self.paddingBottom = CGFloat(call.getInt("paddingBottom")!)
64
+ }
65
+
66
+ self.rotateWhenOrientationChanged = call.getBool("rotateWhenOrientationChanged") ?? true
67
+ self.toBack = call.getBool("toBack") ?? false
68
+ self.storeToFile = call.getBool("storeToFile") ?? false
69
+ self.enableZoom = call.getBool("enableZoom") ?? false
70
+ self.disableAudio = call.getBool("disableAudio") ?? false
71
+
72
+ AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
73
+ guard granted else {
74
+ call.reject("permission failed")
75
+ return
76
+ }
77
+
78
+ DispatchQueue.main.async {
79
+ if self.cameraController.captureSession?.isRunning ?? false {
80
+ call.reject("camera already started")
81
+ } else {
82
+ self.cameraController.prepare(cameraPosition: self.cameraPosition, zoomFactor: self.zoomFactor, disableAudio: self.disableAudio){error in
83
+ if let error = error {
84
+ print(error)
85
+ call.reject(error.localizedDescription)
86
+ return
87
+ }
88
+ let height = self.paddingBottom != nil ? self.height! - self.paddingBottom!: self.height!
89
+ self.previewView = UIView(frame: CGRect(x: self.x ?? 0, y: self.y ?? 0, width: self.width!, height: height))
90
+ self.webView?.isOpaque = false
91
+ self.webView?.backgroundColor = UIColor.clear
92
+ self.webView?.scrollView.backgroundColor = UIColor.clear
93
+ self.webView?.superview?.addSubview(self.previewView)
94
+ if self.toBack! {
95
+ self.webView?.superview?.bringSubviewToFront(self.webView!)
96
+ }
97
+ try? self.cameraController.displayPreview(on: self.previewView)
98
+
99
+ let frontView = self.toBack! ? self.webView : self.previewView
100
+ self.cameraController.setupGestures(target: frontView ?? self.previewView, enableZoom: self.enableZoom!)
101
+
102
+ if self.rotateWhenOrientationChanged == true {
103
+ NotificationCenter.default.addObserver(self, selector: #selector(CameraPreview.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
104
+ }
105
+
106
+ call.resolve()
107
+
108
+ }
109
+ }
110
+ }
111
+ })
112
+
113
+ }
114
+
115
+ @objc func flip(_ call: CAPPluginCall) {
116
+ do {
117
+ try self.cameraController.switchCameras()
118
+ call.resolve()
119
+ } catch {
120
+ call.reject("failed to flip camera")
121
+ }
122
+ }
123
+
124
+ @objc func stop(_ call: CAPPluginCall) {
125
+ DispatchQueue.main.async {
126
+ if self.cameraController.captureSession?.isRunning ?? false {
127
+ self.cameraController.captureSession?.stopRunning()
128
+ self.previewView.removeFromSuperview()
129
+ self.webView?.isOpaque = true
130
+ call.resolve()
131
+ } else {
132
+ call.reject("camera already stopped")
133
+ }
134
+ }
135
+ }
136
+ // Get user's cache directory path
137
+ @objc func getTempFilePath() -> URL {
138
+ let path = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
139
+ let identifier = UUID()
140
+ let randomIdentifier = identifier.uuidString.replacingOccurrences(of: "-", with: "")
141
+ let finalIdentifier = String(randomIdentifier.prefix(8))
142
+ let fileName="cpcp_capture_"+finalIdentifier+".jpg"
143
+ let fileUrl=path.appendingPathComponent(fileName)
144
+ return fileUrl
145
+ }
146
+
147
+ @objc func capture(_ call: CAPPluginCall) {
148
+ DispatchQueue.main.async {
149
+
150
+ let quality: Int? = call.getInt("quality", 85)
151
+
152
+ self.cameraController.captureImage { (image, error) in
153
+
154
+ guard let image = image else {
155
+ print(error ?? "Image capture error")
156
+ guard let error = error else {
157
+ call.reject("Image capture error")
158
+ return
159
+ }
160
+ call.reject(error.localizedDescription)
161
+ return
162
+ }
163
+ let imageData: Data?
164
+ if self.cameraController.currentCameraPosition == .front {
165
+ let flippedImage = image.withHorizontallyFlippedOrientation()
166
+ imageData = flippedImage.jpegData(compressionQuality: CGFloat(quality!/100))
167
+ } else {
168
+ imageData = image.jpegData(compressionQuality: CGFloat(quality!/100))
169
+ }
170
+
171
+ if self.storeToFile == false {
172
+ let imageBase64 = imageData?.base64EncodedString()
173
+ call.resolve(["value": imageBase64!])
174
+ } else {
175
+ do {
176
+ let fileUrl=self.getTempFilePath()
177
+ try imageData?.write(to: fileUrl)
178
+ call.resolve(["value": fileUrl.absoluteString])
179
+ } catch {
180
+ call.reject("error writing image to file")
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+
187
+ @objc func captureSample(_ call: CAPPluginCall) {
188
+ DispatchQueue.main.async {
189
+ let quality: Int? = call.getInt("quality", 85)
190
+
191
+ self.cameraController.captureSample { image, error in
192
+ guard let image = image else {
193
+ print("Image capture error: \(String(describing: error))")
194
+ call.reject("Image capture error: \(String(describing: error))")
195
+ return
196
+ }
197
+
198
+ let imageData: Data?
199
+ if self.cameraPosition == "front" {
200
+ let flippedImage = image.withHorizontallyFlippedOrientation()
201
+ imageData = flippedImage.jpegData(compressionQuality: CGFloat(quality!/100))
202
+ } else {
203
+ imageData = image.jpegData(compressionQuality: CGFloat(quality!/100))
204
+ }
205
+
206
+ if self.storeToFile == false {
207
+ let imageBase64 = imageData?.base64EncodedString()
208
+ call.resolve(["value": imageBase64!])
209
+ } else {
210
+ do {
211
+ let fileUrl = self.getTempFilePath()
212
+ try imageData?.write(to: fileUrl)
213
+ call.resolve(["value": fileUrl.absoluteString])
214
+ } catch {
215
+ call.reject("Error writing image to file")
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+
222
+ @objc func getSupportedFlashModes(_ call: CAPPluginCall) {
223
+ do {
224
+ let supportedFlashModes = try self.cameraController.getSupportedFlashModes()
225
+ call.resolve(["result": supportedFlashModes])
226
+ } catch {
227
+ call.reject("failed to get supported flash modes")
228
+ }
229
+ }
230
+ @objc func getSupportedZoomLevels(_ call: CAPPluginCall) {
231
+ do {
232
+ let supportedCameras = try self.cameraController.getSupportedCameras()
233
+ call.resolve(["result": supportedCameras])
234
+ } catch {
235
+ call.reject("failed to get supported cameras")
236
+ }
237
+ }
238
+ @objc func setZoom(_ call: CAPPluginCall) {
239
+ self.zoomFactor = call.getString("zoomFactor") ?? "wide"
240
+ do {
241
+ try self.cameraController.setZoom(lens: self.zoomFactor)
242
+ call.resolve()
243
+ } catch {
244
+ call.reject("failed to set zoom")
245
+ }
246
+ }
247
+ @objc func setFlashMode(_ call: CAPPluginCall) {
248
+ guard let flashMode = call.getString("flashMode") else {
249
+ call.reject("failed to set flash mode. required parameter flashMode is missing")
250
+ return
251
+ }
252
+ do {
253
+ var flashModeAsEnum: AVCaptureDevice.FlashMode?
254
+ switch flashMode {
255
+ case "off" :
256
+ flashModeAsEnum = AVCaptureDevice.FlashMode.off
257
+ case "on":
258
+ flashModeAsEnum = AVCaptureDevice.FlashMode.on
259
+ case "auto":
260
+ flashModeAsEnum = AVCaptureDevice.FlashMode.auto
261
+ default: break
262
+ }
263
+ if flashModeAsEnum != nil {
264
+ try self.cameraController.setFlashMode(flashMode: flashModeAsEnum!)
265
+ } else if flashMode == "torch" {
266
+ try self.cameraController.setTorchMode()
267
+ } else {
268
+ call.reject("Flash Mode not supported")
269
+ return
270
+ }
271
+ call.resolve()
272
+ } catch {
273
+ call.reject("failed to set flash mode")
274
+ }
275
+ }
276
+
277
+ @objc func startRecordVideo(_ call: CAPPluginCall) {
278
+ DispatchQueue.main.async {
279
+
280
+ let quality: Int? = call.getInt("quality", 85)
281
+
282
+ self.cameraController.captureVideo { (image, error) in
283
+
284
+ guard let image = image else {
285
+ print(error ?? "Image capture error")
286
+ guard let error = error else {
287
+ call.reject("Image capture error")
288
+ return
289
+ }
290
+ call.reject(error.localizedDescription)
291
+ return
292
+ }
293
+
294
+ // self.videoUrl = image
295
+
296
+ call.resolve(["value": image.absoluteString])
297
+ }
298
+ }
299
+ }
300
+
301
+ @objc func stopRecordVideo(_ call: CAPPluginCall) {
302
+
303
+ self.cameraController.stopRecording { (_) in
304
+
305
+ }
306
+ }
307
+
308
+ }