one 2.6.20 → 2.6.22
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/android/src/main/java/dev/onejs/onenative/OneNativeCameraManager.kt +24 -0
- package/android/src/main/java/dev/onejs/onenative/OneNativeCameraView.kt +197 -2
- package/cpp/HybridOneCrypto.cpp +327 -1
- package/cpp/HybridOneCrypto.hpp +8 -0
- package/dist/cjs/index.cjs +25 -22
- package/dist/cjs/index.native.cjs +25 -22
- package/dist/cjs/index.native.js +25 -22
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/one.cjs +1 -0
- package/dist/cjs/one.native.cjs +1 -0
- package/dist/cjs/one.native.js +1 -0
- package/dist/cjs/one.native.js.map +1 -1
- package/dist/cjs/platform/camera/index.cjs +3 -2
- package/dist/cjs/platform/camera/index.native.cjs +89 -3
- package/dist/cjs/platform/camera/index.native.js +89 -3
- package/dist/cjs/platform/camera/index.native.js.map +1 -1
- package/dist/cjs/platform/crypto/aes.cjs +259 -0
- package/dist/cjs/platform/crypto/aes.native.cjs +343 -0
- package/dist/cjs/platform/crypto/aes.native.js +345 -0
- package/dist/cjs/platform/crypto/aes.native.js.map +1 -0
- package/dist/cjs/platform/crypto/bytes.cjs +132 -0
- package/dist/cjs/platform/crypto/bytes.native.cjs +175 -0
- package/dist/cjs/platform/crypto/bytes.native.js +177 -0
- package/dist/cjs/platform/crypto/bytes.native.js.map +1 -0
- package/dist/cjs/platform/crypto/digest-api.cjs +65 -0
- package/dist/cjs/platform/crypto/digest-api.native.cjs +69 -0
- package/dist/cjs/platform/crypto/digest-api.native.js +71 -0
- package/dist/cjs/platform/crypto/digest-api.native.js.map +1 -0
- package/dist/cjs/platform/crypto/digest.cjs +26 -15
- package/dist/cjs/platform/crypto/digest.native.cjs +26 -15
- package/dist/cjs/platform/crypto/digest.native.js +26 -15
- package/dist/cjs/platform/crypto/digest.native.js.map +1 -1
- package/dist/cjs/platform/crypto/index.cjs +19 -1
- package/dist/cjs/platform/crypto/index.native.cjs +39 -1
- package/dist/cjs/platform/crypto/index.native.js +39 -1
- package/dist/cjs/platform/crypto/index.native.js.map +1 -1
- package/dist/cjs/platform/crypto/types.cjs +16 -0
- package/dist/cjs/platform/crypto/types.native.cjs +18 -0
- package/dist/cjs/platform/crypto/types.native.js +20 -0
- package/dist/cjs/platform/crypto/types.native.js.map +1 -0
- package/dist/cjs/platform/crypto/web.cjs +73 -0
- package/dist/cjs/platform/extras.cjs +4 -0
- package/dist/cjs/platform/extras.native.cjs +4 -0
- package/dist/cjs/platform/extras.native.js +4 -0
- package/dist/cjs/platform/extras.native.js.map +1 -1
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.cjs +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.cjs +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.js +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.js.map +3 -3
- package/dist/cjs/router/router.cjs +4 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/one.mjs +2 -1
- package/dist/esm/one.mjs.map +1 -1
- package/dist/esm/one.native.js +2 -1
- package/dist/esm/one.native.js.map +1 -1
- package/dist/esm/platform/camera/index.mjs +4 -2
- package/dist/esm/platform/camera/index.mjs.map +1 -1
- package/dist/esm/platform/camera/index.native.js +90 -4
- package/dist/esm/platform/camera/index.native.js.map +1 -1
- package/dist/esm/platform/crypto/aes.mjs +236 -0
- package/dist/esm/platform/crypto/aes.mjs.map +1 -0
- package/dist/esm/platform/crypto/aes.native.js +318 -0
- package/dist/esm/platform/crypto/aes.native.js.map +1 -0
- package/dist/esm/platform/crypto/bytes.mjs +104 -0
- package/dist/esm/platform/crypto/bytes.mjs.map +1 -0
- package/dist/esm/platform/crypto/bytes.native.js +145 -0
- package/dist/esm/platform/crypto/bytes.native.js.map +1 -0
- package/dist/esm/platform/crypto/digest-api.mjs +42 -0
- package/dist/esm/platform/crypto/digest-api.mjs.map +1 -0
- package/dist/esm/platform/crypto/digest-api.native.js +44 -0
- package/dist/esm/platform/crypto/digest-api.native.js.map +1 -0
- package/dist/esm/platform/crypto/digest.mjs +23 -15
- package/dist/esm/platform/crypto/digest.mjs.map +1 -1
- package/dist/esm/platform/crypto/digest.native.js +23 -15
- package/dist/esm/platform/crypto/digest.native.js.map +1 -1
- package/dist/esm/platform/crypto/index.mjs +14 -1
- package/dist/esm/platform/crypto/index.mjs.map +1 -1
- package/dist/esm/platform/crypto/index.native.js +34 -1
- package/dist/esm/platform/crypto/index.native.js.map +1 -1
- package/dist/esm/platform/crypto/types.mjs +0 -0
- package/dist/esm/platform/crypto/types.native.js +0 -0
- package/dist/esm/platform/crypto/web.mjs +50 -0
- package/dist/esm/platform/crypto/web.mjs.map +1 -0
- package/dist/esm/platform/extras.mjs +2 -1
- package/dist/esm/platform/extras.native.js +2 -1
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.mjs +25 -9
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.mjs.map +3 -3
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.native.js +25 -9
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.native.js.map +3 -3
- package/dist/esm/router/router.mjs +5 -2
- package/dist/esm/router/router.mjs.map +1 -1
- package/ios/OneNativeCameraComponentView.mm +28 -0
- package/ios/OneNativeCameraView.swift +163 -0
- package/nitrogen/generated/shared/c++/HybridOneCryptoSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridOneCryptoSpec.hpp +4 -1
- package/package.json +12 -12
- package/src/index.ts +4 -0
- package/src/one.ts +3 -0
- package/src/platform/camera/index.native.tsx +116 -12
- package/src/platform/camera/index.tsx +15 -4
- package/src/platform/camera/types.ts +22 -0
- package/src/platform/crypto/aes.ts +345 -0
- package/src/platform/crypto/bytes.ts +120 -0
- package/src/platform/crypto/digest-api.ts +50 -0
- package/src/platform/crypto/digest.ts +24 -15
- package/src/platform/crypto/index.native.ts +68 -0
- package/src/platform/crypto/index.ts +31 -0
- package/src/platform/crypto/types.ts +64 -0
- package/src/platform/crypto/web.ts +69 -0
- package/src/platform/extras.ts +15 -0
- package/src/platform/index.native.ts +4 -0
- package/src/platform/index.ts +4 -0
- package/src/platform/specs/OneCrypto.nitro.ts +19 -0
- package/src/platform/specs/OneNativeCameraNativeComponent.ts +35 -2
- package/src/router/router.ts +7 -4
- package/types/index.d.ts +2 -1
- package/types/index.d.ts.map +1 -1
- package/types/one.d.ts +2 -1
- package/types/one.d.ts.map +1 -1
- package/types/platform/camera/index.d.ts +3 -3
- package/types/platform/camera/index.d.ts.map +1 -1
- package/types/platform/camera/index.native.d.ts +3 -3
- package/types/platform/camera/index.native.d.ts.map +1 -1
- package/types/platform/camera/types.d.ts +18 -0
- package/types/platform/camera/types.d.ts.map +1 -1
- package/types/platform/crypto/aes.d.ts +211 -0
- package/types/platform/crypto/aes.d.ts.map +1 -0
- package/types/platform/crypto/bytes.d.ts +8 -0
- package/types/platform/crypto/bytes.d.ts.map +1 -0
- package/types/platform/crypto/digest-api.d.ts +9 -0
- package/types/platform/crypto/digest-api.d.ts.map +1 -0
- package/types/platform/crypto/digest.d.ts +5 -0
- package/types/platform/crypto/digest.d.ts.map +1 -1
- package/types/platform/crypto/index.d.ts +127 -0
- package/types/platform/crypto/index.d.ts.map +1 -1
- package/types/platform/crypto/index.native.d.ts +127 -0
- package/types/platform/crypto/index.native.d.ts.map +1 -1
- package/types/platform/crypto/types.d.ts +43 -0
- package/types/platform/crypto/types.d.ts.map +1 -0
- package/types/platform/crypto/web.d.ts +5 -0
- package/types/platform/crypto/web.d.ts.map +1 -0
- package/types/platform/extras.d.ts +2 -0
- package/types/platform/extras.d.ts.map +1 -1
- package/types/platform/index.d.ts +1 -1
- package/types/platform/index.d.ts.map +1 -1
- package/types/platform/index.native.d.ts +1 -1
- package/types/platform/index.native.d.ts.map +1 -1
- package/types/platform/specs/OneCrypto.nitro.d.ts +2 -0
- package/types/platform/specs/OneCrypto.nitro.d.ts.map +1 -1
- package/types/platform/specs/OneNativeCameraNativeComponent.d.ts +18 -2
- package/types/platform/specs/OneNativeCameraNativeComponent.d.ts.map +1 -1
- package/types/router/router.d.ts.map +1 -1
|
@@ -48,6 +48,29 @@ class OneNativeCameraManager :
|
|
|
48
48
|
view.setPendingCodeTypes(types)
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
@ReactProp(name = "flash")
|
|
52
|
+
override fun setFlash(view: OneNativeCameraView, value: String?) {
|
|
53
|
+
view.setPendingFlash(value ?: "off")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@ReactProp(name = "enableTorch", defaultBoolean = false)
|
|
57
|
+
override fun setEnableTorch(view: OneNativeCameraView, value: Boolean) {
|
|
58
|
+
view.setPendingTorch(value)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@ReactProp(name = "zoom", defaultDouble = 0.0)
|
|
62
|
+
override fun setZoom(view: OneNativeCameraView, value: Double) {
|
|
63
|
+
view.setPendingZoom(value)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun takePicture(view: OneNativeCameraView, requestId: Int, quality: Double, base64: Boolean) {
|
|
67
|
+
view.takePicture(requestId, quality, base64)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
override fun receiveCommand(view: OneNativeCameraView, commandId: String, args: ReadableArray?) {
|
|
71
|
+
delegate.receiveCommand(view, commandId, args)
|
|
72
|
+
}
|
|
73
|
+
|
|
51
74
|
override fun onAfterUpdateTransaction(view: OneNativeCameraView) {
|
|
52
75
|
super.onAfterUpdateTransaction(view)
|
|
53
76
|
view.applyPending()
|
|
@@ -63,6 +86,7 @@ class OneNativeCameraManager :
|
|
|
63
86
|
(super.getExportedCustomDirectEventTypeConstants()?.toMutableMap() ?: mutableMapOf()).apply {
|
|
64
87
|
put("topNativeCameraState", mapOf("registrationName" to "onNativeCameraState"))
|
|
65
88
|
put("topNativeCameraCode", mapOf("registrationName" to "onNativeCameraCode"))
|
|
89
|
+
put("topNativeCameraPicture", mapOf("registrationName" to "onNativeCameraPicture"))
|
|
66
90
|
}
|
|
67
91
|
|
|
68
92
|
companion object {
|
|
@@ -2,10 +2,20 @@ package dev.onejs.onenative
|
|
|
2
2
|
|
|
3
3
|
import android.Manifest
|
|
4
4
|
import android.content.pm.PackageManager
|
|
5
|
+
import android.graphics.Bitmap
|
|
6
|
+
import android.graphics.BitmapFactory
|
|
7
|
+
import android.graphics.Matrix
|
|
8
|
+
import android.util.Base64
|
|
5
9
|
import android.util.Size
|
|
10
|
+
import android.view.OrientationEventListener
|
|
11
|
+
import android.view.Surface
|
|
12
|
+
import androidx.camera.core.Camera
|
|
6
13
|
import androidx.camera.core.CameraSelector
|
|
7
14
|
import androidx.camera.core.ExperimentalGetImage
|
|
8
15
|
import androidx.camera.core.ImageAnalysis
|
|
16
|
+
import androidx.camera.core.ImageCapture
|
|
17
|
+
import androidx.camera.core.ImageCaptureException
|
|
18
|
+
import androidx.camera.core.ImageProxy
|
|
9
19
|
import androidx.camera.core.Preview
|
|
10
20
|
import androidx.camera.lifecycle.ProcessCameraProvider
|
|
11
21
|
import androidx.camera.view.PreviewView
|
|
@@ -19,6 +29,9 @@ import com.google.mlkit.vision.barcode.BarcodeScannerOptions
|
|
|
19
29
|
import com.google.mlkit.vision.barcode.BarcodeScanning
|
|
20
30
|
import com.google.mlkit.vision.barcode.common.Barcode
|
|
21
31
|
import com.google.mlkit.vision.common.InputImage
|
|
32
|
+
import java.io.ByteArrayOutputStream
|
|
33
|
+
import java.io.File
|
|
34
|
+
import java.util.UUID
|
|
22
35
|
import java.util.concurrent.Executors
|
|
23
36
|
|
|
24
37
|
// Embedded camera preview with barcode events, the Android half of
|
|
@@ -41,10 +54,31 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
41
54
|
private var active = false
|
|
42
55
|
private var facing = "back"
|
|
43
56
|
private var codeTypes: List<String> = emptyList()
|
|
57
|
+
private var flash = "off"
|
|
58
|
+
private var torch = false
|
|
59
|
+
private var zoom = 0.0
|
|
44
60
|
private var generation = 0
|
|
45
61
|
private var lastState = ""
|
|
46
62
|
private var lastCode: String? = null
|
|
47
63
|
private var provider: ProcessCameraProvider? = null
|
|
64
|
+
private var camera: Camera? = null
|
|
65
|
+
private var imageCapture: ImageCapture? = null
|
|
66
|
+
private var captureRotation = Surface.ROTATION_0
|
|
67
|
+
|
|
68
|
+
// captures follow the device's physical orientation, as CameraX documents
|
|
69
|
+
// for activities that handle configuration changes or lock orientation.
|
|
70
|
+
private val orientationListener = object : OrientationEventListener(reactContext) {
|
|
71
|
+
override fun onOrientationChanged(orientation: Int) {
|
|
72
|
+
if (orientation == ORIENTATION_UNKNOWN) return
|
|
73
|
+
captureRotation = when (orientation) {
|
|
74
|
+
in 45 until 135 -> Surface.ROTATION_270
|
|
75
|
+
in 135 until 225 -> Surface.ROTATION_180
|
|
76
|
+
in 225 until 315 -> Surface.ROTATION_90
|
|
77
|
+
else -> Surface.ROTATION_0
|
|
78
|
+
}
|
|
79
|
+
imageCapture?.targetRotation = captureRotation
|
|
80
|
+
}
|
|
81
|
+
}
|
|
48
82
|
|
|
49
83
|
init {
|
|
50
84
|
addView(previewView)
|
|
@@ -59,11 +93,33 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
59
93
|
refresh()
|
|
60
94
|
}
|
|
61
95
|
|
|
96
|
+
// flash, torch and zoom change the bound camera without rebinding.
|
|
97
|
+
fun configureCapture(flash: String, torch: Boolean, zoom: Double) {
|
|
98
|
+
this.flash = flash
|
|
99
|
+
this.torch = torch
|
|
100
|
+
this.zoom = zoom
|
|
101
|
+
applyCaptureSettings()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private fun applyCaptureSettings() {
|
|
105
|
+
imageCapture?.flashMode = when (flash) {
|
|
106
|
+
"on" -> ImageCapture.FLASH_MODE_ON
|
|
107
|
+
"auto" -> ImageCapture.FLASH_MODE_AUTO
|
|
108
|
+
else -> ImageCapture.FLASH_MODE_OFF
|
|
109
|
+
}
|
|
110
|
+
val bound = camera ?: return
|
|
111
|
+
if (bound.cameraInfo.hasFlashUnit()) bound.cameraControl.enableTorch(torch)
|
|
112
|
+
bound.cameraControl.setLinearZoom(zoom.toFloat())
|
|
113
|
+
}
|
|
114
|
+
|
|
62
115
|
// Fabric sets each prop separately; batch them so one update transaction
|
|
63
116
|
// rebinds capture at most once.
|
|
64
117
|
private var pendingActive = false
|
|
65
118
|
private var pendingFacing = "back"
|
|
66
119
|
private var pendingCodeTypes: List<String> = emptyList()
|
|
120
|
+
private var pendingFlash = "off"
|
|
121
|
+
private var pendingTorch = false
|
|
122
|
+
private var pendingZoom = 0.0
|
|
67
123
|
|
|
68
124
|
fun setPendingActive(value: Boolean) {
|
|
69
125
|
pendingActive = value
|
|
@@ -77,7 +133,20 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
77
133
|
pendingCodeTypes = value
|
|
78
134
|
}
|
|
79
135
|
|
|
136
|
+
fun setPendingFlash(value: String) {
|
|
137
|
+
pendingFlash = value
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
fun setPendingTorch(value: Boolean) {
|
|
141
|
+
pendingTorch = value
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fun setPendingZoom(value: Double) {
|
|
145
|
+
pendingZoom = value
|
|
146
|
+
}
|
|
147
|
+
|
|
80
148
|
fun applyPending() {
|
|
149
|
+
configureCapture(pendingFlash, pendingTorch, pendingZoom)
|
|
81
150
|
configure(pendingActive, pendingFacing, pendingCodeTypes)
|
|
82
151
|
}
|
|
83
152
|
|
|
@@ -85,16 +154,109 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
85
154
|
active = false
|
|
86
155
|
facing = "back"
|
|
87
156
|
codeTypes = emptyList()
|
|
157
|
+
flash = "off"
|
|
158
|
+
torch = false
|
|
159
|
+
zoom = 0.0
|
|
88
160
|
lastCode = null
|
|
89
161
|
refresh()
|
|
90
162
|
}
|
|
91
163
|
|
|
164
|
+
fun takePicture(requestId: Int, quality: Double, base64: Boolean) {
|
|
165
|
+
val capture = imageCapture
|
|
166
|
+
if (capture == null || lastState != "ready" && lastState != "unsupported") {
|
|
167
|
+
val state = lastState.ifEmpty { "waiting" }
|
|
168
|
+
emitPictureError(requestId, "E_CAMERA_NOT_READY", "CameraView is not ready to take a picture (state: $state)")
|
|
169
|
+
return
|
|
170
|
+
}
|
|
171
|
+
val current = generation
|
|
172
|
+
capture.takePicture(
|
|
173
|
+
sharedCaptureExecutor,
|
|
174
|
+
object : ImageCapture.OnImageCapturedCallback() {
|
|
175
|
+
override fun onCaptureSuccess(image: ImageProxy) {
|
|
176
|
+
val result = try {
|
|
177
|
+
savePicture(image, quality, base64)
|
|
178
|
+
} catch (e: Exception) {
|
|
179
|
+
null
|
|
180
|
+
} finally {
|
|
181
|
+
image.close()
|
|
182
|
+
}
|
|
183
|
+
post {
|
|
184
|
+
when {
|
|
185
|
+
generation != current ->
|
|
186
|
+
emitPictureError(requestId, "E_CAMERA_INACTIVE", "CameraView stopped before the picture was taken")
|
|
187
|
+
result == null ->
|
|
188
|
+
emitPictureError(requestId, "E_CAMERA_CAPTURE", "The camera returned no image data")
|
|
189
|
+
else -> dispatchPicture(requestId, result, "")
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
override fun onError(exception: ImageCaptureException) {
|
|
195
|
+
post {
|
|
196
|
+
if (generation != current) {
|
|
197
|
+
emitPictureError(requestId, "E_CAMERA_INACTIVE", "CameraView stopped before the picture was taken")
|
|
198
|
+
} else {
|
|
199
|
+
emitPictureError(requestId, "E_CAMERA_CAPTURE", exception.message ?: "The capture failed")
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private class SavedPicture(val uri: String, val width: Int, val height: Int, val base64: String)
|
|
208
|
+
|
|
209
|
+
// decodes the captured jpeg, turns it upright and re-encodes it at the
|
|
210
|
+
// requested quality into cache/Camera, as Expo's camera does.
|
|
211
|
+
private fun savePicture(image: ImageProxy, quality: Double, base64: Boolean): SavedPicture? {
|
|
212
|
+
val buffer = image.planes.firstOrNull()?.buffer ?: return null
|
|
213
|
+
val bytes = ByteArray(buffer.remaining())
|
|
214
|
+
buffer.get(bytes)
|
|
215
|
+
val decoded = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return null
|
|
216
|
+
val rotation = image.imageInfo.rotationDegrees
|
|
217
|
+
val upright = if (rotation == 0) {
|
|
218
|
+
decoded
|
|
219
|
+
} else {
|
|
220
|
+
Bitmap.createBitmap(
|
|
221
|
+
decoded, 0, 0, decoded.width, decoded.height,
|
|
222
|
+
Matrix().apply { postRotate(rotation.toFloat()) }, true,
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
val encoded = ByteArrayOutputStream().use { stream ->
|
|
226
|
+
upright.compress(Bitmap.CompressFormat.JPEG, (quality * 100).toInt(), stream)
|
|
227
|
+
stream.toByteArray()
|
|
228
|
+
}
|
|
229
|
+
val directory = File(reactContext.cacheDir, "Camera").apply { mkdirs() }
|
|
230
|
+
val file = File(directory, "${UUID.randomUUID()}.jpg")
|
|
231
|
+
file.writeBytes(encoded)
|
|
232
|
+
return SavedPicture(
|
|
233
|
+
uri = android.net.Uri.fromFile(file).toString(),
|
|
234
|
+
width = upright.width,
|
|
235
|
+
height = upright.height,
|
|
236
|
+
base64 = if (base64) Base64.encodeToString(encoded, Base64.NO_WRAP) else "",
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
private fun emitPictureError(requestId: Int, code: String, message: String) {
|
|
241
|
+
dispatchPicture(requestId, null, "$code: $message")
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private fun dispatchPicture(requestId: Int, picture: SavedPicture?, error: String) {
|
|
245
|
+
if (id == NO_ID) return
|
|
246
|
+
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) ?: return
|
|
247
|
+
dispatcher.dispatchEvent(
|
|
248
|
+
OneNativeCameraPictureEvent(UIManagerHelper.getSurfaceId(this), id, requestId, picture?.uri ?: "",
|
|
249
|
+
picture?.width ?: 0, picture?.height ?: 0, picture?.base64 ?: "", error)
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
|
|
92
253
|
fun replayState() {
|
|
93
254
|
if (lastState.isNotEmpty()) dispatchState(lastState)
|
|
94
255
|
}
|
|
95
256
|
|
|
96
257
|
override fun onAttachedToWindow() {
|
|
97
258
|
super.onAttachedToWindow()
|
|
259
|
+
orientationListener.enable()
|
|
98
260
|
refresh()
|
|
99
261
|
}
|
|
100
262
|
|
|
@@ -104,6 +266,7 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
104
266
|
// the previous one again.
|
|
105
267
|
lastCode = null
|
|
106
268
|
releaseSession()
|
|
269
|
+
orientationListener.disable()
|
|
107
270
|
super.onDetachedFromWindow()
|
|
108
271
|
}
|
|
109
272
|
|
|
@@ -135,6 +298,8 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
135
298
|
// unbinding a torn-down provider is a no-op for state purposes.
|
|
136
299
|
}
|
|
137
300
|
provider = null
|
|
301
|
+
camera = null
|
|
302
|
+
imageCapture = null
|
|
138
303
|
}
|
|
139
304
|
|
|
140
305
|
private fun refresh() {
|
|
@@ -193,6 +358,10 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
193
358
|
try {
|
|
194
359
|
val preview = Preview.Builder().build()
|
|
195
360
|
preview.setSurfaceProvider(previewView.surfaceProvider)
|
|
361
|
+
val capture = ImageCapture.Builder()
|
|
362
|
+
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
|
|
363
|
+
.setTargetRotation(captureRotation)
|
|
364
|
+
.build()
|
|
196
365
|
cameraProvider.unbindAll()
|
|
197
366
|
if (!unsupported && formats.isNotEmpty()) {
|
|
198
367
|
val options = BarcodeScannerOptions.Builder()
|
|
@@ -204,11 +373,13 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
204
373
|
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
|
|
205
374
|
.build()
|
|
206
375
|
analysis.setAnalyzer(sharedAnalyzerExecutor, createAnalyzer(scanner, current))
|
|
207
|
-
cameraProvider.bindToLifecycle(owner, selector, preview, analysis)
|
|
376
|
+
camera = cameraProvider.bindToLifecycle(owner, selector, preview, capture, analysis)
|
|
208
377
|
} else {
|
|
209
|
-
cameraProvider.bindToLifecycle(owner, selector, preview)
|
|
378
|
+
camera = cameraProvider.bindToLifecycle(owner, selector, preview, capture)
|
|
210
379
|
}
|
|
211
380
|
provider = cameraProvider
|
|
381
|
+
imageCapture = capture
|
|
382
|
+
applyCaptureSettings()
|
|
212
383
|
emitState(if (unsupported) "unsupported" else "ready")
|
|
213
384
|
} catch (e: Exception) {
|
|
214
385
|
try {
|
|
@@ -250,6 +421,7 @@ class OneNativeCameraView(private val reactContext: ThemedReactContext) :
|
|
|
250
421
|
|
|
251
422
|
companion object {
|
|
252
423
|
private val sharedAnalyzerExecutor = Executors.newSingleThreadExecutor()
|
|
424
|
+
private val sharedCaptureExecutor = Executors.newSingleThreadExecutor()
|
|
253
425
|
|
|
254
426
|
private val FORMAT_BY_NAME: Map<String, Int> = mapOf(
|
|
255
427
|
"qr" to Barcode.FORMAT_QR_CODE,
|
|
@@ -292,3 +464,26 @@ private class OneNativeCameraCodeEvent(
|
|
|
292
464
|
putString("data", data)
|
|
293
465
|
}
|
|
294
466
|
}
|
|
467
|
+
|
|
468
|
+
private class OneNativeCameraPictureEvent(
|
|
469
|
+
surfaceId: Int,
|
|
470
|
+
viewTag: Int,
|
|
471
|
+
private val requestId: Int,
|
|
472
|
+
private val uri: String,
|
|
473
|
+
private val width: Int,
|
|
474
|
+
private val height: Int,
|
|
475
|
+
private val base64: String,
|
|
476
|
+
private val error: String,
|
|
477
|
+
) : Event<OneNativeCameraPictureEvent>(surfaceId, viewTag) {
|
|
478
|
+
override fun getEventName(): String = "topNativeCameraPicture"
|
|
479
|
+
override fun canCoalesce(): Boolean = false
|
|
480
|
+
override fun getEventData() =
|
|
481
|
+
Arguments.createMap().apply {
|
|
482
|
+
putInt("requestId", requestId)
|
|
483
|
+
putString("uri", uri)
|
|
484
|
+
putInt("width", width)
|
|
485
|
+
putInt("height", height)
|
|
486
|
+
putString("base64", base64)
|
|
487
|
+
putString("error", error)
|
|
488
|
+
}
|
|
489
|
+
}
|