ilabs-flir 1.0.3 → 1.0.5

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 (33) hide show
  1. package/android/Flir/build.gradle.kts +14 -27
  2. package/android/Flir/libs/androidsdk-release.aar +0 -0
  3. package/android/Flir/libs/thermalsdk-release.aar +0 -0
  4. package/android/Flir/src/main/java/flir/android/FlirCommands.java +40 -15
  5. package/android/Flir/src/main/java/flir/android/FlirDownloadManager.kt +26 -46
  6. package/android/Flir/src/main/java/flir/android/FlirManager.kt +265 -42
  7. package/android/Flir/src/main/java/flir/android/FlirModule.kt +32 -0
  8. package/android/Flir/src/main/java/flir/android/FlirSDKLoader.kt +84 -195
  9. package/android/Flir/src/main/java/flir/android/FlirSdkManager.java +667 -797
  10. package/package.json +1 -1
  11. package/sdk-manifest.json +14 -7
  12. package/src/index.d.ts +21 -1
  13. package/android/Flir/libs/flir-stubs.jar +0 -0
  14. package/android/Flir/src/main/java/com/flir/thermalsdk/ErrorCodeException.java +0 -14
  15. package/android/Flir/src/main/java/com/flir/thermalsdk/image/ImageBuffer.java +0 -11
  16. package/android/Flir/src/main/java/com/flir/thermalsdk/image/JavaImageBuffer.java +0 -35
  17. package/android/Flir/src/main/java/com/flir/thermalsdk/image/Palette.java +0 -15
  18. package/android/Flir/src/main/java/com/flir/thermalsdk/image/PaletteManager.java +0 -16
  19. package/android/Flir/src/main/java/com/flir/thermalsdk/image/Point.java +0 -11
  20. package/android/Flir/src/main/java/com/flir/thermalsdk/image/ThermalImage.java +0 -23
  21. package/android/Flir/src/main/java/com/flir/thermalsdk/image/ThermalValue.java +0 -9
  22. package/android/Flir/src/main/java/com/flir/thermalsdk/live/CameraType.java +0 -8
  23. package/android/Flir/src/main/java/com/flir/thermalsdk/live/CommunicationInterface.java +0 -16
  24. package/android/Flir/src/main/java/com/flir/thermalsdk/live/Identity.java +0 -23
  25. package/android/Flir/src/main/java/com/flir/thermalsdk/live/IpSettings.java +0 -9
  26. package/android/Flir/src/main/java/com/flir/thermalsdk/live/connectivity/ConnectionStatusListener.java +0 -7
  27. package/android/Flir/src/main/java/com/flir/thermalsdk/live/remote/OnReceived.java +0 -5
  28. package/android/Flir/src/main/java/com/flir/thermalsdk/live/remote/OnRemoteError.java +0 -7
  29. package/android/Flir/src/main/java/flir/android/CameraHandler.java +0 -224
  30. package/android/Flir/src/main/java/flir/android/FlirConnectionManager.java +0 -354
  31. package/android/Flir/src/main/java/flir/android/FlirController.kt +0 -11
  32. package/android/Flir/src/main/java/flir/android/FlirDiscoveryManager.java +0 -236
  33. package/android/Flir/src/main/java/flir/android/FrameDataHolder.java +0 -14
@@ -1,195 +1,84 @@
1
- package flir.android
2
-
3
- import android.content.Context
4
- import com.google.android.play.core.splitinstall.*
5
- import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus
6
- import kotlinx.coroutines.*
7
- import org.json.JSONObject
8
- import java.io.File
9
- import java.io.FileOutputStream
10
- import java.net.URL
11
- import java.security.MessageDigest
12
- import java.util.zip.ZipInputStream
13
-
14
- object FlirSDKLoader {
15
-
16
- private const val FEATURE_MODULE = "flir_sdk"
17
- private var splitInstallManager: SplitInstallManager? = null
18
-
19
- fun init(context: Context) {
20
- splitInstallManager = SplitInstallManagerFactory.create(context)
21
- }
22
-
23
- private fun getSDKDirectory(context: Context) = File(context.filesDir, "FlirSDK")
24
-
25
- fun isSDKAvailable(context: Context): Boolean {
26
- // Check Play Feature module
27
- splitInstallManager?.installedModules?.let {
28
- if (FEATURE_MODULE in it) return true
29
- }
30
- // Check direct download - look for either file from the manifest
31
- val sdkDir = getSDKDirectory(context)
32
- return File(sdkDir, "thermalsdk-release.aar").exists() ||
33
- File(sdkDir, "androidsdk-release.aar").exists() ||
34
- File(sdkDir, "thermalsdk.aar").exists()
35
- }
36
-
37
- fun getDownloadSize(context: Context): Long {
38
- return loadManifest(context)?.android?.directDownload?.sizeBytes ?: 52_428_800L
39
- }
40
-
41
- fun downloadViaPlayStore(
42
- onProgress: (Float) -> Unit,
43
- onComplete: () -> Unit,
44
- onError: (String) -> Unit
45
- ) {
46
- val manager = splitInstallManager ?: run {
47
- onError("SplitInstallManager not initialized")
48
- return
49
- }
50
-
51
- val request = SplitInstallRequest.newBuilder()
52
- .addModule(FEATURE_MODULE)
53
- .build()
54
-
55
- manager.registerListener { state ->
56
- when (state.status()) {
57
- SplitInstallSessionStatus.DOWNLOADING -> {
58
- val progress = state.bytesDownloaded().toFloat() / state.totalBytesToDownload()
59
- onProgress(progress)
60
- }
61
- SplitInstallSessionStatus.INSTALLED -> onComplete()
62
- SplitInstallSessionStatus.FAILED -> onError("Install failed: ${state.errorCode()}")
63
- else -> {}
64
- }
65
- }
66
-
67
- manager.startInstall(request)
68
- }
69
-
70
- suspend fun downloadDirect(
71
- context: Context,
72
- onProgress: (downloaded: Long, total: Long) -> Unit
73
- ): Result<Unit> = withContext(Dispatchers.IO) {
74
- try {
75
- val manifest = loadManifest(context) ?: return@withContext Result.failure(
76
- Exception("Failed to load manifest")
77
- )
78
-
79
- val downloadUrl = manifest.android.directDownload.downloadUrl
80
- val expectedHash = manifest.android.directDownload.sha256
81
- val totalSize = manifest.android.directDownload.sizeBytes
82
-
83
- val sdkDir = getSDKDirectory(context).apply { mkdirs() }
84
- val zipFile = File(context.cacheDir, "flir-sdk.zip")
85
-
86
- // Download
87
- URL(downloadUrl).openStream().use { input ->
88
- FileOutputStream(zipFile).use { output ->
89
- val buffer = ByteArray(8192)
90
- var totalRead = 0L
91
- var bytesRead: Int
92
-
93
- while (input.read(buffer).also { bytesRead = it } != -1) {
94
- output.write(buffer, 0, bytesRead)
95
- totalRead += bytesRead
96
- withContext(Dispatchers.Main) {
97
- onProgress(totalRead, totalSize)
98
- }
99
- }
100
- }
101
- }
102
-
103
- // Verify checksum
104
- val actualHash = sha256(zipFile)
105
- if (actualHash != expectedHash) {
106
- zipFile.delete()
107
- return@withContext Result.failure(SecurityException("Checksum mismatch"))
108
- }
109
-
110
- // Extract
111
- unzip(zipFile, sdkDir)
112
- zipFile.delete()
113
-
114
- Result.success(Unit)
115
- } catch (e: Exception) {
116
- Result.failure(e)
117
- }
118
- }
119
-
120
- fun deleteSDK(context: Context): Boolean {
121
- splitInstallManager?.deferredUninstall(listOf(FEATURE_MODULE))
122
- return getSDKDirectory(context).deleteRecursively()
123
- }
124
-
125
- private fun loadManifest(context: Context): SDKManifest? {
126
- return try {
127
- val json = context.assets.open("sdk-manifest.json").bufferedReader().readText()
128
- SDKManifest.fromJson(json)
129
- } catch (e: Exception) { null }
130
- }
131
-
132
- private fun sha256(file: File): String {
133
- val digest = MessageDigest.getInstance("SHA-256")
134
- file.inputStream().use { input ->
135
- val buffer = ByteArray(8192)
136
- var bytesRead: Int
137
- while (input.read(buffer).also { bytesRead = it } != -1) {
138
- digest.update(buffer, 0, bytesRead)
139
- }
140
- }
141
- return digest.digest().joinToString("") { "%02x".format(it) }
142
- }
143
-
144
- private fun unzip(source: File, destination: File) {
145
- ZipInputStream(source.inputStream()).use { zip ->
146
- var entry = zip.nextEntry
147
- while (entry != null) {
148
- val file = File(destination, entry.name)
149
- if (entry.isDirectory) {
150
- file.mkdirs()
151
- } else {
152
- file.parentFile?.mkdirs()
153
- file.outputStream().use { zip.copyTo(it) }
154
- }
155
- entry = zip.nextEntry
156
- }
157
- }
158
- }
159
- }
160
-
161
- data class SDKManifest(
162
- val version: String,
163
- val android: AndroidManifest
164
- ) {
165
- data class AndroidManifest(
166
- val playFeatureModule: String,
167
- val directDownload: DirectDownload
168
- )
169
-
170
- data class DirectDownload(
171
- val downloadUrl: String,
172
- val sha256: String,
173
- val sizeBytes: Long
174
- )
175
-
176
- companion object {
177
- fun fromJson(json: String): SDKManifest {
178
- val root = JSONObject(json)
179
- val android = root.getJSONObject("android")
180
- val direct = android.getJSONObject("directDownload")
181
-
182
- return SDKManifest(
183
- version = root.getString("version"),
184
- android = AndroidManifest(
185
- playFeatureModule = android.getString("playFeatureModule"),
186
- directDownload = DirectDownload(
187
- downloadUrl = direct.getString("downloadUrl"),
188
- sha256 = direct.getString("sha256"),
189
- sizeBytes = direct.getLong("sizeBytes")
190
- )
191
- )
192
- )
193
- }
194
- }
195
- }
1
+ package flir.android
2
+
3
+ import android.content.Context
4
+ import android.os.Build
5
+ import android.util.Log
6
+
7
+ /**
8
+ * FlirSDKLoader - SDK availability checker
9
+ *
10
+ * Since the SDK is now bundled via AAR files, this class simply reports
11
+ * that the SDK is always available. The AAR files include native .so libraries
12
+ * for all supported architectures, which Android handles automatically.
13
+ */
14
+ object FlirSDKLoader {
15
+
16
+ private const val TAG = "FlirSDKLoader"
17
+
18
+ /**
19
+ * Get the primary ABI for this device
20
+ */
21
+ fun getDeviceArch(): String {
22
+ val supportedAbis = Build.SUPPORTED_ABIS
23
+ Log.d(TAG, "Device supported ABIs: ${supportedAbis.joinToString()}")
24
+
25
+ val knownArchs = setOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86")
26
+ for (abi in supportedAbis) {
27
+ if (abi in knownArchs) {
28
+ Log.d(TAG, "Selected ABI: $abi")
29
+ return abi
30
+ }
31
+ }
32
+ return "arm64-v8a"
33
+ }
34
+
35
+ /**
36
+ * Check if SDK is available - always true since bundled in AAR
37
+ */
38
+ fun isSDKAvailable(context: Context): Boolean {
39
+ Log.d(TAG, "SDK is bundled in AAR - always available")
40
+ return true
41
+ }
42
+
43
+ /**
44
+ * No download needed - SDK is bundled
45
+ */
46
+ suspend fun downloadSDK(
47
+ context: Context,
48
+ onProgress: ((progress: Int, bytesDownloaded: Long, totalBytes: Long) -> Unit)? = null
49
+ ): Boolean {
50
+ Log.d(TAG, "SDK is bundled - no download needed")
51
+ onProgress?.invoke(100, 0, 0)
52
+ return true
53
+ }
54
+
55
+ /**
56
+ * Get SDK status
57
+ */
58
+ fun getSDKStatus(context: Context): Map<String, Any> {
59
+ return mapOf(
60
+ "available" to true,
61
+ "bundled" to true,
62
+ "arch" to getDeviceArch(),
63
+ "version" to "4.16.0" // SDK version from AAR
64
+ )
65
+ }
66
+
67
+ /**
68
+ * Get DEX path - not applicable when bundled via AAR
69
+ * Returns null since SDK is bundled in AAR, no separate DEX needed
70
+ */
71
+ fun getDexPath(context: Context): java.io.File? {
72
+ // SDK is bundled in AAR - no separate DEX file
73
+ return null
74
+ }
75
+
76
+ /**
77
+ * Get native library directory - not applicable when bundled via AAR
78
+ * Returns null since native libs are included in AAR and handled by Android
79
+ */
80
+ fun getNativeLibDir(context: Context): java.io.File? {
81
+ // SDK native libs are bundled in AAR and extracted automatically by Android
82
+ return null
83
+ }
84
+ }