capacitor-community-multilens-camerapreview 5.0.1 → 6.0.0

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