react-native-ensys-camera-x 1.0.7

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 (506) hide show
  1. package/CustomCamera.podspec +20 -0
  2. package/LICENSE +20 -0
  3. package/README.md +833 -0
  4. package/android/build.gradle +135 -0
  5. package/android/consumer-rules.pro +47 -0
  6. package/android/src/main/AndroidManifest.xml +72 -0
  7. package/android/src/main/java/android/print/PdfPrint.java +51 -0
  8. package/android/src/main/java/com/customcamera/AnimatedImageViewManager.kt +199 -0
  9. package/android/src/main/java/com/customcamera/AudioPlayerView.kt +322 -0
  10. package/android/src/main/java/com/customcamera/AudioRecorder.kt +506 -0
  11. package/android/src/main/java/com/customcamera/BarcodeScannerActivity.kt +361 -0
  12. package/android/src/main/java/com/customcamera/BlurBackgroundView.kt +199 -0
  13. package/android/src/main/java/com/customcamera/CacheCleanupManager.kt +386 -0
  14. package/android/src/main/java/com/customcamera/CameraAspectRatioMode.kt +77 -0
  15. package/android/src/main/java/com/customcamera/CameraAsset.kt +211 -0
  16. package/android/src/main/java/com/customcamera/CameraTheme.kt +479 -0
  17. package/android/src/main/java/com/customcamera/CompressionCacheStore.kt +504 -0
  18. package/android/src/main/java/com/customcamera/CompressionFileNameUtils.kt +7 -0
  19. package/android/src/main/java/com/customcamera/CompressionProfile.kt +195 -0
  20. package/android/src/main/java/com/customcamera/CustomCameraActivity.kt +7291 -0
  21. package/android/src/main/java/com/customcamera/CustomCameraFileProvider.kt +9 -0
  22. package/android/src/main/java/com/customcamera/CustomCameraModule.kt +2479 -0
  23. package/android/src/main/java/com/customcamera/CustomCameraPackage.kt +53 -0
  24. package/android/src/main/java/com/customcamera/DisplayUtils.kt +9 -0
  25. package/android/src/main/java/com/customcamera/DocumentPreviewView.kt +846 -0
  26. package/android/src/main/java/com/customcamera/DrawingView.kt +214 -0
  27. package/android/src/main/java/com/customcamera/EmojiPickerData.kt +228 -0
  28. package/android/src/main/java/com/customcamera/FilterStripAdapter.kt +158 -0
  29. package/android/src/main/java/com/customcamera/GifSupport.kt +215 -0
  30. package/android/src/main/java/com/customcamera/GlobalAudioPlayer.kt +320 -0
  31. package/android/src/main/java/com/customcamera/ImageExporter.kt +1394 -0
  32. package/android/src/main/java/com/customcamera/ImageFormatSupport.kt +163 -0
  33. package/android/src/main/java/com/customcamera/Localization.kt +206 -0
  34. package/android/src/main/java/com/customcamera/MediaAdapters.kt +758 -0
  35. package/android/src/main/java/com/customcamera/MediaCacheManager.kt +782 -0
  36. package/android/src/main/java/com/customcamera/MediaExportFormats.kt +201 -0
  37. package/android/src/main/java/com/customcamera/MediaFileIo.kt +310 -0
  38. package/android/src/main/java/com/customcamera/MediaMetadataStore.kt +494 -0
  39. package/android/src/main/java/com/customcamera/MediaPreviewEditor.kt +14865 -0
  40. package/android/src/main/java/com/customcamera/MediaPublisher.kt +423 -0
  41. package/android/src/main/java/com/customcamera/MediaStorageWorkflow.kt +722 -0
  42. package/android/src/main/java/com/customcamera/MediaStoreRepository.kt +378 -0
  43. package/android/src/main/java/com/customcamera/MediaThumbnailView.kt +286 -0
  44. package/android/src/main/java/com/customcamera/MediaUtils.kt +37 -0
  45. package/android/src/main/java/com/customcamera/NativeVideoViewManager.kt +845 -0
  46. package/android/src/main/java/com/customcamera/OfficeDocumentConverter.kt +2791 -0
  47. package/android/src/main/java/com/customcamera/PendingCaptureCrops.kt +88 -0
  48. package/android/src/main/java/com/customcamera/PowerPointPreview.kt +4077 -0
  49. package/android/src/main/java/com/customcamera/RecentPickerStore.kt +74 -0
  50. package/android/src/main/java/com/customcamera/SecureFileEraser.kt +411 -0
  51. package/android/src/main/java/com/customcamera/SecureKeyModule.kt +88 -0
  52. package/android/src/main/java/com/customcamera/SecureMediaDeleter.kt +493 -0
  53. package/android/src/main/java/com/customcamera/StickerPickerData.kt +107 -0
  54. package/android/src/main/java/com/customcamera/SvgDrawable.kt +175 -0
  55. package/android/src/main/java/com/customcamera/SvgIconViewManager.kt +77 -0
  56. package/android/src/main/java/com/customcamera/TextEntryController.kt +553 -0
  57. package/android/src/main/java/com/customcamera/ThumbnailLoader.kt +455 -0
  58. package/android/src/main/java/com/customcamera/UploadService.kt +909 -0
  59. package/android/src/main/java/com/customcamera/VideoEditUtils.kt +210 -0
  60. package/android/src/main/java/com/customcamera/VideoRotationTranscoder.kt +1992 -0
  61. package/android/src/main/java/com/customcamera/gif/AnimatedGifEncoder.kt +473 -0
  62. package/android/src/main/java/com/customcamera/gif/GifDecoder.kt +690 -0
  63. package/android/src/main/java/com/customcamera/gif/GifFramesDrawable.kt +160 -0
  64. package/android/src/main/java/com/customcamera/gif/GifHttp.kt +112 -0
  65. package/android/src/main/java/com/customcamera/gif/GifImageLoader.kt +186 -0
  66. package/android/src/main/java/com/customcamera/gif/GifModels.kt +74 -0
  67. package/android/src/main/java/com/customcamera/gif/GifProvider.kt +49 -0
  68. package/android/src/main/java/com/customcamera/gif/GifProviders.kt +27 -0
  69. package/android/src/main/java/com/customcamera/gif/GifRepository.kt +124 -0
  70. package/android/src/main/java/com/customcamera/gif/GifSafety.kt +33 -0
  71. package/android/src/main/java/com/customcamera/gif/GiphyGifProvider.kt +146 -0
  72. package/android/src/main/java/com/customcamera/gif/LZWEncoder.kt +258 -0
  73. package/android/src/main/java/com/customcamera/gif/NeuQuant.kt +435 -0
  74. package/android/src/main/java/com/customcamera/gif/TenorGifProvider.kt +147 -0
  75. package/android/src/main/res/drawable/bg_brush_selected.xml +5 -0
  76. package/android/src/main/res/drawable/bg_color_swatch.xml +5 -0
  77. package/android/src/main/res/drawable/bg_editor_toolbar.xml +6 -0
  78. package/android/src/main/res/drawable/bg_icon_circle.xml +5 -0
  79. package/android/src/main/res/drawable/bg_icon_circle_light.xml +5 -0
  80. package/android/src/main/res/drawable/bg_mode_tab_active.xml +6 -0
  81. package/android/src/main/res/drawable/bg_pill.xml +6 -0
  82. package/android/src/main/res/drawable/bg_recording_dot.xml +6 -0
  83. package/android/src/main/res/drawable/bg_selection_badge.xml +8 -0
  84. package/android/src/main/res/drawable/bg_send_button.xml +5 -0
  85. package/android/src/main/res/drawable/bg_shutter_inner.xml +5 -0
  86. package/android/src/main/res/drawable/bg_shutter_recording.xml +6 -0
  87. package/android/src/main/res/drawable/bg_shutter_ring.xml +8 -0
  88. package/android/src/main/res/drawable/bg_shutter_video_idle.xml +5 -0
  89. package/android/src/main/res/drawable/bg_thumbnail.xml +9 -0
  90. package/android/src/main/res/drawable/ic_aspect_ratio.xml +17 -0
  91. package/android/src/main/res/drawable/ic_audio.xml +10 -0
  92. package/android/src/main/res/drawable/ic_back.xml +10 -0
  93. package/android/src/main/res/drawable/ic_brush_medium.xml +12 -0
  94. package/android/src/main/res/drawable/ic_brush_thick.xml +12 -0
  95. package/android/src/main/res/drawable/ic_brush_thin.xml +12 -0
  96. package/android/src/main/res/drawable/ic_check.xml +17 -0
  97. package/android/src/main/res/drawable/ic_chevron_down.xml +10 -0
  98. package/android/src/main/res/drawable/ic_chevron_up.xml +13 -0
  99. package/android/src/main/res/drawable/ic_clear_drawing.xml +10 -0
  100. package/android/src/main/res/drawable/ic_close.xml +10 -0
  101. package/android/src/main/res/drawable/ic_cover.xml +9 -0
  102. package/android/src/main/res/drawable/ic_crop.xml +10 -0
  103. package/android/src/main/res/drawable/ic_delete.xml +9 -0
  104. package/android/src/main/res/drawable/ic_document.xml +10 -0
  105. package/android/src/main/res/drawable/ic_done.xml +10 -0
  106. package/android/src/main/res/drawable/ic_download.xml +10 -0
  107. package/android/src/main/res/drawable/ic_emoji.xml +10 -0
  108. package/android/src/main/res/drawable/ic_filter.xml +10 -0
  109. package/android/src/main/res/drawable/ic_flash_auto.xml +7 -0
  110. package/android/src/main/res/drawable/ic_flash_off.xml +23 -0
  111. package/android/src/main/res/drawable/ic_flash_on.xml +16 -0
  112. package/android/src/main/res/drawable/ic_flip.xml +15 -0
  113. package/android/src/main/res/drawable/ic_gallery.xml +10 -0
  114. package/android/src/main/res/drawable/ic_gif.xml +24 -0
  115. package/android/src/main/res/drawable/ic_lock.xml +19 -0
  116. package/android/src/main/res/drawable/ic_lock_open.xml +22 -0
  117. package/android/src/main/res/drawable/ic_marker.xml +10 -0
  118. package/android/src/main/res/drawable/ic_more_vert.xml +18 -0
  119. package/android/src/main/res/drawable/ic_overlay_close.xml +19 -0
  120. package/android/src/main/res/drawable/ic_overlay_resize.xml +18 -0
  121. package/android/src/main/res/drawable/ic_pause.xml +10 -0
  122. package/android/src/main/res/drawable/ic_photo_mode.xml +10 -0
  123. package/android/src/main/res/drawable/ic_play.xml +10 -0
  124. package/android/src/main/res/drawable/ic_redo.xml +10 -0
  125. package/android/src/main/res/drawable/ic_rotate.xml +9 -0
  126. package/android/src/main/res/drawable/ic_send.xml +10 -0
  127. package/android/src/main/res/drawable/ic_share.xml +10 -0
  128. package/android/src/main/res/drawable/ic_stat_upload.xml +10 -0
  129. package/android/src/main/res/drawable/ic_sticker.xml +24 -0
  130. package/android/src/main/res/drawable/ic_text.xml +10 -0
  131. package/android/src/main/res/drawable/ic_text_align_center.xml +11 -0
  132. package/android/src/main/res/drawable/ic_text_align_left.xml +11 -0
  133. package/android/src/main/res/drawable/ic_text_align_right.xml +11 -0
  134. package/android/src/main/res/drawable/ic_text_bg.xml +11 -0
  135. package/android/src/main/res/drawable/ic_trim.xml +23 -0
  136. package/android/src/main/res/drawable/ic_undo.xml +10 -0
  137. package/android/src/main/res/drawable/ic_video_mode.xml +10 -0
  138. package/android/src/main/res/drawable/ic_video_note.xml +13 -0
  139. package/android/src/main/res/drawable/ic_volume_off.xml +9 -0
  140. package/android/src/main/res/drawable/ic_volume_on.xml +9 -0
  141. package/android/src/main/res/drawable/sticker_heart.xml +9 -0
  142. package/android/src/main/res/drawable/sticker_smile.xml +9 -0
  143. package/android/src/main/res/drawable/sticker_star.xml +9 -0
  144. package/android/src/main/res/drawable/sticker_thumbsup.xml +9 -0
  145. package/android/src/main/res/values/colors.xml +34 -0
  146. package/android/src/main/res/values/ids.xml +15 -0
  147. package/android/src/main/res/values/strings.xml +15 -0
  148. package/android/src/main/res/values/styles.xml +20 -0
  149. package/android/src/main/res/xml/file_paths.xml +34 -0
  150. package/ios/CustomCamera.h +5 -0
  151. package/ios/CustomCamera.mm +214 -0
  152. package/lib/module/AudioPlayerContext.js +233 -0
  153. package/lib/module/AudioPlayerContext.js.map +1 -0
  154. package/lib/module/CameraPreview.js +304 -0
  155. package/lib/module/CameraPreview.js.map +1 -0
  156. package/lib/module/NativeAnimatedImageView.js +41 -0
  157. package/lib/module/NativeAnimatedImageView.js.map +1 -0
  158. package/lib/module/NativeAudioPlayerView.js +33 -0
  159. package/lib/module/NativeAudioPlayerView.js.map +1 -0
  160. package/lib/module/NativeBlurView.js +35 -0
  161. package/lib/module/NativeBlurView.js.map +1 -0
  162. package/lib/module/NativeCustomCamera.js +128 -0
  163. package/lib/module/NativeCustomCamera.js.map +1 -0
  164. package/lib/module/NativeCustomCamera.web.js +143 -0
  165. package/lib/module/NativeCustomCamera.web.js.map +1 -0
  166. package/lib/module/NativeCustomVideoView.js +5 -0
  167. package/lib/module/NativeCustomVideoView.js.map +1 -0
  168. package/lib/module/NativeDocumentPreviewView.js +156 -0
  169. package/lib/module/NativeDocumentPreviewView.js.map +1 -0
  170. package/lib/module/NativeMediaThumbnailView.js +110 -0
  171. package/lib/module/NativeMediaThumbnailView.js.map +1 -0
  172. package/lib/module/NativeSvgIcon.js +32 -0
  173. package/lib/module/NativeSvgIcon.js.map +1 -0
  174. package/lib/module/ResponsivePreviewContainer.js +171 -0
  175. package/lib/module/ResponsivePreviewContainer.js.map +1 -0
  176. package/lib/module/accessibility.js +61 -0
  177. package/lib/module/accessibility.js.map +1 -0
  178. package/lib/module/config.js +352 -0
  179. package/lib/module/config.js.map +1 -0
  180. package/lib/module/cpuOptimization.js +296 -0
  181. package/lib/module/cpuOptimization.js.map +1 -0
  182. package/lib/module/db/DatabaseManager.js +191 -0
  183. package/lib/module/db/DatabaseManager.js.map +1 -0
  184. package/lib/module/db/MediaMapper.js +284 -0
  185. package/lib/module/db/MediaMapper.js.map +1 -0
  186. package/lib/module/db/MediaRepository.js +242 -0
  187. package/lib/module/db/MediaRepository.js.map +1 -0
  188. package/lib/module/db/index.js +41 -0
  189. package/lib/module/db/index.js.map +1 -0
  190. package/lib/module/db/migrations.js +180 -0
  191. package/lib/module/db/migrations.js.map +1 -0
  192. package/lib/module/db/react-native-sqlcipher.d.js +2 -0
  193. package/lib/module/db/react-native-sqlcipher.d.js.map +1 -0
  194. package/lib/module/db/secureKey.js +87 -0
  195. package/lib/module/db/secureKey.js.map +1 -0
  196. package/lib/module/db/types.js +57 -0
  197. package/lib/module/db/types.js.map +1 -0
  198. package/lib/module/db/useMediaDatabase.js +123 -0
  199. package/lib/module/db/useMediaDatabase.js.map +1 -0
  200. package/lib/module/defaultIcons.js +2259 -0
  201. package/lib/module/defaultIcons.js.map +1 -0
  202. package/lib/module/deviceCapabilities.js +408 -0
  203. package/lib/module/deviceCapabilities.js.map +1 -0
  204. package/lib/module/errors.js +267 -0
  205. package/lib/module/errors.js.map +1 -0
  206. package/lib/module/iconConfig.js +796 -0
  207. package/lib/module/iconConfig.js.map +1 -0
  208. package/lib/module/icons.js +514 -0
  209. package/lib/module/icons.js.map +1 -0
  210. package/lib/module/index.js +251 -0
  211. package/lib/module/index.js.map +1 -0
  212. package/lib/module/jest-globals.d.js +2 -0
  213. package/lib/module/jest-globals.d.js.map +1 -0
  214. package/lib/module/library/MediaLibrary.js +107 -0
  215. package/lib/module/library/MediaLibrary.js.map +1 -0
  216. package/lib/module/library/MediaLibraryScreen.js +2597 -0
  217. package/lib/module/library/MediaLibraryScreen.js.map +1 -0
  218. package/lib/module/library/components/AudioPreview.js +74 -0
  219. package/lib/module/library/components/AudioPreview.js.map +1 -0
  220. package/lib/module/library/components/DocumentPreview.js +331 -0
  221. package/lib/module/library/components/DocumentPreview.js.map +1 -0
  222. package/lib/module/library/components/ExpandableFab.js +343 -0
  223. package/lib/module/library/components/ExpandableFab.js.map +1 -0
  224. package/lib/module/library/components/FileTiles.js +251 -0
  225. package/lib/module/library/components/FileTiles.js.map +1 -0
  226. package/lib/module/library/components/ImagePreview.js +70 -0
  227. package/lib/module/library/components/ImagePreview.js.map +1 -0
  228. package/lib/module/library/components/MediaMetadataHeader.js +175 -0
  229. package/lib/module/library/components/MediaMetadataHeader.js.map +1 -0
  230. package/lib/module/library/components/RecordAudioScreen.js +816 -0
  231. package/lib/module/library/components/RecordAudioScreen.js.map +1 -0
  232. package/lib/module/library/components/VideoPreview.js +453 -0
  233. package/lib/module/library/components/VideoPreview.js.map +1 -0
  234. package/lib/module/library/components/ViewerCounter.js +55 -0
  235. package/lib/module/library/components/ViewerCounter.js.map +1 -0
  236. package/lib/module/library/compressionEstimate.js +507 -0
  237. package/lib/module/library/compressionEstimate.js.map +1 -0
  238. package/lib/module/library/fileMetadata.js +196 -0
  239. package/lib/module/library/fileMetadata.js.map +1 -0
  240. package/lib/module/library/index.js +42 -0
  241. package/lib/module/library/index.js.map +1 -0
  242. package/lib/module/library/libraryIconRegistry.js +69 -0
  243. package/lib/module/library/libraryIconRegistry.js.map +1 -0
  244. package/lib/module/library/libraryIcons.js +858 -0
  245. package/lib/module/library/libraryIcons.js.map +1 -0
  246. package/lib/module/library/localizedFormat.js +181 -0
  247. package/lib/module/library/localizedFormat.js.map +1 -0
  248. package/lib/module/library/palette.js +225 -0
  249. package/lib/module/library/palette.js.map +1 -0
  250. package/lib/module/library/responsive.js +53 -0
  251. package/lib/module/library/responsive.js.map +1 -0
  252. package/lib/module/locales.js +416 -0
  253. package/lib/module/locales.js.map +1 -0
  254. package/lib/module/localization.js +1064 -0
  255. package/lib/module/localization.js.map +1 -0
  256. package/lib/module/logger.js +20 -0
  257. package/lib/module/logger.js.map +1 -0
  258. package/lib/module/lowMemoryCache.js +206 -0
  259. package/lib/module/lowMemoryCache.js.map +1 -0
  260. package/lib/module/mediaHistory.js +33 -0
  261. package/lib/module/mediaHistory.js.map +1 -0
  262. package/lib/module/mediaStorageService.js +402 -0
  263. package/lib/module/mediaStorageService.js.map +1 -0
  264. package/lib/module/memory.js +79 -0
  265. package/lib/module/memory.js.map +1 -0
  266. package/lib/module/nativeActions.js +307 -0
  267. package/lib/module/nativeActions.js.map +1 -0
  268. package/lib/module/nativeComponentSupport.js +61 -0
  269. package/lib/module/nativeComponentSupport.js.map +1 -0
  270. package/lib/module/networkPerformance.js +24 -0
  271. package/lib/module/networkPerformance.js.map +1 -0
  272. package/lib/module/package.json +1 -0
  273. package/lib/module/performance.js +104 -0
  274. package/lib/module/performance.js.map +1 -0
  275. package/lib/module/performanceMonitor.js +155 -0
  276. package/lib/module/performanceMonitor.js.map +1 -0
  277. package/lib/module/permissions.js +370 -0
  278. package/lib/module/permissions.js.map +1 -0
  279. package/lib/module/rendering.js +40 -0
  280. package/lib/module/rendering.js.map +1 -0
  281. package/lib/module/security.js +18 -0
  282. package/lib/module/security.js.map +1 -0
  283. package/lib/module/state.js +266 -0
  284. package/lib/module/state.js.map +1 -0
  285. package/lib/module/storage.js +400 -0
  286. package/lib/module/storage.js.map +1 -0
  287. package/lib/module/theme.js +390 -0
  288. package/lib/module/theme.js.map +1 -0
  289. package/lib/module/types.js +4 -0
  290. package/lib/module/types.js.map +1 -0
  291. package/lib/module/utils.js +115 -0
  292. package/lib/module/utils.js.map +1 -0
  293. package/lib/module/validation.js +288 -0
  294. package/lib/module/validation.js.map +1 -0
  295. package/lib/typescript/package.json +1 -0
  296. package/lib/typescript/src/AudioPlayerContext.d.ts +27 -0
  297. package/lib/typescript/src/AudioPlayerContext.d.ts.map +1 -0
  298. package/lib/typescript/src/CameraPreview.d.ts +13 -0
  299. package/lib/typescript/src/CameraPreview.d.ts.map +1 -0
  300. package/lib/typescript/src/NativeAnimatedImageView.d.ts +33 -0
  301. package/lib/typescript/src/NativeAnimatedImageView.d.ts.map +1 -0
  302. package/lib/typescript/src/NativeAudioPlayerView.d.ts +12 -0
  303. package/lib/typescript/src/NativeAudioPlayerView.d.ts.map +1 -0
  304. package/lib/typescript/src/NativeBlurView.d.ts +12 -0
  305. package/lib/typescript/src/NativeBlurView.d.ts.map +1 -0
  306. package/lib/typescript/src/NativeCustomCamera.d.ts +167 -0
  307. package/lib/typescript/src/NativeCustomCamera.d.ts.map +1 -0
  308. package/lib/typescript/src/NativeCustomCamera.web.d.ts +47 -0
  309. package/lib/typescript/src/NativeCustomCamera.web.d.ts.map +1 -0
  310. package/lib/typescript/src/NativeCustomVideoView.d.ts +30 -0
  311. package/lib/typescript/src/NativeCustomVideoView.d.ts.map +1 -0
  312. package/lib/typescript/src/NativeDocumentPreviewView.d.ts +48 -0
  313. package/lib/typescript/src/NativeDocumentPreviewView.d.ts.map +1 -0
  314. package/lib/typescript/src/NativeMediaThumbnailView.d.ts +54 -0
  315. package/lib/typescript/src/NativeMediaThumbnailView.d.ts.map +1 -0
  316. package/lib/typescript/src/NativeSvgIcon.d.ts +25 -0
  317. package/lib/typescript/src/NativeSvgIcon.d.ts.map +1 -0
  318. package/lib/typescript/src/ResponsivePreviewContainer.d.ts +92 -0
  319. package/lib/typescript/src/ResponsivePreviewContainer.d.ts.map +1 -0
  320. package/lib/typescript/src/accessibility.d.ts +20 -0
  321. package/lib/typescript/src/accessibility.d.ts.map +1 -0
  322. package/lib/typescript/src/config.d.ts +145 -0
  323. package/lib/typescript/src/config.d.ts.map +1 -0
  324. package/lib/typescript/src/cpuOptimization.d.ts +63 -0
  325. package/lib/typescript/src/cpuOptimization.d.ts.map +1 -0
  326. package/lib/typescript/src/db/DatabaseManager.d.ts +48 -0
  327. package/lib/typescript/src/db/DatabaseManager.d.ts.map +1 -0
  328. package/lib/typescript/src/db/MediaMapper.d.ts +77 -0
  329. package/lib/typescript/src/db/MediaMapper.d.ts.map +1 -0
  330. package/lib/typescript/src/db/MediaRepository.d.ts +66 -0
  331. package/lib/typescript/src/db/MediaRepository.d.ts.map +1 -0
  332. package/lib/typescript/src/db/index.d.ts +23 -0
  333. package/lib/typescript/src/db/index.d.ts.map +1 -0
  334. package/lib/typescript/src/db/migrations.d.ts +31 -0
  335. package/lib/typescript/src/db/migrations.d.ts.map +1 -0
  336. package/lib/typescript/src/db/secureKey.d.ts +10 -0
  337. package/lib/typescript/src/db/secureKey.d.ts.map +1 -0
  338. package/lib/typescript/src/db/types.d.ts +115 -0
  339. package/lib/typescript/src/db/types.d.ts.map +1 -0
  340. package/lib/typescript/src/db/useMediaDatabase.d.ts +41 -0
  341. package/lib/typescript/src/db/useMediaDatabase.d.ts.map +1 -0
  342. package/lib/typescript/src/defaultIcons.d.ts +139 -0
  343. package/lib/typescript/src/defaultIcons.d.ts.map +1 -0
  344. package/lib/typescript/src/deviceCapabilities.d.ts +92 -0
  345. package/lib/typescript/src/deviceCapabilities.d.ts.map +1 -0
  346. package/lib/typescript/src/errors.d.ts +95 -0
  347. package/lib/typescript/src/errors.d.ts.map +1 -0
  348. package/lib/typescript/src/iconConfig.d.ts +176 -0
  349. package/lib/typescript/src/iconConfig.d.ts.map +1 -0
  350. package/lib/typescript/src/icons.d.ts +217 -0
  351. package/lib/typescript/src/icons.d.ts.map +1 -0
  352. package/lib/typescript/src/index.d.ts +104 -0
  353. package/lib/typescript/src/index.d.ts.map +1 -0
  354. package/lib/typescript/src/library/MediaLibrary.d.ts +57 -0
  355. package/lib/typescript/src/library/MediaLibrary.d.ts.map +1 -0
  356. package/lib/typescript/src/library/MediaLibraryScreen.d.ts +51 -0
  357. package/lib/typescript/src/library/MediaLibraryScreen.d.ts.map +1 -0
  358. package/lib/typescript/src/library/components/AudioPreview.d.ts +6 -0
  359. package/lib/typescript/src/library/components/AudioPreview.d.ts.map +1 -0
  360. package/lib/typescript/src/library/components/DocumentPreview.d.ts +10 -0
  361. package/lib/typescript/src/library/components/DocumentPreview.d.ts.map +1 -0
  362. package/lib/typescript/src/library/components/ExpandableFab.d.ts +39 -0
  363. package/lib/typescript/src/library/components/ExpandableFab.d.ts.map +1 -0
  364. package/lib/typescript/src/library/components/FileTiles.d.ts +8 -0
  365. package/lib/typescript/src/library/components/FileTiles.d.ts.map +1 -0
  366. package/lib/typescript/src/library/components/ImagePreview.d.ts +5 -0
  367. package/lib/typescript/src/library/components/ImagePreview.d.ts.map +1 -0
  368. package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts +16 -0
  369. package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts.map +1 -0
  370. package/lib/typescript/src/library/components/RecordAudioScreen.d.ts +8 -0
  371. package/lib/typescript/src/library/components/RecordAudioScreen.d.ts.map +1 -0
  372. package/lib/typescript/src/library/components/VideoPreview.d.ts +20 -0
  373. package/lib/typescript/src/library/components/VideoPreview.d.ts.map +1 -0
  374. package/lib/typescript/src/library/components/ViewerCounter.d.ts +13 -0
  375. package/lib/typescript/src/library/components/ViewerCounter.d.ts.map +1 -0
  376. package/lib/typescript/src/library/compressionEstimate.d.ts +313 -0
  377. package/lib/typescript/src/library/compressionEstimate.d.ts.map +1 -0
  378. package/lib/typescript/src/library/fileMetadata.d.ts +33 -0
  379. package/lib/typescript/src/library/fileMetadata.d.ts.map +1 -0
  380. package/lib/typescript/src/library/index.d.ts +40 -0
  381. package/lib/typescript/src/library/index.d.ts.map +1 -0
  382. package/lib/typescript/src/library/libraryIconRegistry.d.ts +35 -0
  383. package/lib/typescript/src/library/libraryIconRegistry.d.ts.map +1 -0
  384. package/lib/typescript/src/library/libraryIcons.d.ts +85 -0
  385. package/lib/typescript/src/library/libraryIcons.d.ts.map +1 -0
  386. package/lib/typescript/src/library/localizedFormat.d.ts +49 -0
  387. package/lib/typescript/src/library/localizedFormat.d.ts.map +1 -0
  388. package/lib/typescript/src/library/palette.d.ts +104 -0
  389. package/lib/typescript/src/library/palette.d.ts.map +1 -0
  390. package/lib/typescript/src/library/responsive.d.ts +15 -0
  391. package/lib/typescript/src/library/responsive.d.ts.map +1 -0
  392. package/lib/typescript/src/locales.d.ts +103 -0
  393. package/lib/typescript/src/locales.d.ts.map +1 -0
  394. package/lib/typescript/src/localization.d.ts +1051 -0
  395. package/lib/typescript/src/localization.d.ts.map +1 -0
  396. package/lib/typescript/src/logger.d.ts +4 -0
  397. package/lib/typescript/src/logger.d.ts.map +1 -0
  398. package/lib/typescript/src/lowMemoryCache.d.ts +64 -0
  399. package/lib/typescript/src/lowMemoryCache.d.ts.map +1 -0
  400. package/lib/typescript/src/mediaHistory.d.ts +3 -0
  401. package/lib/typescript/src/mediaHistory.d.ts.map +1 -0
  402. package/lib/typescript/src/mediaStorageService.d.ts +155 -0
  403. package/lib/typescript/src/mediaStorageService.d.ts.map +1 -0
  404. package/lib/typescript/src/memory.d.ts +21 -0
  405. package/lib/typescript/src/memory.d.ts.map +1 -0
  406. package/lib/typescript/src/nativeActions.d.ts +174 -0
  407. package/lib/typescript/src/nativeActions.d.ts.map +1 -0
  408. package/lib/typescript/src/nativeComponentSupport.d.ts +30 -0
  409. package/lib/typescript/src/nativeComponentSupport.d.ts.map +1 -0
  410. package/lib/typescript/src/networkPerformance.d.ts +12 -0
  411. package/lib/typescript/src/networkPerformance.d.ts.map +1 -0
  412. package/lib/typescript/src/performance.d.ts +32 -0
  413. package/lib/typescript/src/performance.d.ts.map +1 -0
  414. package/lib/typescript/src/performanceMonitor.d.ts +45 -0
  415. package/lib/typescript/src/performanceMonitor.d.ts.map +1 -0
  416. package/lib/typescript/src/permissions.d.ts +132 -0
  417. package/lib/typescript/src/permissions.d.ts.map +1 -0
  418. package/lib/typescript/src/rendering.d.ts +9 -0
  419. package/lib/typescript/src/rendering.d.ts.map +1 -0
  420. package/lib/typescript/src/security.d.ts +6 -0
  421. package/lib/typescript/src/security.d.ts.map +1 -0
  422. package/lib/typescript/src/state.d.ts +102 -0
  423. package/lib/typescript/src/state.d.ts.map +1 -0
  424. package/lib/typescript/src/storage.d.ts +117 -0
  425. package/lib/typescript/src/storage.d.ts.map +1 -0
  426. package/lib/typescript/src/theme.d.ts +15 -0
  427. package/lib/typescript/src/theme.d.ts.map +1 -0
  428. package/lib/typescript/src/types.d.ts +802 -0
  429. package/lib/typescript/src/types.d.ts.map +1 -0
  430. package/lib/typescript/src/utils.d.ts +50 -0
  431. package/lib/typescript/src/utils.d.ts.map +1 -0
  432. package/lib/typescript/src/validation.d.ts +52 -0
  433. package/lib/typescript/src/validation.d.ts.map +1 -0
  434. package/package.json +204 -0
  435. package/react-native.config.js +17 -0
  436. package/src/AudioPlayerContext.tsx +220 -0
  437. package/src/CameraPreview.tsx +352 -0
  438. package/src/NativeAnimatedImageView.tsx +71 -0
  439. package/src/NativeAudioPlayerView.tsx +39 -0
  440. package/src/NativeBlurView.tsx +40 -0
  441. package/src/NativeCustomCamera.ts +305 -0
  442. package/src/NativeCustomCamera.web.ts +192 -0
  443. package/src/NativeCustomVideoView.ts +30 -0
  444. package/src/NativeDocumentPreviewView.tsx +196 -0
  445. package/src/NativeMediaThumbnailView.tsx +167 -0
  446. package/src/NativeSvgIcon.tsx +46 -0
  447. package/src/ResponsivePreviewContainer.tsx +227 -0
  448. package/src/accessibility.ts +80 -0
  449. package/src/config.ts +406 -0
  450. package/src/cpuOptimization.ts +365 -0
  451. package/src/db/DatabaseManager.ts +212 -0
  452. package/src/db/MediaMapper.ts +377 -0
  453. package/src/db/MediaRepository.ts +313 -0
  454. package/src/db/index.ts +73 -0
  455. package/src/db/migrations.ts +222 -0
  456. package/src/db/react-native-sqlcipher.d.ts +76 -0
  457. package/src/db/secureKey.ts +100 -0
  458. package/src/db/types.ts +123 -0
  459. package/src/db/useMediaDatabase.ts +191 -0
  460. package/src/defaultIcons.tsx +2390 -0
  461. package/src/deviceCapabilities.ts +438 -0
  462. package/src/errors.ts +350 -0
  463. package/src/iconConfig.tsx +962 -0
  464. package/src/icons.tsx +788 -0
  465. package/src/index.tsx +763 -0
  466. package/src/jest-globals.d.ts +9 -0
  467. package/src/library/MediaLibrary.tsx +141 -0
  468. package/src/library/MediaLibraryScreen.tsx +3003 -0
  469. package/src/library/components/AudioPreview.tsx +73 -0
  470. package/src/library/components/DocumentPreview.tsx +361 -0
  471. package/src/library/components/ExpandableFab.tsx +342 -0
  472. package/src/library/components/FileTiles.tsx +252 -0
  473. package/src/library/components/ImagePreview.tsx +72 -0
  474. package/src/library/components/MediaMetadataHeader.tsx +208 -0
  475. package/src/library/components/RecordAudioScreen.tsx +845 -0
  476. package/src/library/components/VideoPreview.tsx +478 -0
  477. package/src/library/components/ViewerCounter.tsx +71 -0
  478. package/src/library/compressionEstimate.ts +662 -0
  479. package/src/library/fileMetadata.ts +212 -0
  480. package/src/library/index.ts +66 -0
  481. package/src/library/libraryIconRegistry.tsx +86 -0
  482. package/src/library/libraryIcons.tsx +928 -0
  483. package/src/library/localizedFormat.ts +207 -0
  484. package/src/library/palette.ts +281 -0
  485. package/src/library/responsive.ts +49 -0
  486. package/src/locales.ts +381 -0
  487. package/src/localization.ts +1947 -0
  488. package/src/logger.ts +20 -0
  489. package/src/lowMemoryCache.ts +218 -0
  490. package/src/mediaHistory.ts +42 -0
  491. package/src/mediaStorageService.ts +546 -0
  492. package/src/memory.ts +102 -0
  493. package/src/nativeActions.ts +422 -0
  494. package/src/nativeComponentSupport.ts +60 -0
  495. package/src/networkPerformance.ts +30 -0
  496. package/src/performance.ts +137 -0
  497. package/src/performanceMonitor.ts +219 -0
  498. package/src/permissions.ts +403 -0
  499. package/src/rendering.ts +47 -0
  500. package/src/security.ts +19 -0
  501. package/src/state.ts +333 -0
  502. package/src/storage.ts +453 -0
  503. package/src/theme.tsx +467 -0
  504. package/src/types.ts +946 -0
  505. package/src/utils.ts +177 -0
  506. package/src/validation.ts +372 -0
@@ -0,0 +1,479 @@
1
+ package com.customcamera
2
+
3
+ import android.content.Context
4
+ import android.graphics.Color
5
+ import android.graphics.drawable.Drawable
6
+ import org.json.JSONObject
7
+
8
+ /**
9
+ * Relative-luminance dark test for an arbitrary ARGB color (< 0.5 = dark). Mirrors the JS shell's
10
+ * `luminance()`/`isDarkTheme()` in palette.ts so native and React Native agree on the light/dark
11
+ * split, and lets callers test a surface color that isn't the window `background` (e.g. the barcode
12
+ * scanner's own backdrop) to pick a matching status-bar icon appearance.
13
+ */
14
+ fun isColorDark(color: Int): Boolean =
15
+ (0.2126 * Color.red(color) +
16
+ 0.7152 * Color.green(color) +
17
+ 0.0722 * Color.blue(color)) / 255.0 < 0.5
18
+
19
+ data class CameraThemeColors(
20
+ val background: Int,
21
+ val surface: Int,
22
+ val surfaceMuted: Int,
23
+ val surfaceElevated: Int,
24
+ val primary: Int,
25
+ val primaryContrast: Int,
26
+ val text: Int,
27
+ val textMuted: Int,
28
+ val textSecondary: Int,
29
+ val border: Int,
30
+ val borderStrong: Int,
31
+ val overlay: Int,
32
+ val overlayStrong: Int,
33
+ val accent: Int,
34
+ val success: Int,
35
+ val error: Int,
36
+ val warning: Int
37
+ ) {
38
+ /**
39
+ * Whether the active theme reads as dark, from the relative luminance of the
40
+ * window `background` (< 0.5 = dark). Mirrors the JS shell's `isDarkTheme()`
41
+ * in palette.ts so native and React Native agree on the light/dark split. Lets
42
+ * native chrome branch a token (e.g. a status-bar icon appearance) without the
43
+ * host having to send an explicit flag.
44
+ */
45
+ val isDark: Boolean
46
+ get() = isColorDark(background)
47
+ }
48
+
49
+ data class CameraThemeTypography(
50
+ val fontFamily: String,
51
+ val headingSize: Float,
52
+ val bodySize: Float,
53
+ val captionSize: Float,
54
+ val buttonSize: Float
55
+ )
56
+
57
+ data class CameraThemeSpacing(
58
+ val xs: Int,
59
+ val sm: Int,
60
+ val md: Int,
61
+ val lg: Int,
62
+ val xl: Int,
63
+ val xxl: Int
64
+ )
65
+
66
+ data class CameraThemeBorderRadius(
67
+ val sm: Float,
68
+ val md: Float,
69
+ val lg: Float,
70
+ val xl: Float,
71
+ val pill: Float,
72
+ val circle: Float
73
+ )
74
+
75
+ /** Per-icon appearance override coming from the JS `icons` config section. */
76
+ data class CameraIconStyle(
77
+ val tintColor: Int?,
78
+ val sizeDp: Int?,
79
+ val resourceName: String?,
80
+ val svg: String?
81
+ )
82
+
83
+ /**
84
+ * White-label extras beyond the visual theme: icon tints/sizes/overrides,
85
+ * animation durations, structural dimension overrides, and upload-notification
86
+ * appearance. Populated from the `cameraConfig` JSON pushed by
87
+ * `setCameraConfig`; every accessor falls back to the previously hardcoded
88
+ * value so an absent config reproduces the stock UI exactly.
89
+ */
90
+ class CameraConfig(
91
+ private val globalIconTint: Int?,
92
+ private val iconOverrides: Map<String, CameraIconStyle>,
93
+ private val animationDurations: Map<String, Long>,
94
+ private val animationsDisabled: Boolean,
95
+ private val dimensionOverrides: Map<String, Int>,
96
+ val notifications: NotificationConfig,
97
+ val gif: GifConfig
98
+ ) {
99
+ data class NotificationConfig(
100
+ val progressChannelId: String,
101
+ val progressChannelName: String?,
102
+ val resultChannelId: String,
103
+ val resultChannelName: String?,
104
+ val accentColor: Int?,
105
+ val smallIconResourceName: String?
106
+ )
107
+
108
+ /**
109
+ * GIF picker configuration. [provider] selects the GIF service ("giphy" is the default,
110
+ * "tenor" is also supported); [apiKey] is that provider's API key. When [apiKey] is
111
+ * null/blank the picker shows a dedicated "not configured" state instead of making any
112
+ * network calls. Delivered under a top-level `gif` object in the `setCameraConfig` JSON
113
+ * (Channel B) so the secret is never passed through per-launch Intent extras.
114
+ */
115
+ data class GifConfig(
116
+ val provider: String?,
117
+ val apiKey: String?
118
+ ) {
119
+ val isConfigured: Boolean get() = !apiKey.isNullOrBlank()
120
+ }
121
+
122
+ /** Tint for an icon (per-icon override wins over the global tint), or null for as-shipped. */
123
+ fun iconTint(name: String): Int? = iconOverrides[name]?.tintColor ?: globalIconTint
124
+
125
+ /** Fixed dp size for an icon, or null to keep the caller's responsive size. */
126
+ fun iconSizeDp(name: String): Int? = iconOverrides[name]?.sizeDp
127
+
128
+ /**
129
+ * Resolve the drawable for an icon: a host-app override drawable when
130
+ * `resourceName` is configured AND resolvable, otherwise the built-in
131
+ * resource. Tint is applied by the caller via [iconTint].
132
+ */
133
+ fun iconRes(context: Context, name: String, builtinRes: Int): Int {
134
+ val overrideName = iconOverrides[name]?.resourceName ?: return builtinRes
135
+ val resolved = context.resources.getIdentifier(
136
+ overrideName, "drawable", context.packageName
137
+ )
138
+ return if (resolved != 0) resolved else builtinRes
139
+ }
140
+
141
+ /** Resolve an SVG first, then a host drawable resource, then the built-in drawable. */
142
+ fun iconDrawable(context: Context, name: String, builtinRes: Int): Drawable {
143
+ val override = iconOverrides[name]
144
+ val tint = override?.tintColor ?: globalIconTint
145
+ val svg = override?.svg
146
+ if (!svg.isNullOrBlank()) {
147
+ SvgDrawable.from(svg, tint)?.let { return it }
148
+ }
149
+ val resource = iconRes(context, name, builtinRes)
150
+ return requireNotNull(androidx.core.content.ContextCompat.getDrawable(context, resource))
151
+ }
152
+
153
+ /**
154
+ * The colour filter to apply to [drawable] (the result of [iconDrawable] for
155
+ * icon [name]) so both stock and host-provided artwork look right:
156
+ * - a configured per-icon / global tint always wins;
157
+ * - otherwise a host-provided SVG keeps its OWN colours (null → the caller
158
+ * must clear any filter), because a solid SRC_IN filter would flatten a
159
+ * multi-colour SVG to one tone (and its `currentColor` was already resolved
160
+ * against the config tint inside [SvgDrawable.from]);
161
+ * - otherwise a plain built-in / resource glyph gets [defaultTint] so it
162
+ * still matches the surrounding chrome (e.g. the editor's white icons).
163
+ *
164
+ * Pairs with [iconDrawable]: `val d = iconDrawable(...); view.setImageDrawable(d);
165
+ * iconTintFor(name, d, default)?.let { view.setColorFilter(it) } ?: view.clearColorFilter()`.
166
+ */
167
+ fun iconTintFor(name: String, drawable: Drawable, defaultTint: Int?): Int? {
168
+ iconTint(name)?.let { return it }
169
+ return if (drawable is SvgDrawable) null else defaultTint
170
+ }
171
+
172
+ /** Animation duration in ms; 0 when animations are disabled. */
173
+ fun anim(key: String, defaultMs: Long): Long =
174
+ if (animationsDisabled) 0L else animationDurations[key] ?: defaultMs
175
+
176
+ /** Structural dimension in dp — configured override or the stock default. */
177
+ fun dim(key: String, defaultDp: Int): Int = dimensionOverrides[key] ?: defaultDp
178
+
179
+ /** Whether a fixed override exists for this dimension (vs. responsive stock sizing). */
180
+ fun hasDim(key: String): Boolean = dimensionOverrides.containsKey(key)
181
+
182
+ companion object {
183
+ val DEFAULT = CameraConfig(
184
+ globalIconTint = null,
185
+ iconOverrides = emptyMap(),
186
+ animationDurations = emptyMap(),
187
+ animationsDisabled = false,
188
+ dimensionOverrides = emptyMap(),
189
+ notifications = NotificationConfig(
190
+ progressChannelId = "UploadServiceChannel",
191
+ progressChannelName = null,
192
+ resultChannelId = "UploadResultChannel",
193
+ resultChannelName = null,
194
+ accentColor = null,
195
+ smallIconResourceName = null
196
+ ),
197
+ gif = GifConfig(provider = null, apiKey = null)
198
+ )
199
+ }
200
+ }
201
+
202
+ class CameraTheme(
203
+ val colors: CameraThemeColors,
204
+ val typography: CameraThemeTypography,
205
+ val spacing: CameraThemeSpacing,
206
+ val borderRadius: CameraThemeBorderRadius,
207
+ val config: CameraConfig = CameraConfig.DEFAULT,
208
+ private val componentOverrides: Map<String, Map<String, String>> = emptyMap()
209
+ ) {
210
+ /**
211
+ * Component-scoped color from the theme's `components` JSON section
212
+ * (e.g. `components.mediaGrid.selectionAccent`). The inline default IS the
213
+ * stock value, so unthemed builds render exactly as before.
214
+ */
215
+ fun componentColor(component: String, key: String, default: Int): Int {
216
+ val raw = componentOverrides[component]?.get(key) ?: return default
217
+ return parseColor(raw, default)
218
+ }
219
+
220
+ /** Component-scoped numeric value (dp, sp, alpha…) from the theme JSON. */
221
+ fun componentValue(component: String, key: String, default: Float): Float =
222
+ componentOverrides[component]?.get(key)?.toFloatOrNull() ?: default
223
+
224
+ companion object {
225
+ @Volatile
226
+ private var cached: CameraTheme? = null
227
+
228
+ /**
229
+ * Process-wide cached theme for views/adapters that have no Activity
230
+ * holding a theme instance. Screens re-load on launch (the Activities
231
+ * use their own `by lazy` theme), so cache staleness within a running
232
+ * screen matches the pre-existing behavior.
233
+ */
234
+ fun get(context: Context): CameraTheme =
235
+ cached ?: load(context.applicationContext).also { cached = it }
236
+
237
+ /** Drop the cache so the next [get] re-reads SharedPreferences. */
238
+ fun invalidate() {
239
+ cached = null
240
+ }
241
+
242
+ private fun parseColor(colorString: String?, defaultColor: Int): Int {
243
+ if (colorString == null) return defaultColor
244
+ return try {
245
+ if (colorString.startsWith("rgba(")) {
246
+ val parts = colorString.substring(5, colorString.length - 1).split(",")
247
+ val r = parts[0].trim().toInt()
248
+ val g = parts[1].trim().toInt()
249
+ val b = parts[2].trim().toInt()
250
+ val a = (parts[3].trim().toFloat() * 255).toInt()
251
+ Color.argb(a, r, g, b)
252
+ } else if (colorString.startsWith("rgb(")) {
253
+ val parts = colorString.substring(4, colorString.length - 1).split(",")
254
+ val r = parts[0].trim().toInt()
255
+ val g = parts[1].trim().toInt()
256
+ val b = parts[2].trim().toInt()
257
+ Color.rgb(r, g, b)
258
+ } else {
259
+ Color.parseColor(colorString)
260
+ }
261
+ } catch (e: Exception) {
262
+ defaultColor
263
+ }
264
+ }
265
+
266
+ /** Parse a color string, or null when empty/unparseable (= keep stock appearance). */
267
+ private fun tryParseColor(colorString: String?): Int? {
268
+ if (colorString.isNullOrEmpty()) return null
269
+ val sentinel = 1 // improbable parsed color: fully transparent near-black
270
+ val parsed = parseColor(colorString, sentinel)
271
+ return if (parsed == sentinel && colorString != "#00000001") null else parsed
272
+ }
273
+
274
+ fun load(context: Context): CameraTheme {
275
+ val prefs = context.getSharedPreferences("CameraSettings", Context.MODE_PRIVATE)
276
+ val jsonString = prefs.getString("cameraTheme", null)
277
+
278
+ // Default palette (Dark)
279
+ var colors = CameraThemeColors(
280
+ background = Color.parseColor("#000000"),
281
+ surface = Color.parseColor("#111827"),
282
+ surfaceMuted = Color.parseColor("#1F2937"),
283
+ surfaceElevated = Color.parseColor("#FFFFFF"),
284
+ primary = Color.parseColor("#4A56FF"),
285
+ primaryContrast = Color.parseColor("#FFFFFF"),
286
+ text = Color.parseColor("#FFFFFF"),
287
+ textMuted = Color.parseColor("#94A3B8"),
288
+ textSecondary = Color.parseColor("#CBD5E1"),
289
+ border = Color.parseColor("#1FFFFFFF"),
290
+ borderStrong = Color.parseColor("#33FFFFFF"),
291
+ overlay = Color.parseColor("#73000000"),
292
+ overlayStrong = Color.parseColor("#AD000000"),
293
+ accent = Color.parseColor("#4A56FF"),
294
+ success = Color.parseColor("#34D399"),
295
+ error = Color.parseColor("#FF5B5B"),
296
+ warning = Color.parseColor("#FBBF24")
297
+ )
298
+
299
+ var typography = CameraThemeTypography("System", 18f, 16f, 13f, 14f)
300
+ var spacing = CameraThemeSpacing(4, 8, 12, 16, 20, 24)
301
+ var borderRadius = CameraThemeBorderRadius(6f, 12f, 16f, 20f, 999f, 999f)
302
+
303
+ if (jsonString != null && jsonString.startsWith("{")) {
304
+ try {
305
+ val root = JSONObject(jsonString)
306
+ val colorsObj = root.optJSONObject("colors")
307
+ if (colorsObj != null) {
308
+ colors = CameraThemeColors(
309
+ background = parseColor(colorsObj.optString("background"), colors.background),
310
+ surface = parseColor(colorsObj.optString("surface"), colors.surface),
311
+ surfaceMuted = parseColor(colorsObj.optString("surfaceMuted"), colors.surfaceMuted),
312
+ surfaceElevated = parseColor(colorsObj.optString("surfaceElevated"), colors.surfaceElevated),
313
+ primary = parseColor(colorsObj.optString("primary"), colors.primary),
314
+ primaryContrast = parseColor(colorsObj.optString("primaryContrast"), colors.primaryContrast),
315
+ text = parseColor(colorsObj.optString("text"), colors.text),
316
+ textMuted = parseColor(colorsObj.optString("textMuted"), colors.textMuted),
317
+ textSecondary = parseColor(colorsObj.optString("textSecondary"), colors.textSecondary),
318
+ border = parseColor(colorsObj.optString("border"), colors.border),
319
+ borderStrong = parseColor(colorsObj.optString("borderStrong"), colors.borderStrong),
320
+ overlay = parseColor(colorsObj.optString("overlay"), colors.overlay),
321
+ overlayStrong = parseColor(colorsObj.optString("overlayStrong"), colors.overlayStrong),
322
+ accent = parseColor(colorsObj.optString("accent"), colors.accent),
323
+ success = parseColor(colorsObj.optString("success"), colors.success),
324
+ error = parseColor(colorsObj.optString("error"), colors.error),
325
+ warning = parseColor(colorsObj.optString("warning"), colors.warning)
326
+ )
327
+ }
328
+ val typeObj = root.optJSONObject("typography")
329
+ if (typeObj != null) {
330
+ typography = CameraThemeTypography(
331
+ fontFamily = typeObj.optString("fontFamily", typography.fontFamily),
332
+ headingSize = typeObj.optDouble("headingSize", typography.headingSize.toDouble()).toFloat(),
333
+ bodySize = typeObj.optDouble("bodySize", typography.bodySize.toDouble()).toFloat(),
334
+ captionSize = typeObj.optDouble("captionSize", typography.captionSize.toDouble()).toFloat(),
335
+ buttonSize = typeObj.optDouble("buttonSize", typography.buttonSize.toDouble()).toFloat()
336
+ )
337
+ }
338
+ val spaceObj = root.optJSONObject("spacing")
339
+ if (spaceObj != null) {
340
+ spacing = CameraThemeSpacing(
341
+ xs = spaceObj.optInt("xs", spacing.xs),
342
+ sm = spaceObj.optInt("sm", spacing.sm),
343
+ md = spaceObj.optInt("md", spacing.md),
344
+ lg = spaceObj.optInt("lg", spacing.lg),
345
+ xl = spaceObj.optInt("xl", spacing.xl),
346
+ xxl = spaceObj.optInt("xxl", spacing.xxl)
347
+ )
348
+ }
349
+ val borderObj = root.optJSONObject("borderRadius")
350
+ if (borderObj != null) {
351
+ borderRadius = CameraThemeBorderRadius(
352
+ sm = borderObj.optDouble("sm", borderRadius.sm.toDouble()).toFloat(),
353
+ md = borderObj.optDouble("md", borderRadius.md.toDouble()).toFloat(),
354
+ lg = borderObj.optDouble("lg", borderRadius.lg.toDouble()).toFloat(),
355
+ xl = borderObj.optDouble("xl", borderRadius.xl.toDouble()).toFloat(),
356
+ pill = borderObj.optDouble("pill", borderRadius.pill.toDouble()).toFloat(),
357
+ circle = borderObj.optDouble("circle", borderRadius.circle.toDouble()).toFloat()
358
+ )
359
+ }
360
+ } catch (e: Exception) {
361
+ // Fallback to default on parse error
362
+ }
363
+ }
364
+
365
+ // Flatten the theme's `components` section into per-component
366
+ // key→string maps consumed via componentColor()/componentValue().
367
+ val componentOverrides = mutableMapOf<String, Map<String, String>>()
368
+ if (jsonString != null && jsonString.startsWith("{")) {
369
+ try {
370
+ JSONObject(jsonString).optJSONObject("components")?.let { comps ->
371
+ for (compName in comps.keys()) {
372
+ val comp = comps.optJSONObject(compName) ?: continue
373
+ val entries = mutableMapOf<String, String>()
374
+ for (key in comp.keys()) {
375
+ comp.opt(key)?.let { value ->
376
+ if (value !is JSONObject) entries[key] = value.toString()
377
+ }
378
+ }
379
+ componentOverrides[compName] = entries
380
+ }
381
+ }
382
+ } catch (e: Exception) {
383
+ // Ignore malformed components; scoped lookups fall back to defaults
384
+ }
385
+ }
386
+
387
+ return CameraTheme(
388
+ colors, typography, spacing, borderRadius,
389
+ loadConfig(context), componentOverrides
390
+ )
391
+ }
392
+
393
+ /**
394
+ * Parse the white-label extras JSON stored by `setCameraConfig`. Any
395
+ * missing/malformed section degrades to [CameraConfig.DEFAULT] values.
396
+ */
397
+ fun loadConfig(context: Context): CameraConfig {
398
+ val prefs = context.getSharedPreferences("CameraSettings", Context.MODE_PRIVATE)
399
+ val jsonString = prefs.getString("cameraConfig", null)
400
+ ?: return CameraConfig.DEFAULT
401
+ if (!jsonString.startsWith("{")) return CameraConfig.DEFAULT
402
+
403
+ return try {
404
+ val root = JSONObject(jsonString)
405
+
406
+ var globalIconTint: Int? = null
407
+ val iconOverrides = mutableMapOf<String, CameraIconStyle>()
408
+ root.optJSONObject("icons")?.let { icons ->
409
+ globalIconTint = tryParseColor(icons.optString("tintColor"))
410
+ icons.optJSONObject("overrides")?.let { overrides ->
411
+ for (name in overrides.keys()) {
412
+ val o = overrides.optJSONObject(name) ?: continue
413
+ iconOverrides[name] = CameraIconStyle(
414
+ tintColor = tryParseColor(o.optString("tintColor")),
415
+ sizeDp = if (o.has("size")) o.optInt("size") else null,
416
+ resourceName = o.optString("resourceName")
417
+ .takeIf { it.isNotEmpty() },
418
+ svg = o.optString("svg").takeIf { it.isNotEmpty() }
419
+ )
420
+ }
421
+ }
422
+ }
423
+
424
+ val animationDurations = mutableMapOf<String, Long>()
425
+ var animationsDisabled = false
426
+ root.optJSONObject("animations")?.let { anims ->
427
+ animationsDisabled = anims.optBoolean("disableAnimations", false)
428
+ for (key in anims.keys()) {
429
+ if (key == "disableAnimations") continue
430
+ animationDurations[key] = anims.optLong(key)
431
+ }
432
+ }
433
+
434
+ val dimensionOverrides = mutableMapOf<String, Int>()
435
+ root.optJSONObject("dimensions")?.let { dims ->
436
+ for (key in dims.keys()) {
437
+ dimensionOverrides[key] = dims.optInt(key)
438
+ }
439
+ }
440
+
441
+ val defaults = CameraConfig.DEFAULT.notifications
442
+ val notifications = root.optJSONObject("notifications")?.let { n ->
443
+ CameraConfig.NotificationConfig(
444
+ progressChannelId = n.optString("progressChannelId")
445
+ .takeIf { it.isNotEmpty() } ?: defaults.progressChannelId,
446
+ progressChannelName = n.optString("progressChannelName")
447
+ .takeIf { it.isNotEmpty() },
448
+ resultChannelId = n.optString("resultChannelId")
449
+ .takeIf { it.isNotEmpty() } ?: defaults.resultChannelId,
450
+ resultChannelName = n.optString("resultChannelName")
451
+ .takeIf { it.isNotEmpty() },
452
+ accentColor = tryParseColor(n.optString("accentColor")),
453
+ smallIconResourceName = n.optString("smallIconResourceName")
454
+ .takeIf { it.isNotEmpty() }
455
+ )
456
+ } ?: defaults
457
+
458
+ val gif = root.optJSONObject("gif")?.let { g ->
459
+ CameraConfig.GifConfig(
460
+ provider = g.optString("provider").takeIf { it.isNotEmpty() },
461
+ apiKey = g.optString("apiKey").takeIf { it.isNotEmpty() }
462
+ )
463
+ } ?: CameraConfig.DEFAULT.gif
464
+
465
+ CameraConfig(
466
+ globalIconTint = globalIconTint,
467
+ iconOverrides = iconOverrides,
468
+ animationDurations = animationDurations,
469
+ animationsDisabled = animationsDisabled,
470
+ dimensionOverrides = dimensionOverrides,
471
+ notifications = notifications,
472
+ gif = gif
473
+ )
474
+ } catch (e: Exception) {
475
+ CameraConfig.DEFAULT
476
+ }
477
+ }
478
+ }
479
+ }