@succinctlabs/react-native-zcam1 0.3.0 → 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.
- package/Zcam1Sdk.podspec +2 -2
- package/android/CMakeLists.txt +114 -0
- package/android/build.gradle +213 -0
- package/android/cpp-adapter-proving.cpp +35 -0
- package/android/cpp-adapter.cpp +35 -0
- package/android/src/main/AndroidManifest.xml +5 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1CaptureModule.kt +156 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1CapturePackage.kt +38 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1ProvingModule.kt +43 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1ProvingPackage.kt +34 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1SdkModule.kt +43 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/Zcam1SdkPackage.kt +34 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/CameraUtils.kt +80 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraService.kt +588 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraView.kt +107 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1CameraViewManager.kt +33 -0
- package/android/src/main/java/com/succinctlabs/zcam1sdk/camera/Zcam1OrientationManager.kt +73 -0
- package/cpp/generated/zcam1_c2pa_utils.cpp +170 -365
- package/cpp/generated/zcam1_c2pa_utils.hpp +0 -4
- package/cpp/generated/zcam1_certs_utils.cpp +121 -250
- package/cpp/generated/zcam1_common.cpp +1871 -0
- package/cpp/generated/zcam1_common.hpp +52 -0
- package/cpp/generated/zcam1_verify_utils.cpp +138 -265
- package/cpp/generated/zcam1_verify_utils.hpp +2 -2
- package/cpp/proving/generated/zcam1_common.cpp +1871 -0
- package/cpp/proving/generated/zcam1_common.hpp +52 -0
- package/cpp/proving/generated/zcam1_proving_utils.cpp +355 -417
- package/cpp/proving/generated/zcam1_proving_utils.hpp +13 -17
- package/cpp/proving/zcam1-proving.cpp +2 -0
- package/cpp/zcam1-sdk.cpp +2 -0
- package/lib/module/bindings.js +4 -0
- package/lib/module/bindings.js.map +1 -1
- package/lib/module/camera.js +71 -13
- package/lib/module/camera.js.map +1 -1
- package/lib/module/capture.js +115 -38
- package/lib/module/capture.js.map +1 -1
- package/lib/module/common.js +18 -2
- package/lib/module/common.js.map +1 -1
- package/lib/module/generated/zcam1_c2pa_utils-ffi.js +4 -0
- package/lib/module/generated/zcam1_c2pa_utils-ffi.js.map +1 -1
- package/lib/module/generated/zcam1_c2pa_utils.js +117 -9
- package/lib/module/generated/zcam1_c2pa_utils.js.map +1 -1
- package/lib/module/generated/zcam1_certs_utils-ffi.js +4 -0
- package/lib/module/generated/zcam1_certs_utils-ffi.js.map +1 -1
- package/lib/module/generated/zcam1_certs_utils.js +6 -2
- package/lib/module/generated/zcam1_certs_utils.js.map +1 -1
- package/lib/module/generated/zcam1_common-ffi.js +47 -0
- package/lib/module/generated/zcam1_common-ffi.js.map +1 -0
- package/lib/module/generated/zcam1_common.js +60 -0
- package/lib/module/generated/zcam1_common.js.map +1 -0
- package/lib/module/generated/zcam1_proving_utils-ffi.js +4 -0
- package/lib/module/generated/zcam1_proving_utils-ffi.js.map +1 -1
- package/lib/module/generated/zcam1_proving_utils.js +53 -46
- package/lib/module/generated/zcam1_proving_utils.js.map +1 -1
- package/lib/module/generated/zcam1_verify_utils-ffi.js +4 -0
- package/lib/module/generated/zcam1_verify_utils-ffi.js.map +1 -1
- package/lib/module/generated/zcam1_verify_utils.js +70 -22
- package/lib/module/generated/zcam1_verify_utils.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/proving/NativeZcam1Proving.js +1 -1
- package/lib/module/proving/index.js +1 -1
- package/lib/module/proving/index.js.map +1 -1
- package/lib/module/proving/prove.js +14 -8
- package/lib/module/proving/prove.js.map +1 -1
- package/lib/module/utils.js +19 -14
- package/lib/module/utils.js.map +1 -1
- package/lib/module/verify.js +14 -22
- package/lib/module/verify.js.map +1 -1
- package/lib/typescript/src/bindings.d.ts +3 -0
- package/lib/typescript/src/bindings.d.ts.map +1 -1
- package/lib/typescript/src/camera.d.ts +15 -0
- package/lib/typescript/src/camera.d.ts.map +1 -1
- package/lib/typescript/src/capture.d.ts +40 -1
- package/lib/typescript/src/capture.d.ts.map +1 -1
- package/lib/typescript/src/common.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts +37 -46
- package/lib/typescript/src/generated/zcam1_c2pa_utils-ffi.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts +110 -8
- package/lib/typescript/src/generated/zcam1_c2pa_utils.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts +27 -32
- package/lib/typescript/src/generated/zcam1_certs_utils-ffi.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_certs_utils.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_common-ffi.d.ts +77 -0
- package/lib/typescript/src/generated/zcam1_common-ffi.d.ts.map +1 -0
- package/lib/typescript/src/generated/zcam1_common.d.ts +17 -0
- package/lib/typescript/src/generated/zcam1_common.d.ts.map +1 -0
- package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts +44 -51
- package/lib/typescript/src/generated/zcam1_proving_utils-ffi.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_proving_utils.d.ts +26 -26
- package/lib/typescript/src/generated/zcam1_proving_utils.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts +29 -34
- package/lib/typescript/src/generated/zcam1_verify_utils-ffi.d.ts.map +1 -1
- package/lib/typescript/src/generated/zcam1_verify_utils.d.ts +94 -14
- package/lib/typescript/src/generated/zcam1_verify_utils.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/proving/NativeZcam1Proving.d.ts +1 -1
- package/lib/typescript/src/proving/index.d.ts +1 -1
- package/lib/typescript/src/proving/index.d.ts.map +1 -1
- package/lib/typescript/src/proving/prove.d.ts +3 -3
- package/lib/typescript/src/proving/prove.d.ts.map +1 -1
- package/lib/typescript/src/utils.d.ts.map +1 -1
- package/lib/typescript/src/verify.d.ts +4 -3
- package/lib/typescript/src/verify.d.ts.map +1 -1
- package/package.json +13 -6
- package/react-native.config.js +11 -0
- package/src/bindings.tsx +4 -0
- package/src/camera.tsx +116 -11
- package/src/capture.tsx +150 -53
- package/src/common.tsx +22 -2
- package/src/generated/zcam1_c2pa_utils-ffi.ts +42 -56
- package/src/generated/zcam1_c2pa_utils.ts +224 -67
- package/src/generated/zcam1_certs_utils-ffi.ts +33 -36
- package/src/generated/zcam1_certs_utils.ts +27 -24
- package/src/generated/zcam1_common-ffi.ts +183 -0
- package/src/generated/zcam1_common.ts +116 -0
- package/src/generated/zcam1_proving_utils-ffi.ts +54 -67
- package/src/generated/zcam1_proving_utils.ts +133 -138
- package/src/generated/zcam1_verify_utils-ffi.ts +39 -40
- package/src/generated/zcam1_verify_utils.ts +109 -47
- package/src/index.ts +1 -1
- package/src/proving/NativeZcam1Proving.ts +2 -2
- package/src/proving/index.ts +1 -1
- package/src/proving/prove.tsx +22 -11
- package/src/utils.ts +26 -20
- 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,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
|
+
}
|