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.
- package/CustomCamera.podspec +20 -0
- package/LICENSE +20 -0
- package/README.md +833 -0
- package/android/build.gradle +135 -0
- package/android/consumer-rules.pro +47 -0
- package/android/src/main/AndroidManifest.xml +72 -0
- package/android/src/main/java/android/print/PdfPrint.java +51 -0
- package/android/src/main/java/com/customcamera/AnimatedImageViewManager.kt +199 -0
- package/android/src/main/java/com/customcamera/AudioPlayerView.kt +322 -0
- package/android/src/main/java/com/customcamera/AudioRecorder.kt +506 -0
- package/android/src/main/java/com/customcamera/BarcodeScannerActivity.kt +361 -0
- package/android/src/main/java/com/customcamera/BlurBackgroundView.kt +199 -0
- package/android/src/main/java/com/customcamera/CacheCleanupManager.kt +386 -0
- package/android/src/main/java/com/customcamera/CameraAspectRatioMode.kt +77 -0
- package/android/src/main/java/com/customcamera/CameraAsset.kt +211 -0
- package/android/src/main/java/com/customcamera/CameraTheme.kt +479 -0
- package/android/src/main/java/com/customcamera/CompressionCacheStore.kt +504 -0
- package/android/src/main/java/com/customcamera/CompressionFileNameUtils.kt +7 -0
- package/android/src/main/java/com/customcamera/CompressionProfile.kt +195 -0
- package/android/src/main/java/com/customcamera/CustomCameraActivity.kt +7291 -0
- package/android/src/main/java/com/customcamera/CustomCameraFileProvider.kt +9 -0
- package/android/src/main/java/com/customcamera/CustomCameraModule.kt +2479 -0
- package/android/src/main/java/com/customcamera/CustomCameraPackage.kt +53 -0
- package/android/src/main/java/com/customcamera/DisplayUtils.kt +9 -0
- package/android/src/main/java/com/customcamera/DocumentPreviewView.kt +846 -0
- package/android/src/main/java/com/customcamera/DrawingView.kt +214 -0
- package/android/src/main/java/com/customcamera/EmojiPickerData.kt +228 -0
- package/android/src/main/java/com/customcamera/FilterStripAdapter.kt +158 -0
- package/android/src/main/java/com/customcamera/GifSupport.kt +215 -0
- package/android/src/main/java/com/customcamera/GlobalAudioPlayer.kt +320 -0
- package/android/src/main/java/com/customcamera/ImageExporter.kt +1394 -0
- package/android/src/main/java/com/customcamera/ImageFormatSupport.kt +163 -0
- package/android/src/main/java/com/customcamera/Localization.kt +206 -0
- package/android/src/main/java/com/customcamera/MediaAdapters.kt +758 -0
- package/android/src/main/java/com/customcamera/MediaCacheManager.kt +782 -0
- package/android/src/main/java/com/customcamera/MediaExportFormats.kt +201 -0
- package/android/src/main/java/com/customcamera/MediaFileIo.kt +310 -0
- package/android/src/main/java/com/customcamera/MediaMetadataStore.kt +494 -0
- package/android/src/main/java/com/customcamera/MediaPreviewEditor.kt +14865 -0
- package/android/src/main/java/com/customcamera/MediaPublisher.kt +423 -0
- package/android/src/main/java/com/customcamera/MediaStorageWorkflow.kt +722 -0
- package/android/src/main/java/com/customcamera/MediaStoreRepository.kt +378 -0
- package/android/src/main/java/com/customcamera/MediaThumbnailView.kt +286 -0
- package/android/src/main/java/com/customcamera/MediaUtils.kt +37 -0
- package/android/src/main/java/com/customcamera/NativeVideoViewManager.kt +845 -0
- package/android/src/main/java/com/customcamera/OfficeDocumentConverter.kt +2791 -0
- package/android/src/main/java/com/customcamera/PendingCaptureCrops.kt +88 -0
- package/android/src/main/java/com/customcamera/PowerPointPreview.kt +4077 -0
- package/android/src/main/java/com/customcamera/RecentPickerStore.kt +74 -0
- package/android/src/main/java/com/customcamera/SecureFileEraser.kt +411 -0
- package/android/src/main/java/com/customcamera/SecureKeyModule.kt +88 -0
- package/android/src/main/java/com/customcamera/SecureMediaDeleter.kt +493 -0
- package/android/src/main/java/com/customcamera/StickerPickerData.kt +107 -0
- package/android/src/main/java/com/customcamera/SvgDrawable.kt +175 -0
- package/android/src/main/java/com/customcamera/SvgIconViewManager.kt +77 -0
- package/android/src/main/java/com/customcamera/TextEntryController.kt +553 -0
- package/android/src/main/java/com/customcamera/ThumbnailLoader.kt +455 -0
- package/android/src/main/java/com/customcamera/UploadService.kt +909 -0
- package/android/src/main/java/com/customcamera/VideoEditUtils.kt +210 -0
- package/android/src/main/java/com/customcamera/VideoRotationTranscoder.kt +1992 -0
- package/android/src/main/java/com/customcamera/gif/AnimatedGifEncoder.kt +473 -0
- package/android/src/main/java/com/customcamera/gif/GifDecoder.kt +690 -0
- package/android/src/main/java/com/customcamera/gif/GifFramesDrawable.kt +160 -0
- package/android/src/main/java/com/customcamera/gif/GifHttp.kt +112 -0
- package/android/src/main/java/com/customcamera/gif/GifImageLoader.kt +186 -0
- package/android/src/main/java/com/customcamera/gif/GifModels.kt +74 -0
- package/android/src/main/java/com/customcamera/gif/GifProvider.kt +49 -0
- package/android/src/main/java/com/customcamera/gif/GifProviders.kt +27 -0
- package/android/src/main/java/com/customcamera/gif/GifRepository.kt +124 -0
- package/android/src/main/java/com/customcamera/gif/GifSafety.kt +33 -0
- package/android/src/main/java/com/customcamera/gif/GiphyGifProvider.kt +146 -0
- package/android/src/main/java/com/customcamera/gif/LZWEncoder.kt +258 -0
- package/android/src/main/java/com/customcamera/gif/NeuQuant.kt +435 -0
- package/android/src/main/java/com/customcamera/gif/TenorGifProvider.kt +147 -0
- package/android/src/main/res/drawable/bg_brush_selected.xml +5 -0
- package/android/src/main/res/drawable/bg_color_swatch.xml +5 -0
- package/android/src/main/res/drawable/bg_editor_toolbar.xml +6 -0
- package/android/src/main/res/drawable/bg_icon_circle.xml +5 -0
- package/android/src/main/res/drawable/bg_icon_circle_light.xml +5 -0
- package/android/src/main/res/drawable/bg_mode_tab_active.xml +6 -0
- package/android/src/main/res/drawable/bg_pill.xml +6 -0
- package/android/src/main/res/drawable/bg_recording_dot.xml +6 -0
- package/android/src/main/res/drawable/bg_selection_badge.xml +8 -0
- package/android/src/main/res/drawable/bg_send_button.xml +5 -0
- package/android/src/main/res/drawable/bg_shutter_inner.xml +5 -0
- package/android/src/main/res/drawable/bg_shutter_recording.xml +6 -0
- package/android/src/main/res/drawable/bg_shutter_ring.xml +8 -0
- package/android/src/main/res/drawable/bg_shutter_video_idle.xml +5 -0
- package/android/src/main/res/drawable/bg_thumbnail.xml +9 -0
- package/android/src/main/res/drawable/ic_aspect_ratio.xml +17 -0
- package/android/src/main/res/drawable/ic_audio.xml +10 -0
- package/android/src/main/res/drawable/ic_back.xml +10 -0
- package/android/src/main/res/drawable/ic_brush_medium.xml +12 -0
- package/android/src/main/res/drawable/ic_brush_thick.xml +12 -0
- package/android/src/main/res/drawable/ic_brush_thin.xml +12 -0
- package/android/src/main/res/drawable/ic_check.xml +17 -0
- package/android/src/main/res/drawable/ic_chevron_down.xml +10 -0
- package/android/src/main/res/drawable/ic_chevron_up.xml +13 -0
- package/android/src/main/res/drawable/ic_clear_drawing.xml +10 -0
- package/android/src/main/res/drawable/ic_close.xml +10 -0
- package/android/src/main/res/drawable/ic_cover.xml +9 -0
- package/android/src/main/res/drawable/ic_crop.xml +10 -0
- package/android/src/main/res/drawable/ic_delete.xml +9 -0
- package/android/src/main/res/drawable/ic_document.xml +10 -0
- package/android/src/main/res/drawable/ic_done.xml +10 -0
- package/android/src/main/res/drawable/ic_download.xml +10 -0
- package/android/src/main/res/drawable/ic_emoji.xml +10 -0
- package/android/src/main/res/drawable/ic_filter.xml +10 -0
- package/android/src/main/res/drawable/ic_flash_auto.xml +7 -0
- package/android/src/main/res/drawable/ic_flash_off.xml +23 -0
- package/android/src/main/res/drawable/ic_flash_on.xml +16 -0
- package/android/src/main/res/drawable/ic_flip.xml +15 -0
- package/android/src/main/res/drawable/ic_gallery.xml +10 -0
- package/android/src/main/res/drawable/ic_gif.xml +24 -0
- package/android/src/main/res/drawable/ic_lock.xml +19 -0
- package/android/src/main/res/drawable/ic_lock_open.xml +22 -0
- package/android/src/main/res/drawable/ic_marker.xml +10 -0
- package/android/src/main/res/drawable/ic_more_vert.xml +18 -0
- package/android/src/main/res/drawable/ic_overlay_close.xml +19 -0
- package/android/src/main/res/drawable/ic_overlay_resize.xml +18 -0
- package/android/src/main/res/drawable/ic_pause.xml +10 -0
- package/android/src/main/res/drawable/ic_photo_mode.xml +10 -0
- package/android/src/main/res/drawable/ic_play.xml +10 -0
- package/android/src/main/res/drawable/ic_redo.xml +10 -0
- package/android/src/main/res/drawable/ic_rotate.xml +9 -0
- package/android/src/main/res/drawable/ic_send.xml +10 -0
- package/android/src/main/res/drawable/ic_share.xml +10 -0
- package/android/src/main/res/drawable/ic_stat_upload.xml +10 -0
- package/android/src/main/res/drawable/ic_sticker.xml +24 -0
- package/android/src/main/res/drawable/ic_text.xml +10 -0
- package/android/src/main/res/drawable/ic_text_align_center.xml +11 -0
- package/android/src/main/res/drawable/ic_text_align_left.xml +11 -0
- package/android/src/main/res/drawable/ic_text_align_right.xml +11 -0
- package/android/src/main/res/drawable/ic_text_bg.xml +11 -0
- package/android/src/main/res/drawable/ic_trim.xml +23 -0
- package/android/src/main/res/drawable/ic_undo.xml +10 -0
- package/android/src/main/res/drawable/ic_video_mode.xml +10 -0
- package/android/src/main/res/drawable/ic_video_note.xml +13 -0
- package/android/src/main/res/drawable/ic_volume_off.xml +9 -0
- package/android/src/main/res/drawable/ic_volume_on.xml +9 -0
- package/android/src/main/res/drawable/sticker_heart.xml +9 -0
- package/android/src/main/res/drawable/sticker_smile.xml +9 -0
- package/android/src/main/res/drawable/sticker_star.xml +9 -0
- package/android/src/main/res/drawable/sticker_thumbsup.xml +9 -0
- package/android/src/main/res/values/colors.xml +34 -0
- package/android/src/main/res/values/ids.xml +15 -0
- package/android/src/main/res/values/strings.xml +15 -0
- package/android/src/main/res/values/styles.xml +20 -0
- package/android/src/main/res/xml/file_paths.xml +34 -0
- package/ios/CustomCamera.h +5 -0
- package/ios/CustomCamera.mm +214 -0
- package/lib/module/AudioPlayerContext.js +233 -0
- package/lib/module/AudioPlayerContext.js.map +1 -0
- package/lib/module/CameraPreview.js +304 -0
- package/lib/module/CameraPreview.js.map +1 -0
- package/lib/module/NativeAnimatedImageView.js +41 -0
- package/lib/module/NativeAnimatedImageView.js.map +1 -0
- package/lib/module/NativeAudioPlayerView.js +33 -0
- package/lib/module/NativeAudioPlayerView.js.map +1 -0
- package/lib/module/NativeBlurView.js +35 -0
- package/lib/module/NativeBlurView.js.map +1 -0
- package/lib/module/NativeCustomCamera.js +128 -0
- package/lib/module/NativeCustomCamera.js.map +1 -0
- package/lib/module/NativeCustomCamera.web.js +143 -0
- package/lib/module/NativeCustomCamera.web.js.map +1 -0
- package/lib/module/NativeCustomVideoView.js +5 -0
- package/lib/module/NativeCustomVideoView.js.map +1 -0
- package/lib/module/NativeDocumentPreviewView.js +156 -0
- package/lib/module/NativeDocumentPreviewView.js.map +1 -0
- package/lib/module/NativeMediaThumbnailView.js +110 -0
- package/lib/module/NativeMediaThumbnailView.js.map +1 -0
- package/lib/module/NativeSvgIcon.js +32 -0
- package/lib/module/NativeSvgIcon.js.map +1 -0
- package/lib/module/ResponsivePreviewContainer.js +171 -0
- package/lib/module/ResponsivePreviewContainer.js.map +1 -0
- package/lib/module/accessibility.js +61 -0
- package/lib/module/accessibility.js.map +1 -0
- package/lib/module/config.js +352 -0
- package/lib/module/config.js.map +1 -0
- package/lib/module/cpuOptimization.js +296 -0
- package/lib/module/cpuOptimization.js.map +1 -0
- package/lib/module/db/DatabaseManager.js +191 -0
- package/lib/module/db/DatabaseManager.js.map +1 -0
- package/lib/module/db/MediaMapper.js +284 -0
- package/lib/module/db/MediaMapper.js.map +1 -0
- package/lib/module/db/MediaRepository.js +242 -0
- package/lib/module/db/MediaRepository.js.map +1 -0
- package/lib/module/db/index.js +41 -0
- package/lib/module/db/index.js.map +1 -0
- package/lib/module/db/migrations.js +180 -0
- package/lib/module/db/migrations.js.map +1 -0
- package/lib/module/db/react-native-sqlcipher.d.js +2 -0
- package/lib/module/db/react-native-sqlcipher.d.js.map +1 -0
- package/lib/module/db/secureKey.js +87 -0
- package/lib/module/db/secureKey.js.map +1 -0
- package/lib/module/db/types.js +57 -0
- package/lib/module/db/types.js.map +1 -0
- package/lib/module/db/useMediaDatabase.js +123 -0
- package/lib/module/db/useMediaDatabase.js.map +1 -0
- package/lib/module/defaultIcons.js +2259 -0
- package/lib/module/defaultIcons.js.map +1 -0
- package/lib/module/deviceCapabilities.js +408 -0
- package/lib/module/deviceCapabilities.js.map +1 -0
- package/lib/module/errors.js +267 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/iconConfig.js +796 -0
- package/lib/module/iconConfig.js.map +1 -0
- package/lib/module/icons.js +514 -0
- package/lib/module/icons.js.map +1 -0
- package/lib/module/index.js +251 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/jest-globals.d.js +2 -0
- package/lib/module/jest-globals.d.js.map +1 -0
- package/lib/module/library/MediaLibrary.js +107 -0
- package/lib/module/library/MediaLibrary.js.map +1 -0
- package/lib/module/library/MediaLibraryScreen.js +2597 -0
- package/lib/module/library/MediaLibraryScreen.js.map +1 -0
- package/lib/module/library/components/AudioPreview.js +74 -0
- package/lib/module/library/components/AudioPreview.js.map +1 -0
- package/lib/module/library/components/DocumentPreview.js +331 -0
- package/lib/module/library/components/DocumentPreview.js.map +1 -0
- package/lib/module/library/components/ExpandableFab.js +343 -0
- package/lib/module/library/components/ExpandableFab.js.map +1 -0
- package/lib/module/library/components/FileTiles.js +251 -0
- package/lib/module/library/components/FileTiles.js.map +1 -0
- package/lib/module/library/components/ImagePreview.js +70 -0
- package/lib/module/library/components/ImagePreview.js.map +1 -0
- package/lib/module/library/components/MediaMetadataHeader.js +175 -0
- package/lib/module/library/components/MediaMetadataHeader.js.map +1 -0
- package/lib/module/library/components/RecordAudioScreen.js +816 -0
- package/lib/module/library/components/RecordAudioScreen.js.map +1 -0
- package/lib/module/library/components/VideoPreview.js +453 -0
- package/lib/module/library/components/VideoPreview.js.map +1 -0
- package/lib/module/library/components/ViewerCounter.js +55 -0
- package/lib/module/library/components/ViewerCounter.js.map +1 -0
- package/lib/module/library/compressionEstimate.js +507 -0
- package/lib/module/library/compressionEstimate.js.map +1 -0
- package/lib/module/library/fileMetadata.js +196 -0
- package/lib/module/library/fileMetadata.js.map +1 -0
- package/lib/module/library/index.js +42 -0
- package/lib/module/library/index.js.map +1 -0
- package/lib/module/library/libraryIconRegistry.js +69 -0
- package/lib/module/library/libraryIconRegistry.js.map +1 -0
- package/lib/module/library/libraryIcons.js +858 -0
- package/lib/module/library/libraryIcons.js.map +1 -0
- package/lib/module/library/localizedFormat.js +181 -0
- package/lib/module/library/localizedFormat.js.map +1 -0
- package/lib/module/library/palette.js +225 -0
- package/lib/module/library/palette.js.map +1 -0
- package/lib/module/library/responsive.js +53 -0
- package/lib/module/library/responsive.js.map +1 -0
- package/lib/module/locales.js +416 -0
- package/lib/module/locales.js.map +1 -0
- package/lib/module/localization.js +1064 -0
- package/lib/module/localization.js.map +1 -0
- package/lib/module/logger.js +20 -0
- package/lib/module/logger.js.map +1 -0
- package/lib/module/lowMemoryCache.js +206 -0
- package/lib/module/lowMemoryCache.js.map +1 -0
- package/lib/module/mediaHistory.js +33 -0
- package/lib/module/mediaHistory.js.map +1 -0
- package/lib/module/mediaStorageService.js +402 -0
- package/lib/module/mediaStorageService.js.map +1 -0
- package/lib/module/memory.js +79 -0
- package/lib/module/memory.js.map +1 -0
- package/lib/module/nativeActions.js +307 -0
- package/lib/module/nativeActions.js.map +1 -0
- package/lib/module/nativeComponentSupport.js +61 -0
- package/lib/module/nativeComponentSupport.js.map +1 -0
- package/lib/module/networkPerformance.js +24 -0
- package/lib/module/networkPerformance.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/performance.js +104 -0
- package/lib/module/performance.js.map +1 -0
- package/lib/module/performanceMonitor.js +155 -0
- package/lib/module/performanceMonitor.js.map +1 -0
- package/lib/module/permissions.js +370 -0
- package/lib/module/permissions.js.map +1 -0
- package/lib/module/rendering.js +40 -0
- package/lib/module/rendering.js.map +1 -0
- package/lib/module/security.js +18 -0
- package/lib/module/security.js.map +1 -0
- package/lib/module/state.js +266 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/storage.js +400 -0
- package/lib/module/storage.js.map +1 -0
- package/lib/module/theme.js +390 -0
- package/lib/module/theme.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils.js +115 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/module/validation.js +288 -0
- package/lib/module/validation.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/AudioPlayerContext.d.ts +27 -0
- package/lib/typescript/src/AudioPlayerContext.d.ts.map +1 -0
- package/lib/typescript/src/CameraPreview.d.ts +13 -0
- package/lib/typescript/src/CameraPreview.d.ts.map +1 -0
- package/lib/typescript/src/NativeAnimatedImageView.d.ts +33 -0
- package/lib/typescript/src/NativeAnimatedImageView.d.ts.map +1 -0
- package/lib/typescript/src/NativeAudioPlayerView.d.ts +12 -0
- package/lib/typescript/src/NativeAudioPlayerView.d.ts.map +1 -0
- package/lib/typescript/src/NativeBlurView.d.ts +12 -0
- package/lib/typescript/src/NativeBlurView.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomCamera.d.ts +167 -0
- package/lib/typescript/src/NativeCustomCamera.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomCamera.web.d.ts +47 -0
- package/lib/typescript/src/NativeCustomCamera.web.d.ts.map +1 -0
- package/lib/typescript/src/NativeCustomVideoView.d.ts +30 -0
- package/lib/typescript/src/NativeCustomVideoView.d.ts.map +1 -0
- package/lib/typescript/src/NativeDocumentPreviewView.d.ts +48 -0
- package/lib/typescript/src/NativeDocumentPreviewView.d.ts.map +1 -0
- package/lib/typescript/src/NativeMediaThumbnailView.d.ts +54 -0
- package/lib/typescript/src/NativeMediaThumbnailView.d.ts.map +1 -0
- package/lib/typescript/src/NativeSvgIcon.d.ts +25 -0
- package/lib/typescript/src/NativeSvgIcon.d.ts.map +1 -0
- package/lib/typescript/src/ResponsivePreviewContainer.d.ts +92 -0
- package/lib/typescript/src/ResponsivePreviewContainer.d.ts.map +1 -0
- package/lib/typescript/src/accessibility.d.ts +20 -0
- package/lib/typescript/src/accessibility.d.ts.map +1 -0
- package/lib/typescript/src/config.d.ts +145 -0
- package/lib/typescript/src/config.d.ts.map +1 -0
- package/lib/typescript/src/cpuOptimization.d.ts +63 -0
- package/lib/typescript/src/cpuOptimization.d.ts.map +1 -0
- package/lib/typescript/src/db/DatabaseManager.d.ts +48 -0
- package/lib/typescript/src/db/DatabaseManager.d.ts.map +1 -0
- package/lib/typescript/src/db/MediaMapper.d.ts +77 -0
- package/lib/typescript/src/db/MediaMapper.d.ts.map +1 -0
- package/lib/typescript/src/db/MediaRepository.d.ts +66 -0
- package/lib/typescript/src/db/MediaRepository.d.ts.map +1 -0
- package/lib/typescript/src/db/index.d.ts +23 -0
- package/lib/typescript/src/db/index.d.ts.map +1 -0
- package/lib/typescript/src/db/migrations.d.ts +31 -0
- package/lib/typescript/src/db/migrations.d.ts.map +1 -0
- package/lib/typescript/src/db/secureKey.d.ts +10 -0
- package/lib/typescript/src/db/secureKey.d.ts.map +1 -0
- package/lib/typescript/src/db/types.d.ts +115 -0
- package/lib/typescript/src/db/types.d.ts.map +1 -0
- package/lib/typescript/src/db/useMediaDatabase.d.ts +41 -0
- package/lib/typescript/src/db/useMediaDatabase.d.ts.map +1 -0
- package/lib/typescript/src/defaultIcons.d.ts +139 -0
- package/lib/typescript/src/defaultIcons.d.ts.map +1 -0
- package/lib/typescript/src/deviceCapabilities.d.ts +92 -0
- package/lib/typescript/src/deviceCapabilities.d.ts.map +1 -0
- package/lib/typescript/src/errors.d.ts +95 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/iconConfig.d.ts +176 -0
- package/lib/typescript/src/iconConfig.d.ts.map +1 -0
- package/lib/typescript/src/icons.d.ts +217 -0
- package/lib/typescript/src/icons.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +104 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/library/MediaLibrary.d.ts +57 -0
- package/lib/typescript/src/library/MediaLibrary.d.ts.map +1 -0
- package/lib/typescript/src/library/MediaLibraryScreen.d.ts +51 -0
- package/lib/typescript/src/library/MediaLibraryScreen.d.ts.map +1 -0
- package/lib/typescript/src/library/components/AudioPreview.d.ts +6 -0
- package/lib/typescript/src/library/components/AudioPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/DocumentPreview.d.ts +10 -0
- package/lib/typescript/src/library/components/DocumentPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ExpandableFab.d.ts +39 -0
- package/lib/typescript/src/library/components/ExpandableFab.d.ts.map +1 -0
- package/lib/typescript/src/library/components/FileTiles.d.ts +8 -0
- package/lib/typescript/src/library/components/FileTiles.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ImagePreview.d.ts +5 -0
- package/lib/typescript/src/library/components/ImagePreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts +16 -0
- package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts.map +1 -0
- package/lib/typescript/src/library/components/RecordAudioScreen.d.ts +8 -0
- package/lib/typescript/src/library/components/RecordAudioScreen.d.ts.map +1 -0
- package/lib/typescript/src/library/components/VideoPreview.d.ts +20 -0
- package/lib/typescript/src/library/components/VideoPreview.d.ts.map +1 -0
- package/lib/typescript/src/library/components/ViewerCounter.d.ts +13 -0
- package/lib/typescript/src/library/components/ViewerCounter.d.ts.map +1 -0
- package/lib/typescript/src/library/compressionEstimate.d.ts +313 -0
- package/lib/typescript/src/library/compressionEstimate.d.ts.map +1 -0
- package/lib/typescript/src/library/fileMetadata.d.ts +33 -0
- package/lib/typescript/src/library/fileMetadata.d.ts.map +1 -0
- package/lib/typescript/src/library/index.d.ts +40 -0
- package/lib/typescript/src/library/index.d.ts.map +1 -0
- package/lib/typescript/src/library/libraryIconRegistry.d.ts +35 -0
- package/lib/typescript/src/library/libraryIconRegistry.d.ts.map +1 -0
- package/lib/typescript/src/library/libraryIcons.d.ts +85 -0
- package/lib/typescript/src/library/libraryIcons.d.ts.map +1 -0
- package/lib/typescript/src/library/localizedFormat.d.ts +49 -0
- package/lib/typescript/src/library/localizedFormat.d.ts.map +1 -0
- package/lib/typescript/src/library/palette.d.ts +104 -0
- package/lib/typescript/src/library/palette.d.ts.map +1 -0
- package/lib/typescript/src/library/responsive.d.ts +15 -0
- package/lib/typescript/src/library/responsive.d.ts.map +1 -0
- package/lib/typescript/src/locales.d.ts +103 -0
- package/lib/typescript/src/locales.d.ts.map +1 -0
- package/lib/typescript/src/localization.d.ts +1051 -0
- package/lib/typescript/src/localization.d.ts.map +1 -0
- package/lib/typescript/src/logger.d.ts +4 -0
- package/lib/typescript/src/logger.d.ts.map +1 -0
- package/lib/typescript/src/lowMemoryCache.d.ts +64 -0
- package/lib/typescript/src/lowMemoryCache.d.ts.map +1 -0
- package/lib/typescript/src/mediaHistory.d.ts +3 -0
- package/lib/typescript/src/mediaHistory.d.ts.map +1 -0
- package/lib/typescript/src/mediaStorageService.d.ts +155 -0
- package/lib/typescript/src/mediaStorageService.d.ts.map +1 -0
- package/lib/typescript/src/memory.d.ts +21 -0
- package/lib/typescript/src/memory.d.ts.map +1 -0
- package/lib/typescript/src/nativeActions.d.ts +174 -0
- package/lib/typescript/src/nativeActions.d.ts.map +1 -0
- package/lib/typescript/src/nativeComponentSupport.d.ts +30 -0
- package/lib/typescript/src/nativeComponentSupport.d.ts.map +1 -0
- package/lib/typescript/src/networkPerformance.d.ts +12 -0
- package/lib/typescript/src/networkPerformance.d.ts.map +1 -0
- package/lib/typescript/src/performance.d.ts +32 -0
- package/lib/typescript/src/performance.d.ts.map +1 -0
- package/lib/typescript/src/performanceMonitor.d.ts +45 -0
- package/lib/typescript/src/performanceMonitor.d.ts.map +1 -0
- package/lib/typescript/src/permissions.d.ts +132 -0
- package/lib/typescript/src/permissions.d.ts.map +1 -0
- package/lib/typescript/src/rendering.d.ts +9 -0
- package/lib/typescript/src/rendering.d.ts.map +1 -0
- package/lib/typescript/src/security.d.ts +6 -0
- package/lib/typescript/src/security.d.ts.map +1 -0
- package/lib/typescript/src/state.d.ts +102 -0
- package/lib/typescript/src/state.d.ts.map +1 -0
- package/lib/typescript/src/storage.d.ts +117 -0
- package/lib/typescript/src/storage.d.ts.map +1 -0
- package/lib/typescript/src/theme.d.ts +15 -0
- package/lib/typescript/src/theme.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +802 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils.d.ts +50 -0
- package/lib/typescript/src/utils.d.ts.map +1 -0
- package/lib/typescript/src/validation.d.ts +52 -0
- package/lib/typescript/src/validation.d.ts.map +1 -0
- package/package.json +204 -0
- package/react-native.config.js +17 -0
- package/src/AudioPlayerContext.tsx +220 -0
- package/src/CameraPreview.tsx +352 -0
- package/src/NativeAnimatedImageView.tsx +71 -0
- package/src/NativeAudioPlayerView.tsx +39 -0
- package/src/NativeBlurView.tsx +40 -0
- package/src/NativeCustomCamera.ts +305 -0
- package/src/NativeCustomCamera.web.ts +192 -0
- package/src/NativeCustomVideoView.ts +30 -0
- package/src/NativeDocumentPreviewView.tsx +196 -0
- package/src/NativeMediaThumbnailView.tsx +167 -0
- package/src/NativeSvgIcon.tsx +46 -0
- package/src/ResponsivePreviewContainer.tsx +227 -0
- package/src/accessibility.ts +80 -0
- package/src/config.ts +406 -0
- package/src/cpuOptimization.ts +365 -0
- package/src/db/DatabaseManager.ts +212 -0
- package/src/db/MediaMapper.ts +377 -0
- package/src/db/MediaRepository.ts +313 -0
- package/src/db/index.ts +73 -0
- package/src/db/migrations.ts +222 -0
- package/src/db/react-native-sqlcipher.d.ts +76 -0
- package/src/db/secureKey.ts +100 -0
- package/src/db/types.ts +123 -0
- package/src/db/useMediaDatabase.ts +191 -0
- package/src/defaultIcons.tsx +2390 -0
- package/src/deviceCapabilities.ts +438 -0
- package/src/errors.ts +350 -0
- package/src/iconConfig.tsx +962 -0
- package/src/icons.tsx +788 -0
- package/src/index.tsx +763 -0
- package/src/jest-globals.d.ts +9 -0
- package/src/library/MediaLibrary.tsx +141 -0
- package/src/library/MediaLibraryScreen.tsx +3003 -0
- package/src/library/components/AudioPreview.tsx +73 -0
- package/src/library/components/DocumentPreview.tsx +361 -0
- package/src/library/components/ExpandableFab.tsx +342 -0
- package/src/library/components/FileTiles.tsx +252 -0
- package/src/library/components/ImagePreview.tsx +72 -0
- package/src/library/components/MediaMetadataHeader.tsx +208 -0
- package/src/library/components/RecordAudioScreen.tsx +845 -0
- package/src/library/components/VideoPreview.tsx +478 -0
- package/src/library/components/ViewerCounter.tsx +71 -0
- package/src/library/compressionEstimate.ts +662 -0
- package/src/library/fileMetadata.ts +212 -0
- package/src/library/index.ts +66 -0
- package/src/library/libraryIconRegistry.tsx +86 -0
- package/src/library/libraryIcons.tsx +928 -0
- package/src/library/localizedFormat.ts +207 -0
- package/src/library/palette.ts +281 -0
- package/src/library/responsive.ts +49 -0
- package/src/locales.ts +381 -0
- package/src/localization.ts +1947 -0
- package/src/logger.ts +20 -0
- package/src/lowMemoryCache.ts +218 -0
- package/src/mediaHistory.ts +42 -0
- package/src/mediaStorageService.ts +546 -0
- package/src/memory.ts +102 -0
- package/src/nativeActions.ts +422 -0
- package/src/nativeComponentSupport.ts +60 -0
- package/src/networkPerformance.ts +30 -0
- package/src/performance.ts +137 -0
- package/src/performanceMonitor.ts +219 -0
- package/src/permissions.ts +403 -0
- package/src/rendering.ts +47 -0
- package/src/security.ts +19 -0
- package/src/state.ts +333 -0
- package/src/storage.ts +453 -0
- package/src/theme.tsx +467 -0
- package/src/types.ts +946 -0
- package/src/utils.ts +177 -0
- 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,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,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>
|