@succinctlabs/react-native-zcam1 0.2.7 → 0.4.0-alpha.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 (127) hide show
  1. package/Zcam1Sdk.podspec +2 -2
  2. package/android/CMakeLists.txt +114 -0
  3. package/android/build.gradle +213 -0
  4. package/android/cpp-adapter-proving.cpp +35 -0
  5. package/android/cpp-adapter.cpp +35 -0
  6. package/android/src/main/AndroidManifest.xml +5 -0
  7. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1CaptureModule.kt +156 -0
  8. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1CapturePackage.kt +38 -0
  9. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1ProvingModule.kt +43 -0
  10. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1ProvingPackage.kt +34 -0
  11. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1SdkModule.kt +43 -0
  12. package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1SdkPackage.kt +34 -0
  13. package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/CameraUtils.kt +80 -0
  14. package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraService.kt +588 -0
  15. package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraView.kt +107 -0
  16. package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraViewManager.kt +33 -0
  17. package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1OrientationManager.kt +73 -0
  18. package/cpp/generated/zcam1_c2pa_utils.cpp +170 -365
  19. package/cpp/generated/zcam1_c2pa_utils.hpp +0 -4
  20. package/cpp/generated/zcam1_certs_utils.cpp +121 -250
  21. package/cpp/generated/zcam1_common.cpp +1871 -0
  22. package/cpp/generated/zcam1_common.hpp +52 -0
  23. package/cpp/generated/zcam1_verify_utils.cpp +138 -265
  24. package/cpp/generated/zcam1_verify_utils.hpp +2 -2
  25. package/cpp/proving/generated/zcam1_common.cpp +1871 -0
  26. package/cpp/proving/generated/zcam1_common.hpp +52 -0
  27. package/cpp/proving/generated/zcam1_proving_utils.cpp +355 -417
  28. package/cpp/proving/generated/zcam1_proving_utils.hpp +13 -17
  29. package/cpp/proving/zcam1-proving.cpp +2 -0
  30. package/cpp/zcam1-sdk.cpp +2 -0
  31. package/lib/module/bindings.js +4 -0
  32. package/lib/module/bindings.js.map +1 -1
  33. package/lib/module/camera.js +71 -13
  34. package/lib/module/camera.js.map +1 -1
  35. package/lib/module/capture.js +115 -38
  36. package/lib/module/capture.js.map +1 -1
  37. package/lib/module/common.js +18 -2
  38. package/lib/module/common.js.map +1 -1
  39. package/lib/module/generated/zcam1_c2pa_utils-ffi.js +4 -0
  40. package/lib/module/generated/zcam1_c2pa_utils-ffi.js.map +1 -1
  41. package/lib/module/generated/zcam1_c2pa_utils.js +117 -9
  42. package/lib/module/generated/zcam1_c2pa_utils.js.map +1 -1
  43. package/lib/module/generated/zcam1_certs_utils-ffi.js +4 -0
  44. package/lib/module/generated/zcam1_certs_utils-ffi.js.map +1 -1
  45. package/lib/module/generated/zcam1_certs_utils.js +6 -2
  46. package/lib/module/generated/zcam1_certs_utils.js.map +1 -1
  47. package/lib/module/generated/zcam1_common-ffi.js +47 -0
  48. package/lib/module/generated/zcam1_common-ffi.js.map +1 -0
  49. package/lib/module/generated/zcam1_common.js +60 -0
  50. package/lib/module/generated/zcam1_common.js.map +1 -0
  51. package/lib/module/generated/zcam1_proving_utils-ffi.js +4 -0
  52. package/lib/module/generated/zcam1_proving_utils-ffi.js.map +1 -1
  53. package/lib/module/generated/zcam1_proving_utils.js +53 -46
  54. package/lib/module/generated/zcam1_proving_utils.js.map +1 -1
  55. package/lib/module/generated/zcam1_verify_utils-ffi.js +4 -0
  56. package/lib/module/generated/zcam1_verify_utils-ffi.js.map +1 -1
  57. package/lib/module/generated/zcam1_verify_utils.js +70 -22
  58. package/lib/module/generated/zcam1_verify_utils.js.map +1 -1
  59. package/lib/module/index.js +1 -1
  60. package/lib/module/index.js.map +1 -1
  61. package/lib/module/proving/NativeZcam1Proving.js +1 -1
  62. package/lib/module/proving/index.js +1 -1
  63. package/lib/module/proving/index.js.map +1 -1
  64. package/lib/module/proving/prove.js +14 -8
  65. package/lib/module/proving/prove.js.map +1 -1
  66. package/lib/module/utils.js +19 -14
  67. package/lib/module/utils.js.map +1 -1
  68. package/lib/module/verify.js +14 -22
  69. package/lib/module/verify.js.map +1 -1
  70. package/lib/typescript/src/bindings.d.ts +3 -0
  71. package/lib/typescript/src/bindings.d.ts.map +1 -1
  72. package/lib/typescript/src/camera.d.ts +15 -0
  73. package/lib/typescript/src/camera.d.ts.map +1 -1
  74. package/lib/typescript/src/capture.d.ts +40 -1
  75. package/lib/typescript/src/capture.d.ts.map +1 -1
  76. package/lib/typescript/src/common.d.ts.map +1 -1
  77. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts +37 -46
  78. package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts.map +1 -1
  79. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts +110 -8
  80. package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts.map +1 -1
  81. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts +27 -32
  82. package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts.map +1 -1
  83. package/lib/typescript/src/generated/zcam1_certs_utils.d.ts.map +1 -1
  84. package/lib/typescript/src/generated/zcam1_common-ffi.d.ts +77 -0
  85. package/lib/typescript/src/generated/zcam1_common-ffi.d.ts.map +1 -0
  86. package/lib/typescript/src/generated/zcam1_common.d.ts +17 -0
  87. package/lib/typescript/src/generated/zcam1_common.d.ts.map +1 -0
  88. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts +44 -51
  89. package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts.map +1 -1
  90. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts +26 -26
  91. package/lib/typescript/src/generated/zcam1_proving_utils.d.ts.map +1 -1
  92. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts +29 -34
  93. package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts.map +1 -1
  94. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts +94 -14
  95. package/lib/typescript/src/generated/zcam1_verify_utils.d.ts.map +1 -1
  96. package/lib/typescript/src/index.d.ts +1 -1
  97. package/lib/typescript/src/index.d.ts.map +1 -1
  98. package/lib/typescript/src/proving/NativeZcam1Proving.d.ts +1 -1
  99. package/lib/typescript/src/proving/index.d.ts +1 -1
  100. package/lib/typescript/src/proving/index.d.ts.map +1 -1
  101. package/lib/typescript/src/proving/prove.d.ts +3 -3
  102. package/lib/typescript/src/proving/prove.d.ts.map +1 -1
  103. package/lib/typescript/src/utils.d.ts.map +1 -1
  104. package/lib/typescript/src/verify.d.ts +4 -3
  105. package/lib/typescript/src/verify.d.ts.map +1 -1
  106. package/package.json +13 -6
  107. package/react-native.config.js +11 -0
  108. package/src/bindings.tsx +4 -0
  109. package/src/camera.tsx +116 -11
  110. package/src/capture.tsx +150 -53
  111. package/src/common.tsx +22 -2
  112. package/src/generated/zcam1_c2pa_utils-ffi.ts +42 -56
  113. package/src/generated/zcam1_c2pa_utils.ts +224 -67
  114. package/src/generated/zcam1_certs_utils-ffi.ts +33 -36
  115. package/src/generated/zcam1_certs_utils.ts +27 -24
  116. package/src/generated/zcam1_common-ffi.ts +183 -0
  117. package/src/generated/zcam1_common.ts +116 -0
  118. package/src/generated/zcam1_proving_utils-ffi.ts +54 -67
  119. package/src/generated/zcam1_proving_utils.ts +133 -138
  120. package/src/generated/zcam1_verify_utils-ffi.ts +39 -40
  121. package/src/generated/zcam1_verify_utils.ts +109 -47
  122. package/src/index.ts +1 -1
  123. package/src/proving/NativeZcam1Proving.ts +2 -2
  124. package/src/proving/index.ts +1 -1
  125. package/src/proving/prove.tsx +22 -11
  126. package/src/utils.ts +26 -20
  127. package/src/verify.tsx +25 -42
package/Zcam1Sdk.podspec CHANGED
@@ -12,7 +12,7 @@ Pod::Spec.new do |s|
12
12
  s.authors = package["author"]
13
13
 
14
14
  s.platforms = { :ios => min_ios_version_supported }
15
- s.source = { :git => "https://github.com/succinctlabs/zcam1-sdk.git", :tag => "#{s.version}" }
15
+ s.source = { :git => "https://github.com/succinctlabs/zcam1-sdk.git", :tag => "react-native-zcam1-v#{s.version}" }
16
16
 
17
17
  # Proving is opt-in.
18
18
  #
@@ -69,7 +69,7 @@ Pod::Spec.new do |s|
69
69
  end
70
70
 
71
71
  version = package["version"]
72
- base_url = "https://github.com/succinctlabs/zcam1-sdk/releases/download/v#{version}"
72
+ base_url = "https://github.com/succinctlabs/zcam1-sdk/releases/download/react-native-zcam1-v#{version}"
73
73
 
74
74
  # Proving framework download command, only included when proving is enabled.
75
75
  # Injected as a shell snippet into prepare_command via Ruby interpolation.
@@ -0,0 +1,114 @@
1
+
2
+ # Generated by uniffi-bindgen-react-native
3
+ cmake_minimum_required(VERSION 3.9.0)
4
+ project(Zcam1Sdk)
5
+
6
+ set (CMAKE_VERBOSE_MAKEFILE ON)
7
+ set (CMAKE_CXX_STANDARD 17)
8
+
9
+ # Resolve the path to the uniffi-bindgen-react-native package
10
+ execute_process(
11
+ COMMAND node -p "require.resolve('uniffi-bindgen-react-native/package.json')"
12
+ OUTPUT_VARIABLE UNIFFI_BINDGEN_PATH
13
+ OUTPUT_STRIP_TRAILING_WHITESPACE
14
+ )
15
+ # Get the directory; get_filename_component and cmake_path will normalize
16
+ # paths with Windows path separators.
17
+ get_filename_component(UNIFFI_BINDGEN_PATH "${UNIFFI_BINDGEN_PATH}" DIRECTORY)
18
+
19
+ # Specifies a path to native header files.
20
+ include_directories(
21
+ ../cpp
22
+ ../cpp/generated
23
+ ../cpp/proving
24
+ ../cpp/proving/generated
25
+
26
+ ${UNIFFI_BINDGEN_PATH}/cpp/includes
27
+ )
28
+
29
+ add_library(zcam1-sdk SHARED
30
+ ../cpp/zcam1-sdk.cpp
31
+ ../cpp/generated/zcam1_c2pa_utils.cpp
32
+ ../cpp/generated/zcam1_certs_utils.cpp
33
+ ../cpp/generated/zcam1_common.cpp
34
+ ../cpp/generated/zcam1_verify_utils.cpp
35
+ cpp-adapter.cpp
36
+ )
37
+
38
+ add_library(zcam1-proving SHARED
39
+ ../cpp/proving/zcam1-proving.cpp
40
+ ../cpp/proving/generated/zcam1_common.cpp
41
+ ../cpp/proving/generated/zcam1_proving_utils.cpp
42
+ cpp-adapter-proving.cpp
43
+ )
44
+
45
+ # Set C++ compiler flags
46
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
47
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
48
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
49
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all")
50
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
51
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
52
+
53
+ # Set linker flags for 16KB page size alignment (required for Android 15+)
54
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
55
+
56
+ cmake_path(
57
+ SET MY_RUST_LIB
58
+ ${CMAKE_SOURCE_DIR}/../Zcam1Jni/${ANDROID_ABI}/libzcam1_bindings.a
59
+
60
+ NORMALIZE
61
+ )
62
+ add_library(my_rust_lib STATIC IMPORTED)
63
+ set_target_properties(my_rust_lib PROPERTIES IMPORTED_LOCATION ${MY_RUST_LIB})
64
+
65
+ cmake_path(
66
+ SET MY_RUST_PROVING_LIB
67
+ ${CMAKE_SOURCE_DIR}/../Zcam1ProvingJni/${ANDROID_ABI}/libzcam1_proving_bindings.a
68
+
69
+ NORMALIZE
70
+ )
71
+ add_library(my_rust_proving_lib STATIC IMPORTED)
72
+ set_target_properties(my_rust_proving_lib PROPERTIES IMPORTED_LOCATION ${MY_RUST_PROVING_LIB})
73
+
74
+ # Add ReactAndroid libraries, being careful to account for different versions.
75
+ find_package(ReactAndroid REQUIRED CONFIG)
76
+ find_library(LOGCAT log)
77
+
78
+ # REACTNATIVE_MERGED_SO seems to be only be set in a build.gradle.kt file,
79
+ # which we don't use. Thus falling back to version number sniffing.
80
+ if (ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
81
+ set(REACTNATIVE_MERGED_SO true)
82
+ endif()
83
+
84
+ # https://github.com/react-native-community/discussions-and-proposals/discussions/816
85
+ # This if-then-else can be removed once this library does not support version below 0.76
86
+ if (REACTNATIVE_MERGED_SO)
87
+ target_link_libraries(zcam1-sdk ReactAndroid::reactnative)
88
+ target_link_libraries(zcam1-proving ReactAndroid::reactnative)
89
+ else()
90
+ target_link_libraries(zcam1-sdk
91
+ ReactAndroid::turbomodulejsijni
92
+ ReactAndroid::react_nativemodule_core
93
+ )
94
+ target_link_libraries(zcam1-proving
95
+ ReactAndroid::turbomodulejsijni
96
+ ReactAndroid::react_nativemodule_core
97
+ )
98
+ endif()
99
+
100
+ find_package(fbjni REQUIRED CONFIG)
101
+ target_link_libraries(
102
+ zcam1-sdk
103
+ fbjni::fbjni
104
+ ReactAndroid::jsi
105
+ ${LOGCAT}
106
+ my_rust_lib
107
+ )
108
+ target_link_libraries(
109
+ zcam1-proving
110
+ fbjni::fbjni
111
+ ReactAndroid::jsi
112
+ ${LOGCAT}
113
+ my_rust_proving_lib
114
+ )
@@ -0,0 +1,213 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+
3
+ buildscript {
4
+ // Buildscript is evaluated before everything else so we can't use getExtOrDefault
5
+ def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["DummyLibForAndroid_kotlinVersion"]
6
+
7
+ repositories {
8
+ google()
9
+ mavenCentral()
10
+ }
11
+
12
+ dependencies {
13
+ classpath "com.android.tools.build:gradle:7.2.1"
14
+ // noinspection DifferentKotlinGradleVersion
15
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
16
+ }
17
+ }
18
+
19
+ def getPackageVersion() {
20
+ def packageJson = new groovy.json.JsonSlurper().parseText(
21
+ file("../package.json").text
22
+ )
23
+ return packageJson.version
24
+ }
25
+
26
+ task downloadJniLibs {
27
+ def version = getPackageVersion()
28
+ def baseUrl = "https://github.com/succinctlabs/zcam1-sdk/releases/download/react-native-zcam1-v${version}"
29
+ def jniLibsDir = file("../Zcam1Jni")
30
+ def jniLibsProvingDir = file("../Zcam1ProvingJni")
31
+ def markerFile = file(".jnilibs-version")
32
+
33
+ doFirst {
34
+ // Logic mirrors the iOS podspec prepare_command:
35
+ // - dir absent → download from GitHub release artifacts
36
+ // - dir present, marker absent → Yalc/local dev (package includes JNI libs), skip
37
+ // - dir present, marker present, version differs → re-download (public npm upgrade)
38
+ // - dir present, marker present, version matches → already up to date, skip
39
+ [jniLibs: jniLibsDir, jniLibsProving: jniLibsProvingDir].each { name, dir ->
40
+ def zipName = "${name}.zip"
41
+ def zipUrl = "${baseUrl}/${zipName}"
42
+
43
+ if (!dir.exists()) {
44
+ println "Downloading ${name} v${version}..."
45
+ exec {
46
+ commandLine "curl", "-fL", zipUrl, "-o", zipName
47
+ workingDir "src/main"
48
+ }
49
+ exec {
50
+ commandLine "unzip", "-q", zipName
51
+ workingDir "src/main"
52
+ }
53
+ new File("${projectDir}/src/main/${zipName}").delete()
54
+ markerFile.text = version
55
+ } else if (markerFile.exists() && markerFile.text.trim() != version) {
56
+ println "Updating ${name} to v${version}..."
57
+ dir.deleteDir()
58
+ exec {
59
+ commandLine "curl", "-fL", zipUrl, "-o", zipName
60
+ workingDir "src/main"
61
+ }
62
+ exec {
63
+ commandLine "unzip", "-q", zipName
64
+ workingDir "src/main"
65
+ }
66
+ new File("${projectDir}/src/main/${zipName}").delete()
67
+ markerFile.text = version
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ afterEvaluate {
74
+ preBuild.dependsOn downloadJniLibs
75
+ }
76
+
77
+ def reactNativeArchitectures() {
78
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
79
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
80
+ }
81
+
82
+ def isNewArchitectureEnabled() {
83
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
84
+ }
85
+
86
+ apply plugin: "com.android.library"
87
+ apply plugin: "kotlin-android"
88
+
89
+ if (isNewArchitectureEnabled()) {
90
+ apply plugin: "com.facebook.react"
91
+ }
92
+
93
+ def getExtOrDefault(name) {
94
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["Zcam1Sdk_" + name]
95
+ }
96
+
97
+ def getExtOrIntegerDefault(name) {
98
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["Zcam1Sdk_" + name]).toInteger()
99
+ }
100
+
101
+ def supportsNamespace() {
102
+ def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
103
+ def major = parsed[0].toInteger()
104
+ def minor = parsed[1].toInteger()
105
+
106
+ // Namespace support was added in 7.3.0
107
+ return (major == 7 && minor >= 3) || major >= 8
108
+ }
109
+
110
+ android {
111
+ if (supportsNamespace()) {
112
+ namespace "com.succinctlabs.zcam1sdk"
113
+
114
+ sourceSets {
115
+ main {
116
+ manifest.srcFile "src/main/AndroidManifestNew.xml"
117
+ }
118
+ }
119
+ }
120
+
121
+ ndkVersion getExtOrDefault("ndkVersion")
122
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
123
+
124
+ defaultConfig {
125
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
126
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
127
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
128
+ consumerProguardFiles 'proguard-rules.pro'
129
+
130
+ buildFeatures {
131
+ prefab true
132
+ }
133
+ externalNativeBuild {
134
+ cmake {
135
+ arguments '-DANDROID_STL=c++_shared'
136
+ abiFilters (*reactNativeArchitectures())
137
+ }
138
+ }
139
+ ndk {
140
+ abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
141
+ }
142
+ }
143
+
144
+ externalNativeBuild {
145
+ cmake {
146
+ path "CMakeLists.txt"
147
+ }
148
+ }
149
+
150
+ buildFeatures {
151
+ buildConfig true
152
+ }
153
+
154
+ buildTypes {
155
+ release {
156
+ minifyEnabled false
157
+ }
158
+ }
159
+
160
+ lintOptions {
161
+ disable "GradleCompatible"
162
+ }
163
+
164
+ compileOptions {
165
+ sourceCompatibility JavaVersion.VERSION_1_8
166
+ targetCompatibility JavaVersion.VERSION_1_8
167
+ }
168
+
169
+ sourceSets {
170
+ main {
171
+ if (isNewArchitectureEnabled()) {
172
+ java.srcDirs += [
173
+ "generated/java",
174
+ "generated/jni"
175
+ ]
176
+ }
177
+ }
178
+ }
179
+ }
180
+
181
+ repositories {
182
+ mavenCentral()
183
+ google()
184
+ }
185
+
186
+ def kotlin_version = getExtOrDefault("kotlinVersion")
187
+
188
+ dependencies {
189
+ // For < 0.71, this will be from the local maven repo
190
+ // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
191
+ //noinspection GradleDynamicVersion
192
+ implementation "com.facebook.react:react-native:+"
193
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
194
+
195
+ // CameraX
196
+ def camerax_version = "1.5.3"
197
+ implementation "androidx.camera:camera-core:$camerax_version"
198
+ implementation "androidx.camera:camera-camera2:$camerax_version"
199
+ implementation "androidx.camera:camera-lifecycle:$camerax_version"
200
+ implementation "androidx.camera:camera-view:$camerax_version"
201
+ implementation "androidx.camera:camera-video:$camerax_version"
202
+
203
+ // EXIF metadata extraction
204
+ implementation "androidx.exifinterface:exifinterface:1.3.7"
205
+ }
206
+
207
+ if (isNewArchitectureEnabled()) {
208
+ react {
209
+ jsRootDir = file("../src/")
210
+ libraryName = "Zcam1Sdk"
211
+ codegenJavaPackageName = "com.succinctlabs.zcam1sdk"
212
+ }
213
+ }
@@ -0,0 +1,35 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ #include <jni.h>
3
+ #include <jsi/jsi.h>
4
+ #include <ReactCommon/CallInvokerHolder.h>
5
+ #include "zcam1-proving.h"
6
+
7
+ namespace jsi = facebook::jsi;
8
+ namespace react = facebook::react;
9
+
10
+ // Installer coming from Zcam1ProvingModule
11
+ extern "C"
12
+ JNIEXPORT jboolean JNICALL
13
+ Java_com_succinctlabs_zcam1sdk_Zcam1ProvingModule_nativeInstallRustCrate(
14
+ JNIEnv *env,
15
+ jclass type,
16
+ jlong rtPtr,
17
+ jobject callInvokerHolderJavaObj
18
+ ) {
19
+ using JCallInvokerHolder = facebook::react::CallInvokerHolder;
20
+
21
+ auto holderLocal = facebook::jni::make_local(callInvokerHolderJavaObj);
22
+ auto holderRef = facebook::jni::static_ref_cast<JCallInvokerHolder::javaobject>(holderLocal);
23
+ auto* holderCxx = holderRef->cthis();
24
+ auto jsCallInvoker = holderCxx->getCallInvoker();
25
+ auto runtime = reinterpret_cast<jsi::Runtime *>(rtPtr);
26
+
27
+ return zcam1proving::installRustCrate(*runtime, jsCallInvoker);
28
+ }
29
+
30
+ extern "C"
31
+ JNIEXPORT jboolean JNICALL
32
+ Java_com_succinctlabs_zcam1sdk_Zcam1ProvingModule_nativeCleanupRustCrate(JNIEnv *env, jclass type, jlong rtPtr) {
33
+ auto runtime = reinterpret_cast<jsi::Runtime *>(rtPtr);
34
+ return zcam1proving::cleanupRustCrate(*runtime);
35
+ }
@@ -0,0 +1,35 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ #include <jni.h>
3
+ #include <jsi/jsi.h>
4
+ #include <ReactCommon/CallInvokerHolder.h>
5
+ #include "zcam1-sdk.h"
6
+
7
+ namespace jsi = facebook::jsi;
8
+ namespace react = facebook::react;
9
+
10
+ // Installer coming from Zcam1SdkModule
11
+ extern "C"
12
+ JNIEXPORT jboolean JNICALL
13
+ Java_com_succinctlabs_zcam1sdk_Zcam1SdkModule_nativeInstallRustCrate(
14
+ JNIEnv *env,
15
+ jclass type,
16
+ jlong rtPtr,
17
+ jobject callInvokerHolderJavaObj
18
+ ) {
19
+ using JCallInvokerHolder = facebook::react::CallInvokerHolder;
20
+
21
+ auto holderLocal = facebook::jni::make_local(callInvokerHolderJavaObj);
22
+ auto holderRef = facebook::jni::static_ref_cast<JCallInvokerHolder::javaobject>(holderLocal);
23
+ auto* holderCxx = holderRef->cthis();
24
+ auto jsCallInvoker = holderCxx->getCallInvoker();
25
+ auto runtime = reinterpret_cast<jsi::Runtime *>(rtPtr);
26
+
27
+ return zcam1sdk::installRustCrate(*runtime, jsCallInvoker);
28
+ }
29
+
30
+ extern "C"
31
+ JNIEXPORT jboolean JNICALL
32
+ Java_com_succinctlabs_zcam1sdk_Zcam1SdkModule_nativeCleanupRustCrate(JNIEnv *env, jclass type, jlong rtPtr) {
33
+ auto runtime = reinterpret_cast<jsi::Runtime *>(rtPtr);
34
+ return zcam1sdk::cleanupRustCrate(*runtime);
35
+ }
@@ -0,0 +1,5 @@
1
+
2
+ <!-- Generated by uniffi-bindgen-react-native -->
3
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
4
+ package="com.succinctlabs.zcam1sdk">
5
+ </manifest>
@@ -0,0 +1,156 @@
1
+ package com.succinctlabs.zcam1sdk
2
+
3
+ import android.content.Intent
4
+ import android.webkit.MimeTypeMap
5
+ import androidx.core.content.FileProvider
6
+ import com.facebook.react.bridge.Promise
7
+ import com.facebook.react.bridge.ReactApplicationContext
8
+ import com.facebook.react.bridge.WritableNativeArray
9
+ import com.facebook.react.bridge.WritableNativeMap
10
+ import com.facebook.react.module.annotations.ReactModule
11
+ import com.succinctlabs.zcam1sdk.camera.Zcam1CameraService
12
+ import java.io.File
13
+
14
+ @ReactModule(name = Zcam1CaptureModule.NAME)
15
+ class Zcam1CaptureModule(reactContext: ReactApplicationContext) :
16
+ NativeZcam1CaptureSpec(reactContext) {
17
+
18
+ companion object {
19
+ const val NAME = "Zcam1Capture"
20
+ }
21
+
22
+ override fun getName(): String = NAME
23
+
24
+ override fun takeNativePhoto(
25
+ format: String,
26
+ position: String,
27
+ flash: String,
28
+ includeDepthData: Boolean,
29
+ aspectRatio: String,
30
+ orientation: String,
31
+ skipPostProcessing: Boolean,
32
+ promise: Promise
33
+ ) {
34
+ val service = Zcam1CameraService.activeInstance ?: run {
35
+ promise.reject("CAMERA_ERROR", "Camera not initialized")
36
+ return
37
+ }
38
+ service.takePhoto(format, flash, promise)
39
+ }
40
+
41
+ override fun startNativeVideoRecording(
42
+ position: String,
43
+ maxDurationSeconds: Double,
44
+ promise: Promise
45
+ ) {
46
+ val service = Zcam1CameraService.activeInstance ?: run {
47
+ promise.reject("CAMERA_ERROR", "Camera not initialized")
48
+ return
49
+ }
50
+ service.startVideoRecording(maxDurationSeconds, promise)
51
+ }
52
+
53
+ override fun stopNativeVideoRecording(promise: Promise) {
54
+ val service = Zcam1CameraService.activeInstance ?: run {
55
+ promise.reject("CAMERA_ERROR", "Camera not initialized")
56
+ return
57
+ }
58
+ service.stopVideoRecording(promise)
59
+ }
60
+
61
+ override fun setZoom(factor: Double) {
62
+ Zcam1CameraService.activeInstance?.setZoom(factor.toFloat())
63
+ }
64
+
65
+ override fun setZoomAnimated(factor: Double) {
66
+ Zcam1CameraService.activeInstance?.setZoomAnimated(factor.toFloat())
67
+ }
68
+
69
+ override fun getMinZoom(promise: Promise) {
70
+ val service = Zcam1CameraService.activeInstance
71
+ promise.resolve(service?.getMinZoom()?.toDouble() ?: 1.0)
72
+ }
73
+
74
+ override fun getMaxZoom(promise: Promise) {
75
+ val service = Zcam1CameraService.activeInstance
76
+ promise.resolve(service?.getMaxZoom()?.toDouble() ?: 1.0)
77
+ }
78
+
79
+ override fun getSwitchOverZoomFactors(promise: Promise) {
80
+ // Android CameraX does not expose logical lens switch-over zoom factors
81
+ promise.resolve(WritableNativeArray())
82
+ }
83
+
84
+ override fun hasUltraWideCamera(promise: Promise) {
85
+ // Android does not distinguish ultra-wide in the same way as iOS
86
+ promise.resolve(false)
87
+ }
88
+
89
+ override fun getExposureRange(promise: Promise) {
90
+ val service = Zcam1CameraService.activeInstance
91
+ val range = service?.getExposureRange() ?: Pair(-2.0f, 2.0f)
92
+ val result = WritableNativeMap().apply {
93
+ putDouble("min", range.first.toDouble())
94
+ putDouble("max", range.second.toDouble())
95
+ }
96
+ promise.resolve(result)
97
+ }
98
+
99
+ override fun resetExposure() {
100
+ Zcam1CameraService.activeInstance?.resetExposure()
101
+ }
102
+
103
+ override fun focusAtPoint(x: Double, y: Double) {
104
+ Zcam1CameraService.activeInstance?.focusAtPoint(x.toFloat(), y.toFloat())
105
+ }
106
+
107
+ override fun getDeviceDiagnostics(promise: Promise) {
108
+ val service = Zcam1CameraService.activeInstance ?: run {
109
+ promise.reject("CAMERA_ERROR", "Camera not initialized")
110
+ return
111
+ }
112
+ promise.resolve(service.getDeviceDiagnostics())
113
+ }
114
+
115
+ override fun isDepthSupported(promise: Promise) {
116
+ // Depth delivery via CameraX is not exposed in a way that mirrors iOS AVDepthData
117
+ promise.resolve(false)
118
+ }
119
+
120
+ override fun hasDepthZoomLimitations(promise: Promise) {
121
+ promise.resolve(false)
122
+ }
123
+
124
+ override fun getDepthSupportedZoomRanges(promise: Promise) {
125
+ promise.resolve(WritableNativeArray())
126
+ }
127
+
128
+ override fun previewFile(filePath: String, promise: Promise) {
129
+ val context = reactApplicationContext
130
+ val file = File(filePath)
131
+
132
+ if (!file.exists()) {
133
+ promise.reject("FILE_NOT_FOUND", "File does not exist: $filePath")
134
+ return
135
+ }
136
+
137
+ try {
138
+ val uri = FileProvider.getUriForFile(
139
+ context,
140
+ "${context.packageName}.provider",
141
+ file
142
+ )
143
+ val ext = filePath.substringAfterLast('.', "").lowercase()
144
+ val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) ?: "*/*"
145
+ val intent = Intent(Intent.ACTION_VIEW).apply {
146
+ setDataAndType(uri, mimeType)
147
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
148
+ addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
149
+ }
150
+ context.startActivity(intent)
151
+ promise.resolve(null)
152
+ } catch (e: Exception) {
153
+ promise.reject("PREVIEW_ERROR", e.message, e)
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,38 @@
1
+ package com.succinctlabs.zcam1sdk
2
+
3
+ import com.facebook.react.TurboReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
8
+ import com.facebook.react.uimanager.ViewManager
9
+ import com.succinctlabs.zcam1sdk.camera.Zcam1CameraViewManager
10
+ import java.util.HashMap
11
+
12
+ class Zcam1CapturePackage : TurboReactPackage() {
13
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
14
+ return listOf(Zcam1CameraViewManager())
15
+ }
16
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
17
+ return if (name == Zcam1CaptureModule.NAME) {
18
+ Zcam1CaptureModule(reactContext)
19
+ } else {
20
+ null
21
+ }
22
+ }
23
+
24
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
25
+ return ReactModuleInfoProvider {
26
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
27
+ moduleInfos[Zcam1CaptureModule.NAME] = ReactModuleInfo(
28
+ Zcam1CaptureModule.NAME,
29
+ Zcam1CaptureModule.NAME,
30
+ false, // canOverrideExistingModule
31
+ false, // needsEagerInit
32
+ false, // isCxxModule
33
+ true // isTurboModule
34
+ )
35
+ moduleInfos
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,43 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ package com.succinctlabs.zcam1sdk
3
+
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.module.annotations.ReactModule
6
+ import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder
7
+
8
+ @ReactModule(name = Zcam1ProvingModule.NAME)
9
+ class Zcam1ProvingModule(reactContext: ReactApplicationContext) :
10
+ NativeZcam1ProvingSpec(reactContext) {
11
+
12
+ override fun getName(): String {
13
+ return NAME
14
+ }
15
+
16
+ // Two native methods implemented in cpp-adapter.cpp, and ultimately
17
+ // zcam1-proving.cpp
18
+
19
+ external fun nativeInstallRustCrate(runtimePointer: Long, callInvoker: CallInvokerHolder): Boolean
20
+ external fun nativeCleanupRustCrate(runtimePointer: Long): Boolean
21
+
22
+ override fun installRustCrate(): Boolean {
23
+ val context = this.reactApplicationContext
24
+ return nativeInstallRustCrate(
25
+ context.javaScriptContextHolder!!.get(),
26
+ context.jsCallInvokerHolder!!
27
+ )
28
+ }
29
+
30
+ override fun cleanupRustCrate(): Boolean {
31
+ return nativeCleanupRustCrate(
32
+ this.reactApplicationContext.javaScriptContextHolder!!.get()
33
+ )
34
+ }
35
+
36
+ companion object {
37
+ const val NAME = "Zcam1Proving"
38
+
39
+ init {
40
+ System.loadLibrary("zcam1-proving")
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,34 @@
1
+ // Generated by uniffi-bindgen-react-native
2
+ package com.succinctlabs.zcam1sdk
3
+
4
+ import com.facebook.react.TurboReactPackage
5
+ import com.facebook.react.bridge.NativeModule
6
+ import com.facebook.react.bridge.ReactApplicationContext
7
+ import com.facebook.react.module.model.ReactModuleInfo
8
+ import com.facebook.react.module.model.ReactModuleInfoProvider
9
+ import java.util.HashMap
10
+
11
+ class Zcam1ProvingPackage : TurboReactPackage() {
12
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
13
+ return if (name == Zcam1ProvingModule.NAME) {
14
+ Zcam1ProvingModule(reactContext)
15
+ } else {
16
+ null
17
+ }
18
+ }
19
+
20
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
21
+ return ReactModuleInfoProvider {
22
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
23
+ moduleInfos[Zcam1ProvingModule.NAME] = ReactModuleInfo(
24
+ Zcam1ProvingModule.NAME,
25
+ Zcam1ProvingModule.NAME,
26
+ false, // canOverrideExistingModule
27
+ false, // needsEagerInit
28
+ false, // isCxxModule
29
+ true // isTurboModule
30
+ )
31
+ moduleInfos
32
+ }
33
+ }
34
+ }