@capgo/camera-preview 3.2.3

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