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,435 @@
1
+ package com.customcamera.gif
2
+
3
+ /**
4
+ * NeuQuant Neural-Net image quantization algorithm.
5
+ *
6
+ * Faithful Kotlin port of Anthony Dekker's NeuQuant (1994), as adapted to Java by Kevin Weiner
7
+ * (FM Software, 12/00) for the widely used [AnimatedGifEncoder]. The algorithm trains a
8
+ * 256-neuron one-dimensional self-organizing map on a sample of the image's BGR pixels and then
9
+ * uses the trained network as a 256-colour lookup table.
10
+ *
11
+ * Reference: A. Dekker, "Kohonen neural networks for optimal colour quantization",
12
+ * Network: Computation in Neural Systems, Vol. 5 (1994) pp 351-367.
13
+ *
14
+ * Original copyright (c) 1994 Anthony Dekker, released for unrestricted use provided this notice
15
+ * remains intact. This is a syntax-only translation to idiomatic Kotlin; the numeric behaviour is
16
+ * intended to be byte-for-byte equivalent to the canonical Java implementation.
17
+ *
18
+ * @param thepic the input image as a BGR byte array (3 bytes per pixel, blue first)
19
+ * @param len the usable length of [thepic] (H * W * 3)
20
+ * @param sample the sampling factor in the range 1..30 (1 = best quality / slowest)
21
+ */
22
+ class NeuQuant(thepic: ByteArray, len: Int, sample: Int) {
23
+
24
+ companion object {
25
+ /** Number of colours (neurons) in the network. */
26
+ private val netsize = 256
27
+
28
+ /* Four primes near 500 - assume no image has a length so large that it is */
29
+ /* divisible by all four of them. */
30
+ private val prime1 = 499
31
+ private val prime2 = 491
32
+ private val prime3 = 487
33
+ private val prime4 = 503
34
+
35
+ /** Minimum size for the input image before the sampling factor is forced to 1. */
36
+ private val minpicturebytes = 3 * prime4
37
+
38
+ /* Network definitions. */
39
+ private val maxnetpos = netsize - 1
40
+ private val netbiasshift = 4 // bias for colour values
41
+ private val ncycles = 100 // number of learning cycles
42
+
43
+ /* Definitions for freq and bias. */
44
+ private val intbiasshift = 16 // bias for fractions
45
+ private val intbias = 1 shl intbiasshift
46
+ private val gammashift = 10 // gamma = 1024
47
+ private val gamma = 1 shl gammashift
48
+ private val betashift = 10
49
+ private val beta = intbias shr betashift // beta = 1/1024
50
+ private val betagamma = intbias shl (gammashift - betashift)
51
+
52
+ /* Definitions for the decreasing radius factor. */
53
+ private val initrad = netsize shr 3 // for 256 cols, radius starts at 32.0
54
+ private val radiusbiasshift = 6 // at 32.0 biased by 6 bits
55
+ private val radiusbias = 1 shl radiusbiasshift
56
+ private val initradius = initrad * radiusbias // and decreases by a
57
+ private val radiusdec = 30 // factor of 1/30 each cycle
58
+
59
+ /* Definitions for the decreasing alpha factor. */
60
+ private val alphabiasshift = 10 // alpha starts at 1.0
61
+ private val initalpha = 1 shl alphabiasshift
62
+
63
+ /* radbias and alpharadbias are used for the radpower calculation. */
64
+ private val radbiasshift = 8
65
+ private val radbias = 1 shl radbiasshift
66
+ private val alpharadbshift = alphabiasshift + radbiasshift
67
+ private val alpharadbias = 1 shl alpharadbshift
68
+ }
69
+
70
+ /** Learning rate decrement, biased by 10 bits. */
71
+ private var alphadec = 0
72
+
73
+ /** The input image itself (BGR bytes). */
74
+ private val thepicture: ByteArray = thepic
75
+
76
+ /** lengthcount = H * W * 3. */
77
+ private val lengthcount: Int = len
78
+
79
+ /** Sampling factor, 1..30. */
80
+ private var samplefac: Int = sample
81
+
82
+ /** The network itself: netsize entries of [b, g, r, colourIndex]. */
83
+ private val network: Array<IntArray> = Array(netsize) { IntArray(4) }
84
+
85
+ /** For network lookup - really 256 entries. */
86
+ private val netindex = IntArray(256)
87
+
88
+ /** Bias array for learning. */
89
+ private val bias = IntArray(netsize)
90
+
91
+ /** Frequency array for learning. */
92
+ private val freq = IntArray(netsize)
93
+
94
+ /** Precomputed radpower for the neighbourhood function. */
95
+ private val radpower = IntArray(initrad)
96
+
97
+ init {
98
+ var p: IntArray
99
+ for (i in 0 until netsize) {
100
+ p = network[i]
101
+ p[0] = (i shl (netbiasshift + 8)) / netsize
102
+ p[1] = p[0]
103
+ p[2] = p[0]
104
+ freq[i] = intbias / netsize // 1 / netsize
105
+ bias[i] = 0
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Runs the full quantization: [learn], [unbiasnet], [inxbuild], then returns the colour map.
111
+ */
112
+ fun process(): ByteArray {
113
+ learn()
114
+ unbiasnet()
115
+ inxbuild()
116
+ return getColormap()
117
+ }
118
+
119
+ /**
120
+ * Builds the colour map as 3 bytes per entry, ordered by the recorded colour index. The bytes
121
+ * are in the same channel order that was fed to the constructor (BGR); the caller swaps to RGB.
122
+ */
123
+ fun getColormap(): ByteArray {
124
+ val map = ByteArray(3 * netsize)
125
+ val index = IntArray(netsize)
126
+ for (i in 0 until netsize) {
127
+ index[network[i][3]] = i
128
+ }
129
+ var k = 0
130
+ for (i in 0 until netsize) {
131
+ val j = index[i]
132
+ map[k++] = network[j][0].toByte()
133
+ map[k++] = network[j][1].toByte()
134
+ map[k++] = network[j][2].toByte()
135
+ }
136
+ return map
137
+ }
138
+
139
+ /**
140
+ * Insertion sort of the network on the green axis and building of netindex[0..255].
141
+ * Must be called after [unbiasnet].
142
+ */
143
+ fun inxbuild() {
144
+ var i = 0
145
+ var j: Int
146
+ var smallpos: Int
147
+ var smallval: Int
148
+ var p: IntArray
149
+ var q: IntArray
150
+ var previouscol = 0
151
+ var startpos = 0
152
+
153
+ while (i < netsize) {
154
+ p = network[i]
155
+ smallpos = i
156
+ smallval = p[1] // index on g
157
+ // find smallest in i..netsize-1
158
+ j = i + 1
159
+ while (j < netsize) {
160
+ q = network[j]
161
+ if (q[1] < smallval) { // index on g
162
+ smallpos = j
163
+ smallval = q[1] // index on g
164
+ }
165
+ j++
166
+ }
167
+ q = network[smallpos]
168
+ // swap p (i) and q (smallpos) entries
169
+ if (i != smallpos) {
170
+ j = q[0]; q[0] = p[0]; p[0] = j
171
+ j = q[1]; q[1] = p[1]; p[1] = j
172
+ j = q[2]; q[2] = p[2]; p[2] = j
173
+ j = q[3]; q[3] = p[3]; p[3] = j
174
+ }
175
+ // smallval entry is now in position i
176
+ if (smallval != previouscol) {
177
+ netindex[previouscol] = (startpos + i) shr 1
178
+ j = previouscol + 1
179
+ while (j < smallval) {
180
+ netindex[j] = i
181
+ j++
182
+ }
183
+ previouscol = smallval
184
+ startpos = i
185
+ }
186
+ i++
187
+ }
188
+ netindex[previouscol] = (startpos + maxnetpos) shr 1
189
+ j = previouscol + 1
190
+ while (j < 256) {
191
+ netindex[j] = maxnetpos // really 256
192
+ j++
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Main learning loop.
198
+ */
199
+ fun learn() {
200
+ if (lengthcount < minpicturebytes) {
201
+ samplefac = 1
202
+ }
203
+ alphadec = 30 + ((samplefac - 1) / 3)
204
+ val p = thepicture
205
+ var pix = 0
206
+ val lim = lengthcount
207
+ val samplepixels = lengthcount / (3 * samplefac)
208
+ var delta = samplepixels / ncycles
209
+ var alpha = initalpha
210
+ var radius = initradius
211
+
212
+ var rad = radius shr radiusbiasshift
213
+ if (rad <= 1) rad = 0
214
+ var i = 0
215
+ while (i < rad) {
216
+ radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad))
217
+ i++
218
+ }
219
+
220
+ val step: Int = if (lengthcount < minpicturebytes) {
221
+ 3
222
+ } else if (lengthcount % prime1 != 0) {
223
+ 3 * prime1
224
+ } else if (lengthcount % prime2 != 0) {
225
+ 3 * prime2
226
+ } else if (lengthcount % prime3 != 0) {
227
+ 3 * prime3
228
+ } else {
229
+ 3 * prime4
230
+ }
231
+
232
+ i = 0
233
+ while (i < samplepixels) {
234
+ val b = (p[pix + 0].toInt() and 0xff) shl netbiasshift
235
+ val g = (p[pix + 1].toInt() and 0xff) shl netbiasshift
236
+ val r = (p[pix + 2].toInt() and 0xff) shl netbiasshift
237
+ val j = contest(b, g, r)
238
+
239
+ altersingle(alpha, j, b, g, r)
240
+ if (rad != 0) alterneigh(rad, j, b, g, r) // alter neighbours
241
+
242
+ pix += step
243
+ if (pix >= lim) pix -= lengthcount
244
+
245
+ i++
246
+ if (delta == 0) delta = 1
247
+ if (i % delta == 0) {
248
+ alpha -= alpha / alphadec
249
+ radius -= radius / radiusdec
250
+ rad = radius shr radiusbiasshift
251
+ if (rad <= 1) rad = 0
252
+ var k = 0
253
+ while (k < rad) {
254
+ radpower[k] = alpha * (((rad * rad - k * k) * radbias) / (rad * rad))
255
+ k++
256
+ }
257
+ }
258
+ }
259
+ }
260
+
261
+ /**
262
+ * Searches for BGR values 0..255 (after the net is unbiased) and returns the colour index of
263
+ * the nearest neuron. This is the canonical `map`; [inxsearch] is provided as an alias under the
264
+ * original C name.
265
+ */
266
+ fun map(b: Int, g: Int, r: Int): Int {
267
+ var dist: Int
268
+ var a: Int
269
+ var bestd = 1000 // biggest possible dist is 256*3
270
+ var p: IntArray
271
+ var best = -1
272
+
273
+ var i = netindex[g] // index on g
274
+ var j = i - 1 // start at netindex[g] and work outwards
275
+
276
+ while (i < netsize || j >= 0) {
277
+ if (i < netsize) {
278
+ p = network[i]
279
+ dist = p[1] - g // inx key
280
+ if (dist >= bestd) {
281
+ i = netsize // stop iter
282
+ } else {
283
+ i++
284
+ if (dist < 0) dist = -dist
285
+ a = p[0] - b
286
+ if (a < 0) a = -a
287
+ dist += a
288
+ if (dist < bestd) {
289
+ a = p[2] - r
290
+ if (a < 0) a = -a
291
+ dist += a
292
+ if (dist < bestd) {
293
+ bestd = dist
294
+ best = p[3]
295
+ }
296
+ }
297
+ }
298
+ }
299
+ if (j >= 0) {
300
+ p = network[j]
301
+ dist = g - p[1] // inx key - reverse dif
302
+ if (dist >= bestd) {
303
+ j = -1 // stop iter
304
+ } else {
305
+ j--
306
+ if (dist < 0) dist = -dist
307
+ a = p[0] - b
308
+ if (a < 0) a = -a
309
+ dist += a
310
+ if (dist < bestd) {
311
+ a = p[2] - r
312
+ if (a < 0) a = -a
313
+ dist += a
314
+ if (dist < bestd) {
315
+ bestd = dist
316
+ best = p[3]
317
+ }
318
+ }
319
+ }
320
+ }
321
+ }
322
+ return best
323
+ }
324
+
325
+ /** Alias for [map] under the original NeuQuant C name. */
326
+ fun inxsearch(b: Int, g: Int, r: Int): Int = map(b, g, r)
327
+
328
+ /**
329
+ * Unbiases the network to give byte values 0..255 and records the position of each neuron to
330
+ * prepare for the sort in [inxbuild].
331
+ */
332
+ fun unbiasnet() {
333
+ for (i in 0 until netsize) {
334
+ network[i][0] = network[i][0] shr netbiasshift
335
+ network[i][1] = network[i][1] shr netbiasshift
336
+ network[i][2] = network[i][2] shr netbiasshift
337
+ network[i][3] = i // record colour number
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Moves neurons adjacent to neuron [i] towards the biased (b, g, r) colour by the precomputed
343
+ * factor held in radpower[|i - neuron|].
344
+ */
345
+ private fun alterneigh(rad: Int, i: Int, b: Int, g: Int, r: Int) {
346
+ var lo = i - rad
347
+ if (lo < -1) lo = -1
348
+ var hi = i + rad
349
+ if (hi > netsize) hi = netsize
350
+
351
+ var j = i + 1
352
+ var k = i - 1
353
+ var m = 1
354
+ while (j < hi || k > lo) {
355
+ val a = radpower[m++]
356
+ if (j < hi) {
357
+ val p = network[j++]
358
+ try {
359
+ p[0] -= (a * (p[0] - b)) / alpharadbias
360
+ p[1] -= (a * (p[1] - g)) / alpharadbias
361
+ p[2] -= (a * (p[2] - r)) / alpharadbias
362
+ } catch (e: Exception) {
363
+ // prevents 1.3 miscompilation
364
+ }
365
+ }
366
+ if (k > lo) {
367
+ val p = network[k--]
368
+ try {
369
+ p[0] -= (a * (p[0] - b)) / alpharadbias
370
+ p[1] -= (a * (p[1] - g)) / alpharadbias
371
+ p[2] -= (a * (p[2] - r)) / alpharadbias
372
+ } catch (e: Exception) {
373
+ // prevents 1.3 miscompilation
374
+ }
375
+ }
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Moves neuron [i] towards the biased (b, g, r) colour by the factor [alpha].
381
+ */
382
+ private fun altersingle(alpha: Int, i: Int, b: Int, g: Int, r: Int) {
383
+ // alter hit neuron
384
+ val n = network[i]
385
+ n[0] -= (alpha * (n[0] - b)) / initalpha
386
+ n[1] -= (alpha * (n[1] - g)) / initalpha
387
+ n[2] -= (alpha * (n[2] - r)) / initalpha
388
+ }
389
+
390
+ /**
391
+ * Searches for the biased BGR values, updating freq and bias, and returns the position of the
392
+ * best neuron (minimum distance minus bias).
393
+ */
394
+ private fun contest(b: Int, g: Int, r: Int): Int {
395
+ // finds closest neuron (min dist) and updates freq
396
+ // finds best neuron (min dist-bias) and returns position
397
+ // for frequently chosen neurons, freq[i] is high and bias[i] is negative
398
+ // bias[i] = gamma * ((1 / netsize) - freq[i])
399
+ var dist: Int
400
+ var a: Int
401
+ var biasdist: Int
402
+ var betafreq: Int
403
+ var bestpos = -1
404
+ var bestbiaspos = -1
405
+ var bestd = (1 shl 31).inv()
406
+ var bestbiasd = bestd
407
+ var n: IntArray
408
+ for (i in 0 until netsize) {
409
+ n = network[i]
410
+ dist = n[0] - b
411
+ if (dist < 0) dist = -dist
412
+ a = n[1] - g
413
+ if (a < 0) a = -a
414
+ dist += a
415
+ a = n[2] - r
416
+ if (a < 0) a = -a
417
+ dist += a
418
+ if (dist < bestd) {
419
+ bestd = dist
420
+ bestpos = i
421
+ }
422
+ biasdist = dist - (bias[i] shr (intbiasshift - netbiasshift))
423
+ if (biasdist < bestbiasd) {
424
+ bestbiasd = biasdist
425
+ bestbiaspos = i
426
+ }
427
+ betafreq = freq[i] shr betashift
428
+ freq[i] -= betafreq
429
+ bias[i] += betafreq shl gammashift
430
+ }
431
+ freq[bestpos] += beta
432
+ bias[bestpos] -= betagamma
433
+ return bestbiaspos
434
+ }
435
+ }
@@ -0,0 +1,147 @@
1
+ package com.customcamera.gif
2
+
3
+ import java.net.URLEncoder
4
+ import org.json.JSONObject
5
+
6
+ /**
7
+ * [GifProvider] backed by the Tenor API (v2, tenor.googleapis.com).
8
+ *
9
+ * Blocking and non-throwing: every failure is folded into a typed [GifResult.Failure] via
10
+ * [GifHttp]. Tenor paginates with an opaque `pos`/`next` token rather than a numeric offset, so
11
+ * that token is passed straight through as [GifPage.nextCursor].
12
+ *
13
+ * @param apiKey Tenor API key; null/blank => [isConfigured] == false and calls short-circuit with
14
+ * [GifError.NO_API_KEY].
15
+ * @param clientKey Tenor "client_key" integration identifier sent on every request.
16
+ */
17
+ class TenorGifProvider(
18
+ private val apiKey: String?,
19
+ private val clientKey: String = "react_native_custom_camera"
20
+ ) : GifProvider {
21
+
22
+ override val id: String = "tenor"
23
+
24
+ override val attributionLabel: String? = "Powered by Tenor"
25
+
26
+ override fun isConfigured(): Boolean = !apiKey.isNullOrBlank()
27
+
28
+ override fun trending(limit: Int, cursor: String?): GifResult<GifPage> {
29
+ val key = apiKey
30
+ if (key.isNullOrBlank()) return GifResult.Failure(GifError.NO_API_KEY)
31
+ val url = buildString {
32
+ append(BASE).append("/featured?key=").append(enc(key))
33
+ append("&client_key=").append(enc(clientKey))
34
+ append("&limit=").append(limit)
35
+ append("&media_filter=tinygif,gif&contentfilter=high")
36
+ if (!cursor.isNullOrBlank()) append("&pos=").append(enc(cursor))
37
+ }
38
+ return when (val res = GifHttp.getJson(url)) {
39
+ is GifResult.Failure -> res
40
+ is GifResult.Success -> parsePage(res.value)
41
+ }
42
+ }
43
+
44
+ override fun search(query: String, limit: Int, cursor: String?): GifResult<GifPage> {
45
+ val key = apiKey
46
+ if (key.isNullOrBlank()) return GifResult.Failure(GifError.NO_API_KEY)
47
+ val url = buildString {
48
+ append(BASE).append("/search?key=").append(enc(key))
49
+ append("&client_key=").append(enc(clientKey))
50
+ append("&q=").append(enc(query))
51
+ append("&limit=").append(limit)
52
+ append("&media_filter=tinygif,gif&contentfilter=high")
53
+ if (!cursor.isNullOrBlank()) append("&pos=").append(enc(cursor))
54
+ }
55
+ return when (val res = GifHttp.getJson(url)) {
56
+ is GifResult.Failure -> res
57
+ is GifResult.Success -> parsePage(res.value)
58
+ }
59
+ }
60
+
61
+ override fun categories(): GifResult<List<GifCategory>> {
62
+ val key = apiKey
63
+ if (key.isNullOrBlank()) return GifResult.Failure(GifError.NO_API_KEY)
64
+ val url = "$BASE/categories?key=${enc(key)}&client_key=${enc(clientKey)}"
65
+ val json = when (val res = GifHttp.getJson(url)) {
66
+ is GifResult.Failure -> return GifResult.Success(emptyList())
67
+ is GifResult.Success -> res.value
68
+ }
69
+ // Categories are optional: any failure to parse degrades to an empty list, never a hard error.
70
+ val list = runCatching { parseCategories(json) }.getOrDefault(emptyList())
71
+ return GifResult.Success(list)
72
+ }
73
+
74
+ /** Parse a Tenor list response ({ results, next }) into a [GifPage]. */
75
+ private fun parsePage(json: JSONObject): GifResult<GifPage> {
76
+ val results = json.optJSONArray("results") ?: return GifResult.Failure(GifError.PARSE)
77
+ val items = ArrayList<GifItem>(results.length())
78
+ for (i in 0 until results.length()) {
79
+ val obj = results.optJSONObject(i) ?: continue
80
+ val formats = obj.optJSONObject("media_formats")
81
+ val preview = format(formats, "tinygif", "gif") ?: continue
82
+ val content = format(formats, "gif", "tinygif") ?: continue
83
+ val (pUrl, pW, pH) = preview
84
+ val (cUrl, cW, cH) = content
85
+ items.add(
86
+ GifItem(
87
+ id = obj.optString("id"),
88
+ description = obj.optString("content_description"),
89
+ previewUrl = pUrl,
90
+ previewWidth = pW,
91
+ previewHeight = pH,
92
+ contentUrl = cUrl,
93
+ contentWidth = cW,
94
+ contentHeight = cH
95
+ )
96
+ )
97
+ }
98
+ val next = json.optString("next")
99
+ return GifResult.Success(GifPage(items, if (next.isBlank()) null else next))
100
+ }
101
+
102
+ /** Parse the optional Tenor categories response; the caller downgrades any throw to empty. */
103
+ private fun parseCategories(json: JSONObject): List<GifCategory> {
104
+ val tags = json.optJSONArray("tags") ?: return emptyList()
105
+ val out = ArrayList<GifCategory>(tags.length())
106
+ for (i in 0 until tags.length()) {
107
+ val tag = tags.optJSONObject(i) ?: continue
108
+ val displayName = tag.optString("name").removePrefix("#")
109
+ val searchTerm = tag.optString("searchterm")
110
+ val name = displayName.ifBlank { searchTerm }
111
+ val term = searchTerm.ifBlank { displayName }
112
+ if (name.isBlank() || term.isBlank()) continue
113
+ out.add(
114
+ GifCategory(
115
+ name = name,
116
+ searchTerm = term,
117
+ imageUrl = tag.optString("image").ifBlank { null }
118
+ )
119
+ )
120
+ }
121
+ return out
122
+ }
123
+
124
+ /**
125
+ * Pick the first present Tenor media format among [names] and return its (url, width, height),
126
+ * or null when none has a usable url. Tenor stores size as an int `dims: [w, h]` array.
127
+ */
128
+ private fun format(formats: JSONObject?, vararg names: String): Triple<String, Int, Int>? {
129
+ if (formats == null) return null
130
+ for (name in names) {
131
+ val f = formats.optJSONObject(name) ?: continue
132
+ val url = f.optString("url")
133
+ if (url.isBlank()) continue
134
+ val dims = f.optJSONArray("dims")
135
+ val w = if (dims != null && dims.length() >= 1) dims.optInt(0, 0) else 0
136
+ val h = if (dims != null && dims.length() >= 2) dims.optInt(1, 0) else 0
137
+ return Triple(url, w, h)
138
+ }
139
+ return null
140
+ }
141
+
142
+ private fun enc(value: String): String = URLEncoder.encode(value, "UTF-8")
143
+
144
+ companion object {
145
+ private const val BASE = "https://tenor.googleapis.com/v2"
146
+ }
147
+ }
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_brush_selected_bg" />
5
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <stroke android:width="2dp" android:color="@color/customcamera_color_swatch_border" />
5
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <solid android:color="@color/customcamera_editor_toolbar_bg" />
5
+ <corners android:radius="28dp" />
6
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_icon_circle_bg" />
5
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_icon_circle_light_bg" />
5
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <solid android:color="@color/customcamera_mode_tab_active_bg" />
5
+ <corners android:radius="14dp" />
6
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <solid android:color="@color/customcamera_pill_bg" />
5
+ <corners android:radius="24dp" />
6
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="#FFE53935" />
5
+ <size android:width="6dp" android:height="6dp" />
6
+ </shape>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_selection_badge_bg" />
5
+ <stroke
6
+ android:width="2dp"
7
+ android:color="@color/customcamera_selection_badge_border" />
8
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_send_button_bg" />
5
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_shutter_inner" />
5
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <solid android:color="@color/customcamera_shutter_recording" />
5
+ <corners android:radius="10dp" />
6
+ </shape>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@android:color/transparent" />
5
+ <stroke
6
+ android:width="5dp"
7
+ android:color="@color/customcamera_shutter_ring" />
8
+ </shape>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="oval">
4
+ <solid android:color="@color/customcamera_shutter_video_idle" />
5
+ </shape>