expo-camera 13.8.0 → 13.9.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 (110) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/android/build.gradle +18 -5
  3. package/android/src/main/AndroidManifest.xml +1 -0
  4. package/android/src/main/java/expo/modules/camera/CameraViewModule.kt +1 -1
  5. package/android/src/main/java/expo/modules/camera/Options.kt +2 -2
  6. package/android/src/main/java/expo/modules/camera/next/CameraExceptions.kt +9 -0
  7. package/android/src/main/java/expo/modules/camera/next/CameraViewHelper.kt +40 -0
  8. package/android/src/main/java/expo/modules/camera/next/CameraViewNextModule.kt +158 -0
  9. package/android/src/main/java/expo/modules/camera/next/ExpoCameraView.kt +479 -0
  10. package/android/src/main/java/expo/modules/camera/next/Options.kt +22 -0
  11. package/android/src/main/java/expo/modules/camera/next/analyzers/BarcodeAnalyzer.kt +77 -0
  12. package/android/src/main/java/expo/modules/camera/next/records/CameraRecords.kt +71 -0
  13. package/android/src/main/java/expo/modules/camera/next/tasks/PictureSavedDelegate.kt +7 -0
  14. package/android/src/main/java/expo/modules/camera/next/tasks/ResolveTakenPicture.kt +248 -0
  15. package/android/src/main/java/expo/modules/camera/next/utils/FileSystemUtils.kt +22 -0
  16. package/android/src/main/java/expo/modules/camera/next/utils/ImageDimensions.kt +16 -0
  17. package/android/src/main/java/expo/modules/camera/utils/FileSystemUtils.kt +8 -0
  18. package/build/Camera.js +2 -2
  19. package/build/Camera.js.map +1 -1
  20. package/build/{ExponentCamera.d.ts → ExpoCamera.d.ts} +1 -1
  21. package/build/ExpoCamera.d.ts.map +1 -0
  22. package/build/ExpoCamera.js +4 -0
  23. package/build/ExpoCamera.js.map +1 -0
  24. package/build/ExponentCamera.web.js +5 -3
  25. package/build/ExponentCamera.web.js.map +1 -1
  26. package/build/ExponentCameraManager.d.ts.map +1 -1
  27. package/build/ExponentCameraManager.js +1 -1
  28. package/build/ExponentCameraManager.js.map +1 -1
  29. package/build/next/Camera.d.ts +139 -0
  30. package/build/next/Camera.d.ts.map +1 -0
  31. package/build/next/Camera.js +256 -0
  32. package/build/next/Camera.js.map +1 -0
  33. package/build/next/Camera.types.d.ts +396 -0
  34. package/build/next/Camera.types.d.ts.map +1 -0
  35. package/build/next/Camera.types.js +15 -0
  36. package/build/next/Camera.types.js.map +1 -0
  37. package/build/next/ExpoCamera.d.ts +5 -0
  38. package/build/next/ExpoCamera.d.ts.map +1 -0
  39. package/build/next/ExpoCamera.js +4 -0
  40. package/build/next/ExpoCamera.js.map +1 -0
  41. package/build/next/ExpoCamera.web.d.ts +13 -0
  42. package/build/next/ExpoCamera.web.d.ts.map +1 -0
  43. package/build/next/ExpoCamera.web.js +106 -0
  44. package/build/next/ExpoCamera.web.js.map +1 -0
  45. package/build/next/ExpoCameraManager.d.ts +3 -0
  46. package/build/next/ExpoCameraManager.d.ts.map +1 -0
  47. package/build/next/ExpoCameraManager.js +3 -0
  48. package/build/next/ExpoCameraManager.js.map +1 -0
  49. package/build/next/ExpoCameraManager.web.d.ts +42 -0
  50. package/build/next/ExpoCameraManager.web.d.ts.map +1 -0
  51. package/build/next/ExpoCameraManager.web.js +216 -0
  52. package/build/next/ExpoCameraManager.web.js.map +1 -0
  53. package/build/next/index.d.ts +4 -0
  54. package/build/next/index.d.ts.map +1 -0
  55. package/build/next/index.js +4 -0
  56. package/build/next/index.js.map +1 -0
  57. package/build/next/utils/props.d.ts +8 -0
  58. package/build/next/utils/props.d.ts.map +1 -0
  59. package/build/next/utils/props.js +33 -0
  60. package/build/next/utils/props.js.map +1 -0
  61. package/expo-module.config.json +5 -2
  62. package/ios/CameraEnums.swift +98 -0
  63. package/ios/CameraExceptions.swift +55 -0
  64. package/ios/CameraPermissionsRequester.swift +125 -0
  65. package/ios/CameraRecordingOptions.swift +57 -0
  66. package/ios/CameraView.swift +982 -0
  67. package/ios/{EXCamera/CameraViewModule.swift → CameraViewModule.swift} +98 -90
  68. package/ios/CameraViewNextModule.swift +231 -0
  69. package/ios/{EXCamera.podspec → ExpoCamera.podspec} +7 -4
  70. package/ios/ExpoCameraUtils.swift +175 -0
  71. package/ios/Next/BarcodeRecord.swift +75 -0
  72. package/ios/Next/BarcodeScanner.swift +182 -0
  73. package/ios/Next/BarcodeScannerUtils.swift +117 -0
  74. package/ios/Next/CameraEnumsNext.swift +29 -0
  75. package/ios/Next/CameraRecordingOptionsNext.swift +54 -0
  76. package/ios/Next/CameraViewNext.swift +777 -0
  77. package/ios/Next/ExpoCameraUtilsNext.swift +175 -0
  78. package/ios/Next/PreviewView.swift +24 -0
  79. package/ios/Next/Scanner+Delegates.swift +52 -0
  80. package/ios/Next/TakePictureOptionsNext.swift +23 -0
  81. package/ios/Next/VisionScannerDelegate.swift +25 -0
  82. package/next.d.ts +1 -0
  83. package/next.js +1 -0
  84. package/package.json +2 -2
  85. package/src/Camera.tsx +2 -2
  86. package/src/{ExponentCamera.ts → ExpoCamera.ts} +1 -1
  87. package/src/ExponentCamera.web.tsx +4 -3
  88. package/src/ExponentCameraManager.ts +1 -1
  89. package/src/next/Camera.tsx +349 -0
  90. package/src/next/Camera.types.ts +447 -0
  91. package/src/next/ExpoCamera.ts +9 -0
  92. package/src/next/ExpoCamera.web.tsx +164 -0
  93. package/src/next/ExpoCameraManager.ts +3 -0
  94. package/src/next/ExpoCameraManager.web.ts +239 -0
  95. package/src/next/index.ts +9 -0
  96. package/src/next/utils/props.ts +45 -0
  97. package/build/ExponentCamera.d.ts.map +0 -1
  98. package/build/ExponentCamera.js +0 -4
  99. package/build/ExponentCamera.js.map +0 -1
  100. package/ios/EXCamera/EXCamera.h +0 -112
  101. package/ios/EXCamera/EXCamera.m +0 -1046
  102. package/ios/EXCamera/EXCameraCameraPermissionRequester.h +0 -7
  103. package/ios/EXCamera/EXCameraCameraPermissionRequester.m +0 -54
  104. package/ios/EXCamera/EXCameraMicrophonePermissionRequester.h +0 -7
  105. package/ios/EXCamera/EXCameraMicrophonePermissionRequester.m +0 -54
  106. package/ios/EXCamera/EXCameraPermissionRequester.h +0 -7
  107. package/ios/EXCamera/EXCameraPermissionRequester.m +0 -54
  108. package/ios/EXCamera/Utilities/EXCameraUtils.h +0 -35
  109. package/ios/EXCamera/Utilities/EXCameraUtils.m +0 -228
  110. /package/ios/{EXCamera/TakePictureOptions.swift → TakePictureOptions.swift} +0 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,25 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 13.9.0 — 2023-11-14
14
+
15
+ ### 🛠 Breaking changes
16
+
17
+ - Bumped iOS deployment target to 13.4. ([#25063](https://github.com/expo/expo/pull/25063) by [@gabrieldonadel](https://github.com/gabrieldonadel))
18
+ - On `Android` bump `compileSdkVersion` and `targetSdkVersion` to `34`. ([#24708](https://github.com/expo/expo/pull/24708) by [@alanjhughes](https://github.com/alanjhughes))
19
+
20
+ ### 🎉 New features
21
+
22
+ - [iOS] Rewrote Objective-C classes to Swift. ([#22604](https://github.com/expo/expo/pull/22604) by [@alanjhughes](https://github.com/alanjhughes))
23
+
24
+ ### 🐛 Bug fixes
25
+
26
+ - [iOS] Fix a regression from ([#22604](https://github.com/expo/expo/pull/22604) that prevented the barcode scanner from starting.([#25053](https://github.com/expo/expo/pull/25053) by [@alanjhughes](https://github.com/alanjhughes))
27
+
28
+ ### 💡 Others
29
+
30
+ - Use `pointerEvent` style instead of prop. ([#24931](https://github.com/expo/expo/pull/24931) by [@EvanBacon](https://github.com/EvanBacon))
31
+
13
32
  ## 13.8.0 — 2023-10-17
14
33
 
15
34
  ### 🛠 Breaking changes
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
3
3
  apply plugin: 'maven-publish'
4
4
 
5
5
  group = 'host.exp.exponent'
6
- version = '13.8.0'
6
+ version = '13.9.0'
7
7
 
8
8
  def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
9
9
  if (expoModulesCorePlugin.exists()) {
@@ -61,11 +61,11 @@ if (!safeExtGet("expoProvidesDefaultConfig", false)) {
61
61
  android {
62
62
  // Remove this if and it's contents, when support for SDK49 is dropped
63
63
  if (!safeExtGet("expoProvidesDefaultConfig", false)) {
64
- compileSdkVersion safeExtGet("compileSdkVersion", 33)
64
+ compileSdkVersion safeExtGet("compileSdkVersion", 34)
65
65
 
66
66
  defaultConfig {
67
67
  minSdkVersion safeExtGet("minSdkVersion", 23)
68
- targetSdkVersion safeExtGet("targetSdkVersion", 33)
68
+ targetSdkVersion safeExtGet("targetSdkVersion", 34)
69
69
  }
70
70
 
71
71
  publishing {
@@ -94,7 +94,7 @@ android {
94
94
  namespace "expo.modules.camera"
95
95
  defaultConfig {
96
96
  versionCode 32
97
- versionName "13.8.0"
97
+ versionName "13.9.0"
98
98
  }
99
99
  }
100
100
 
@@ -111,7 +111,20 @@ dependencies {
111
111
  implementation project(':expo-modules-core')
112
112
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}"
113
113
  }
114
+ def camerax_version = "1.3.0"
115
+
116
+ api "androidx.exifinterface:exifinterface:1.3.6"
117
+ api 'com.google.android:cameraview:1.0.0'
118
+
119
+ implementation "androidx.camera:camera-core:${camerax_version}"
120
+ implementation "androidx.camera:camera-camera2:${camerax_version}"
121
+ implementation "androidx.camera:camera-lifecycle:${camerax_version}"
122
+ implementation "androidx.camera:camera-video:${camerax_version}"
123
+
124
+ implementation "androidx.camera:camera-view:${camerax_version}"
125
+ implementation "androidx.camera:camera-extensions:${camerax_version}"
126
+ implementation "com.google.mlkit:barcode-scanning:17.2.0"
127
+ implementation 'androidx.camera:camera-mlkit-vision:1.4.0-alpha02'
114
128
 
115
- api "androidx.exifinterface:exifinterface:1.0.0"
116
129
  api 'com.google.android:cameraview:1.0.0'
117
130
  }
@@ -1,3 +1,4 @@
1
1
  <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
2
  <uses-permission android:name="android.permission.CAMERA" />
3
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
3
4
  </manifest>
@@ -17,7 +17,7 @@ import java.io.File
17
17
 
18
18
  class CameraViewModule : Module() {
19
19
  override fun definition() = ModuleDefinition {
20
- Name("ExponentCamera")
20
+ Name("ExpoCamera")
21
21
 
22
22
  Constants(
23
23
  "Type" to mapOf(
@@ -16,8 +16,8 @@ class PictureOptions : Record {
16
16
  }
17
17
 
18
18
  class RecordingOptions : Record {
19
- @Field val maxDuration: Int = -1
20
- @Field val maxFileSize: Int = -1
19
+ @Field val maxDuration: Int = 0
20
+ @Field val maxFileSize: Int = 0
21
21
  @Field val quality: Int = CamcorderProfile.QUALITY_HIGH
22
22
  @Field val mute: Boolean = false
23
23
  @Field val videoBitrate: Int? = null
@@ -0,0 +1,9 @@
1
+ package expo.modules.camera.next
2
+
3
+ import expo.modules.kotlin.exception.CodedException
4
+
5
+ class CameraExceptions {
6
+ class ImageCaptureFailed : CodedException(message = "Failed to capture image")
7
+
8
+ class VideoRecordingFailed(cause: String?) : CodedException("Video recording failed: $cause")
9
+ }
@@ -0,0 +1,40 @@
1
+ package expo.modules.camera.next
2
+
3
+ import android.graphics.Bitmap
4
+ import android.graphics.Canvas
5
+ import android.graphics.Color
6
+ import android.graphics.Paint
7
+ import expo.modules.camera.next.records.CameraType
8
+ import java.io.ByteArrayOutputStream
9
+ import java.text.SimpleDateFormat
10
+ import java.util.Calendar
11
+ import java.util.Locale
12
+
13
+ object CameraViewHelper {
14
+ // Utilities
15
+ @JvmStatic
16
+ fun getCorrectCameraRotation(rotation: Int, facing: CameraType) =
17
+ if (facing == CameraType.FRONT) (rotation - 90 + 360) % 360
18
+ else (-rotation + 90 + 360) % 360
19
+
20
+ fun generateSimulatorPhoto(width: Int, height: Int): ByteArray {
21
+ val fakePhotoBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
22
+ val canvas = Canvas(fakePhotoBitmap)
23
+ val background = Paint().apply {
24
+ color = Color.BLACK
25
+ }
26
+ canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), background)
27
+ val textPaint = Paint().apply {
28
+ color = Color.YELLOW
29
+ textSize = 35f
30
+ }
31
+ val calendar = Calendar.getInstance()
32
+ val simpleDateFormat = SimpleDateFormat("dd.MM.yy HH:mm:ss", Locale.US)
33
+ canvas.drawText(simpleDateFormat.format(calendar.time), width * 0.1f, height * 0.9f, textPaint)
34
+
35
+ val stream = ByteArrayOutputStream()
36
+ fakePhotoBitmap.compress(Bitmap.CompressFormat.PNG, 90, stream)
37
+ val fakePhotoByteArray = stream.toByteArray()
38
+ return fakePhotoByteArray
39
+ }
40
+ }
@@ -0,0 +1,158 @@
1
+ package expo.modules.camera.next
2
+
3
+ import android.Manifest
4
+ import android.util.Log
5
+ import expo.modules.camera.next.records.BarCodeSettings
6
+ import expo.modules.camera.next.records.CameraMode
7
+ import expo.modules.camera.next.records.CameraType
8
+ import expo.modules.camera.next.records.FlashMode
9
+ import expo.modules.camera.next.tasks.ResolveTakenPicture
10
+ import expo.modules.core.errors.ModuleDestroyedException
11
+ import expo.modules.core.utilities.EmulatorUtilities
12
+ import expo.modules.interfaces.permissions.Permissions
13
+ import expo.modules.kotlin.Promise
14
+ import expo.modules.kotlin.exception.Exceptions
15
+ import expo.modules.kotlin.functions.Queues
16
+ import expo.modules.kotlin.modules.Module
17
+ import expo.modules.kotlin.modules.ModuleDefinition
18
+ import kotlinx.coroutines.CoroutineScope
19
+ import kotlinx.coroutines.Dispatchers
20
+ import kotlinx.coroutines.cancel
21
+ import kotlinx.coroutines.launch
22
+ import java.io.File
23
+
24
+ val cameraEvents = arrayOf(
25
+ "onCameraReady",
26
+ "onMountError",
27
+ "onBarCodeScanned",
28
+ "onFacesDetected",
29
+ "onFaceDetectionError",
30
+ "onPictureSaved"
31
+ )
32
+
33
+ class CameraViewNextModule : Module() {
34
+ private val moduleScope = CoroutineScope(Dispatchers.Main)
35
+ override fun definition() = ModuleDefinition {
36
+ Name("ExpoCameraNext")
37
+
38
+ Events("onModernBarcodeScanned")
39
+
40
+ AsyncFunction("requestCameraPermissionsAsync") { promise: Promise ->
41
+ Permissions.askForPermissionsWithPermissionsManager(
42
+ permissionsManager,
43
+ promise,
44
+ Manifest.permission.CAMERA
45
+ )
46
+ }
47
+
48
+ AsyncFunction("requestMicrophonePermissionsAsync") { promise: Promise ->
49
+ Permissions.askForPermissionsWithPermissionsManager(
50
+ permissionsManager,
51
+ promise,
52
+ Manifest.permission.RECORD_AUDIO
53
+ )
54
+ }
55
+
56
+ AsyncFunction("getCameraPermissionsAsync") { promise: Promise ->
57
+ Permissions.getPermissionsWithPermissionsManager(
58
+ permissionsManager,
59
+ promise,
60
+ Manifest.permission.CAMERA
61
+ )
62
+ }
63
+
64
+ AsyncFunction("getMicrophonePermissionsAsync") { promise: Promise ->
65
+ Permissions.getPermissionsWithPermissionsManager(
66
+ permissionsManager,
67
+ promise,
68
+ Manifest.permission.RECORD_AUDIO
69
+ )
70
+ }
71
+
72
+ OnDestroy {
73
+ try {
74
+ moduleScope.cancel(ModuleDestroyedException())
75
+ } catch (e: IllegalStateException) {
76
+ Log.e(TAG, "The scope does not have a job in it")
77
+ }
78
+ }
79
+
80
+ View(ExpoCameraView::class) {
81
+ Events(cameraEvents)
82
+
83
+ Prop("type") { view, type: CameraType ->
84
+ view.lenFacing = type
85
+ }
86
+
87
+ Prop("flashMode") { view, flashMode: FlashMode ->
88
+ view.setCameraFlashMode(flashMode)
89
+ }
90
+
91
+ Prop("enableTorch") { view, enabled: Boolean ->
92
+ view.setTorchEnabled(enabled)
93
+ }
94
+
95
+ Prop("zoom") { view, zoom: Float ->
96
+ view.camera?.cameraControl?.setLinearZoom(zoom)
97
+ }
98
+
99
+ Prop("mode") { view, mode: CameraMode ->
100
+ view.cameraMode = mode
101
+ }
102
+
103
+ Prop("mute") { view, muted: Boolean? ->
104
+ view.mute = muted ?: false
105
+ }
106
+
107
+ Prop("barCodeScannerSettings") { view, settings: BarCodeSettings? ->
108
+ if (settings == null) {
109
+ return@Prop
110
+ }
111
+ view.setBarCodeScannerSettings(settings)
112
+ }
113
+
114
+ Prop("barCodeScannerEnabled") { view, barCodeScannerEnabled: Boolean? ->
115
+ view.setShouldScanBarCodes(barCodeScannerEnabled ?: false)
116
+ }
117
+
118
+ AsyncFunction("takePicture") { view: ExpoCameraView, options: PictureOptions, promise: Promise ->
119
+ if (!EmulatorUtilities.isRunningOnEmulator()) {
120
+ view.takePicture(options, promise, cacheDirectory)
121
+ } else {
122
+ val image = CameraViewHelper.generateSimulatorPhoto(view.width, view.height)
123
+ moduleScope.launch {
124
+ ResolveTakenPicture(image, promise, options, cacheDirectory) { response ->
125
+ view.onPictureSaved(response)
126
+ }.resolve()
127
+ }
128
+ }
129
+ }.runOnQueue(Queues.MAIN)
130
+
131
+ AsyncFunction("record") { view: ExpoCameraView, options: RecordingOptions, promise: Promise ->
132
+ if (!view.mute && !permissionsManager.hasGrantedPermissions(Manifest.permission.RECORD_AUDIO)) {
133
+ throw Exceptions.MissingPermissions(Manifest.permission.RECORD_AUDIO)
134
+ }
135
+
136
+ view.record(options, promise, cacheDirectory)
137
+ }.runOnQueue(Queues.MAIN)
138
+
139
+ AsyncFunction("stopRecording") { view: ExpoCameraView ->
140
+ view.activeRecording?.close()
141
+ }.runOnQueue(Queues.MAIN)
142
+
143
+ OnViewDestroys { view ->
144
+ view.cancelCoroutineScope()
145
+ }
146
+ }
147
+ }
148
+
149
+ private val cacheDirectory: File
150
+ get() = appContext.cacheDirectory
151
+
152
+ private val permissionsManager: Permissions
153
+ get() = appContext.permissions ?: throw Exceptions.PermissionsModuleNotFound()
154
+
155
+ companion object {
156
+ internal val TAG = CameraViewNextModule::class.java.simpleName
157
+ }
158
+ }