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,479 @@
|
|
|
1
|
+
package com.customcamera
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Color
|
|
5
|
+
import android.graphics.drawable.Drawable
|
|
6
|
+
import org.json.JSONObject
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Relative-luminance dark test for an arbitrary ARGB color (< 0.5 = dark). Mirrors the JS shell's
|
|
10
|
+
* `luminance()`/`isDarkTheme()` in palette.ts so native and React Native agree on the light/dark
|
|
11
|
+
* split, and lets callers test a surface color that isn't the window `background` (e.g. the barcode
|
|
12
|
+
* scanner's own backdrop) to pick a matching status-bar icon appearance.
|
|
13
|
+
*/
|
|
14
|
+
fun isColorDark(color: Int): Boolean =
|
|
15
|
+
(0.2126 * Color.red(color) +
|
|
16
|
+
0.7152 * Color.green(color) +
|
|
17
|
+
0.0722 * Color.blue(color)) / 255.0 < 0.5
|
|
18
|
+
|
|
19
|
+
data class CameraThemeColors(
|
|
20
|
+
val background: Int,
|
|
21
|
+
val surface: Int,
|
|
22
|
+
val surfaceMuted: Int,
|
|
23
|
+
val surfaceElevated: Int,
|
|
24
|
+
val primary: Int,
|
|
25
|
+
val primaryContrast: Int,
|
|
26
|
+
val text: Int,
|
|
27
|
+
val textMuted: Int,
|
|
28
|
+
val textSecondary: Int,
|
|
29
|
+
val border: Int,
|
|
30
|
+
val borderStrong: Int,
|
|
31
|
+
val overlay: Int,
|
|
32
|
+
val overlayStrong: Int,
|
|
33
|
+
val accent: Int,
|
|
34
|
+
val success: Int,
|
|
35
|
+
val error: Int,
|
|
36
|
+
val warning: Int
|
|
37
|
+
) {
|
|
38
|
+
/**
|
|
39
|
+
* Whether the active theme reads as dark, from the relative luminance of the
|
|
40
|
+
* window `background` (< 0.5 = dark). Mirrors the JS shell's `isDarkTheme()`
|
|
41
|
+
* in palette.ts so native and React Native agree on the light/dark split. Lets
|
|
42
|
+
* native chrome branch a token (e.g. a status-bar icon appearance) without the
|
|
43
|
+
* host having to send an explicit flag.
|
|
44
|
+
*/
|
|
45
|
+
val isDark: Boolean
|
|
46
|
+
get() = isColorDark(background)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
data class CameraThemeTypography(
|
|
50
|
+
val fontFamily: String,
|
|
51
|
+
val headingSize: Float,
|
|
52
|
+
val bodySize: Float,
|
|
53
|
+
val captionSize: Float,
|
|
54
|
+
val buttonSize: Float
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
data class CameraThemeSpacing(
|
|
58
|
+
val xs: Int,
|
|
59
|
+
val sm: Int,
|
|
60
|
+
val md: Int,
|
|
61
|
+
val lg: Int,
|
|
62
|
+
val xl: Int,
|
|
63
|
+
val xxl: Int
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
data class CameraThemeBorderRadius(
|
|
67
|
+
val sm: Float,
|
|
68
|
+
val md: Float,
|
|
69
|
+
val lg: Float,
|
|
70
|
+
val xl: Float,
|
|
71
|
+
val pill: Float,
|
|
72
|
+
val circle: Float
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
/** Per-icon appearance override coming from the JS `icons` config section. */
|
|
76
|
+
data class CameraIconStyle(
|
|
77
|
+
val tintColor: Int?,
|
|
78
|
+
val sizeDp: Int?,
|
|
79
|
+
val resourceName: String?,
|
|
80
|
+
val svg: String?
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* White-label extras beyond the visual theme: icon tints/sizes/overrides,
|
|
85
|
+
* animation durations, structural dimension overrides, and upload-notification
|
|
86
|
+
* appearance. Populated from the `cameraConfig` JSON pushed by
|
|
87
|
+
* `setCameraConfig`; every accessor falls back to the previously hardcoded
|
|
88
|
+
* value so an absent config reproduces the stock UI exactly.
|
|
89
|
+
*/
|
|
90
|
+
class CameraConfig(
|
|
91
|
+
private val globalIconTint: Int?,
|
|
92
|
+
private val iconOverrides: Map<String, CameraIconStyle>,
|
|
93
|
+
private val animationDurations: Map<String, Long>,
|
|
94
|
+
private val animationsDisabled: Boolean,
|
|
95
|
+
private val dimensionOverrides: Map<String, Int>,
|
|
96
|
+
val notifications: NotificationConfig,
|
|
97
|
+
val gif: GifConfig
|
|
98
|
+
) {
|
|
99
|
+
data class NotificationConfig(
|
|
100
|
+
val progressChannelId: String,
|
|
101
|
+
val progressChannelName: String?,
|
|
102
|
+
val resultChannelId: String,
|
|
103
|
+
val resultChannelName: String?,
|
|
104
|
+
val accentColor: Int?,
|
|
105
|
+
val smallIconResourceName: String?
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* GIF picker configuration. [provider] selects the GIF service ("giphy" is the default,
|
|
110
|
+
* "tenor" is also supported); [apiKey] is that provider's API key. When [apiKey] is
|
|
111
|
+
* null/blank the picker shows a dedicated "not configured" state instead of making any
|
|
112
|
+
* network calls. Delivered under a top-level `gif` object in the `setCameraConfig` JSON
|
|
113
|
+
* (Channel B) so the secret is never passed through per-launch Intent extras.
|
|
114
|
+
*/
|
|
115
|
+
data class GifConfig(
|
|
116
|
+
val provider: String?,
|
|
117
|
+
val apiKey: String?
|
|
118
|
+
) {
|
|
119
|
+
val isConfigured: Boolean get() = !apiKey.isNullOrBlank()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Tint for an icon (per-icon override wins over the global tint), or null for as-shipped. */
|
|
123
|
+
fun iconTint(name: String): Int? = iconOverrides[name]?.tintColor ?: globalIconTint
|
|
124
|
+
|
|
125
|
+
/** Fixed dp size for an icon, or null to keep the caller's responsive size. */
|
|
126
|
+
fun iconSizeDp(name: String): Int? = iconOverrides[name]?.sizeDp
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Resolve the drawable for an icon: a host-app override drawable when
|
|
130
|
+
* `resourceName` is configured AND resolvable, otherwise the built-in
|
|
131
|
+
* resource. Tint is applied by the caller via [iconTint].
|
|
132
|
+
*/
|
|
133
|
+
fun iconRes(context: Context, name: String, builtinRes: Int): Int {
|
|
134
|
+
val overrideName = iconOverrides[name]?.resourceName ?: return builtinRes
|
|
135
|
+
val resolved = context.resources.getIdentifier(
|
|
136
|
+
overrideName, "drawable", context.packageName
|
|
137
|
+
)
|
|
138
|
+
return if (resolved != 0) resolved else builtinRes
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Resolve an SVG first, then a host drawable resource, then the built-in drawable. */
|
|
142
|
+
fun iconDrawable(context: Context, name: String, builtinRes: Int): Drawable {
|
|
143
|
+
val override = iconOverrides[name]
|
|
144
|
+
val tint = override?.tintColor ?: globalIconTint
|
|
145
|
+
val svg = override?.svg
|
|
146
|
+
if (!svg.isNullOrBlank()) {
|
|
147
|
+
SvgDrawable.from(svg, tint)?.let { return it }
|
|
148
|
+
}
|
|
149
|
+
val resource = iconRes(context, name, builtinRes)
|
|
150
|
+
return requireNotNull(androidx.core.content.ContextCompat.getDrawable(context, resource))
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* The colour filter to apply to [drawable] (the result of [iconDrawable] for
|
|
155
|
+
* icon [name]) so both stock and host-provided artwork look right:
|
|
156
|
+
* - a configured per-icon / global tint always wins;
|
|
157
|
+
* - otherwise a host-provided SVG keeps its OWN colours (null → the caller
|
|
158
|
+
* must clear any filter), because a solid SRC_IN filter would flatten a
|
|
159
|
+
* multi-colour SVG to one tone (and its `currentColor` was already resolved
|
|
160
|
+
* against the config tint inside [SvgDrawable.from]);
|
|
161
|
+
* - otherwise a plain built-in / resource glyph gets [defaultTint] so it
|
|
162
|
+
* still matches the surrounding chrome (e.g. the editor's white icons).
|
|
163
|
+
*
|
|
164
|
+
* Pairs with [iconDrawable]: `val d = iconDrawable(...); view.setImageDrawable(d);
|
|
165
|
+
* iconTintFor(name, d, default)?.let { view.setColorFilter(it) } ?: view.clearColorFilter()`.
|
|
166
|
+
*/
|
|
167
|
+
fun iconTintFor(name: String, drawable: Drawable, defaultTint: Int?): Int? {
|
|
168
|
+
iconTint(name)?.let { return it }
|
|
169
|
+
return if (drawable is SvgDrawable) null else defaultTint
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Animation duration in ms; 0 when animations are disabled. */
|
|
173
|
+
fun anim(key: String, defaultMs: Long): Long =
|
|
174
|
+
if (animationsDisabled) 0L else animationDurations[key] ?: defaultMs
|
|
175
|
+
|
|
176
|
+
/** Structural dimension in dp — configured override or the stock default. */
|
|
177
|
+
fun dim(key: String, defaultDp: Int): Int = dimensionOverrides[key] ?: defaultDp
|
|
178
|
+
|
|
179
|
+
/** Whether a fixed override exists for this dimension (vs. responsive stock sizing). */
|
|
180
|
+
fun hasDim(key: String): Boolean = dimensionOverrides.containsKey(key)
|
|
181
|
+
|
|
182
|
+
companion object {
|
|
183
|
+
val DEFAULT = CameraConfig(
|
|
184
|
+
globalIconTint = null,
|
|
185
|
+
iconOverrides = emptyMap(),
|
|
186
|
+
animationDurations = emptyMap(),
|
|
187
|
+
animationsDisabled = false,
|
|
188
|
+
dimensionOverrides = emptyMap(),
|
|
189
|
+
notifications = NotificationConfig(
|
|
190
|
+
progressChannelId = "UploadServiceChannel",
|
|
191
|
+
progressChannelName = null,
|
|
192
|
+
resultChannelId = "UploadResultChannel",
|
|
193
|
+
resultChannelName = null,
|
|
194
|
+
accentColor = null,
|
|
195
|
+
smallIconResourceName = null
|
|
196
|
+
),
|
|
197
|
+
gif = GifConfig(provider = null, apiKey = null)
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
class CameraTheme(
|
|
203
|
+
val colors: CameraThemeColors,
|
|
204
|
+
val typography: CameraThemeTypography,
|
|
205
|
+
val spacing: CameraThemeSpacing,
|
|
206
|
+
val borderRadius: CameraThemeBorderRadius,
|
|
207
|
+
val config: CameraConfig = CameraConfig.DEFAULT,
|
|
208
|
+
private val componentOverrides: Map<String, Map<String, String>> = emptyMap()
|
|
209
|
+
) {
|
|
210
|
+
/**
|
|
211
|
+
* Component-scoped color from the theme's `components` JSON section
|
|
212
|
+
* (e.g. `components.mediaGrid.selectionAccent`). The inline default IS the
|
|
213
|
+
* stock value, so unthemed builds render exactly as before.
|
|
214
|
+
*/
|
|
215
|
+
fun componentColor(component: String, key: String, default: Int): Int {
|
|
216
|
+
val raw = componentOverrides[component]?.get(key) ?: return default
|
|
217
|
+
return parseColor(raw, default)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Component-scoped numeric value (dp, sp, alpha…) from the theme JSON. */
|
|
221
|
+
fun componentValue(component: String, key: String, default: Float): Float =
|
|
222
|
+
componentOverrides[component]?.get(key)?.toFloatOrNull() ?: default
|
|
223
|
+
|
|
224
|
+
companion object {
|
|
225
|
+
@Volatile
|
|
226
|
+
private var cached: CameraTheme? = null
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Process-wide cached theme for views/adapters that have no Activity
|
|
230
|
+
* holding a theme instance. Screens re-load on launch (the Activities
|
|
231
|
+
* use their own `by lazy` theme), so cache staleness within a running
|
|
232
|
+
* screen matches the pre-existing behavior.
|
|
233
|
+
*/
|
|
234
|
+
fun get(context: Context): CameraTheme =
|
|
235
|
+
cached ?: load(context.applicationContext).also { cached = it }
|
|
236
|
+
|
|
237
|
+
/** Drop the cache so the next [get] re-reads SharedPreferences. */
|
|
238
|
+
fun invalidate() {
|
|
239
|
+
cached = null
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private fun parseColor(colorString: String?, defaultColor: Int): Int {
|
|
243
|
+
if (colorString == null) return defaultColor
|
|
244
|
+
return try {
|
|
245
|
+
if (colorString.startsWith("rgba(")) {
|
|
246
|
+
val parts = colorString.substring(5, colorString.length - 1).split(",")
|
|
247
|
+
val r = parts[0].trim().toInt()
|
|
248
|
+
val g = parts[1].trim().toInt()
|
|
249
|
+
val b = parts[2].trim().toInt()
|
|
250
|
+
val a = (parts[3].trim().toFloat() * 255).toInt()
|
|
251
|
+
Color.argb(a, r, g, b)
|
|
252
|
+
} else if (colorString.startsWith("rgb(")) {
|
|
253
|
+
val parts = colorString.substring(4, colorString.length - 1).split(",")
|
|
254
|
+
val r = parts[0].trim().toInt()
|
|
255
|
+
val g = parts[1].trim().toInt()
|
|
256
|
+
val b = parts[2].trim().toInt()
|
|
257
|
+
Color.rgb(r, g, b)
|
|
258
|
+
} else {
|
|
259
|
+
Color.parseColor(colorString)
|
|
260
|
+
}
|
|
261
|
+
} catch (e: Exception) {
|
|
262
|
+
defaultColor
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** Parse a color string, or null when empty/unparseable (= keep stock appearance). */
|
|
267
|
+
private fun tryParseColor(colorString: String?): Int? {
|
|
268
|
+
if (colorString.isNullOrEmpty()) return null
|
|
269
|
+
val sentinel = 1 // improbable parsed color: fully transparent near-black
|
|
270
|
+
val parsed = parseColor(colorString, sentinel)
|
|
271
|
+
return if (parsed == sentinel && colorString != "#00000001") null else parsed
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
fun load(context: Context): CameraTheme {
|
|
275
|
+
val prefs = context.getSharedPreferences("CameraSettings", Context.MODE_PRIVATE)
|
|
276
|
+
val jsonString = prefs.getString("cameraTheme", null)
|
|
277
|
+
|
|
278
|
+
// Default palette (Dark)
|
|
279
|
+
var colors = CameraThemeColors(
|
|
280
|
+
background = Color.parseColor("#000000"),
|
|
281
|
+
surface = Color.parseColor("#111827"),
|
|
282
|
+
surfaceMuted = Color.parseColor("#1F2937"),
|
|
283
|
+
surfaceElevated = Color.parseColor("#FFFFFF"),
|
|
284
|
+
primary = Color.parseColor("#4A56FF"),
|
|
285
|
+
primaryContrast = Color.parseColor("#FFFFFF"),
|
|
286
|
+
text = Color.parseColor("#FFFFFF"),
|
|
287
|
+
textMuted = Color.parseColor("#94A3B8"),
|
|
288
|
+
textSecondary = Color.parseColor("#CBD5E1"),
|
|
289
|
+
border = Color.parseColor("#1FFFFFFF"),
|
|
290
|
+
borderStrong = Color.parseColor("#33FFFFFF"),
|
|
291
|
+
overlay = Color.parseColor("#73000000"),
|
|
292
|
+
overlayStrong = Color.parseColor("#AD000000"),
|
|
293
|
+
accent = Color.parseColor("#4A56FF"),
|
|
294
|
+
success = Color.parseColor("#34D399"),
|
|
295
|
+
error = Color.parseColor("#FF5B5B"),
|
|
296
|
+
warning = Color.parseColor("#FBBF24")
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
var typography = CameraThemeTypography("System", 18f, 16f, 13f, 14f)
|
|
300
|
+
var spacing = CameraThemeSpacing(4, 8, 12, 16, 20, 24)
|
|
301
|
+
var borderRadius = CameraThemeBorderRadius(6f, 12f, 16f, 20f, 999f, 999f)
|
|
302
|
+
|
|
303
|
+
if (jsonString != null && jsonString.startsWith("{")) {
|
|
304
|
+
try {
|
|
305
|
+
val root = JSONObject(jsonString)
|
|
306
|
+
val colorsObj = root.optJSONObject("colors")
|
|
307
|
+
if (colorsObj != null) {
|
|
308
|
+
colors = CameraThemeColors(
|
|
309
|
+
background = parseColor(colorsObj.optString("background"), colors.background),
|
|
310
|
+
surface = parseColor(colorsObj.optString("surface"), colors.surface),
|
|
311
|
+
surfaceMuted = parseColor(colorsObj.optString("surfaceMuted"), colors.surfaceMuted),
|
|
312
|
+
surfaceElevated = parseColor(colorsObj.optString("surfaceElevated"), colors.surfaceElevated),
|
|
313
|
+
primary = parseColor(colorsObj.optString("primary"), colors.primary),
|
|
314
|
+
primaryContrast = parseColor(colorsObj.optString("primaryContrast"), colors.primaryContrast),
|
|
315
|
+
text = parseColor(colorsObj.optString("text"), colors.text),
|
|
316
|
+
textMuted = parseColor(colorsObj.optString("textMuted"), colors.textMuted),
|
|
317
|
+
textSecondary = parseColor(colorsObj.optString("textSecondary"), colors.textSecondary),
|
|
318
|
+
border = parseColor(colorsObj.optString("border"), colors.border),
|
|
319
|
+
borderStrong = parseColor(colorsObj.optString("borderStrong"), colors.borderStrong),
|
|
320
|
+
overlay = parseColor(colorsObj.optString("overlay"), colors.overlay),
|
|
321
|
+
overlayStrong = parseColor(colorsObj.optString("overlayStrong"), colors.overlayStrong),
|
|
322
|
+
accent = parseColor(colorsObj.optString("accent"), colors.accent),
|
|
323
|
+
success = parseColor(colorsObj.optString("success"), colors.success),
|
|
324
|
+
error = parseColor(colorsObj.optString("error"), colors.error),
|
|
325
|
+
warning = parseColor(colorsObj.optString("warning"), colors.warning)
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
val typeObj = root.optJSONObject("typography")
|
|
329
|
+
if (typeObj != null) {
|
|
330
|
+
typography = CameraThemeTypography(
|
|
331
|
+
fontFamily = typeObj.optString("fontFamily", typography.fontFamily),
|
|
332
|
+
headingSize = typeObj.optDouble("headingSize", typography.headingSize.toDouble()).toFloat(),
|
|
333
|
+
bodySize = typeObj.optDouble("bodySize", typography.bodySize.toDouble()).toFloat(),
|
|
334
|
+
captionSize = typeObj.optDouble("captionSize", typography.captionSize.toDouble()).toFloat(),
|
|
335
|
+
buttonSize = typeObj.optDouble("buttonSize", typography.buttonSize.toDouble()).toFloat()
|
|
336
|
+
)
|
|
337
|
+
}
|
|
338
|
+
val spaceObj = root.optJSONObject("spacing")
|
|
339
|
+
if (spaceObj != null) {
|
|
340
|
+
spacing = CameraThemeSpacing(
|
|
341
|
+
xs = spaceObj.optInt("xs", spacing.xs),
|
|
342
|
+
sm = spaceObj.optInt("sm", spacing.sm),
|
|
343
|
+
md = spaceObj.optInt("md", spacing.md),
|
|
344
|
+
lg = spaceObj.optInt("lg", spacing.lg),
|
|
345
|
+
xl = spaceObj.optInt("xl", spacing.xl),
|
|
346
|
+
xxl = spaceObj.optInt("xxl", spacing.xxl)
|
|
347
|
+
)
|
|
348
|
+
}
|
|
349
|
+
val borderObj = root.optJSONObject("borderRadius")
|
|
350
|
+
if (borderObj != null) {
|
|
351
|
+
borderRadius = CameraThemeBorderRadius(
|
|
352
|
+
sm = borderObj.optDouble("sm", borderRadius.sm.toDouble()).toFloat(),
|
|
353
|
+
md = borderObj.optDouble("md", borderRadius.md.toDouble()).toFloat(),
|
|
354
|
+
lg = borderObj.optDouble("lg", borderRadius.lg.toDouble()).toFloat(),
|
|
355
|
+
xl = borderObj.optDouble("xl", borderRadius.xl.toDouble()).toFloat(),
|
|
356
|
+
pill = borderObj.optDouble("pill", borderRadius.pill.toDouble()).toFloat(),
|
|
357
|
+
circle = borderObj.optDouble("circle", borderRadius.circle.toDouble()).toFloat()
|
|
358
|
+
)
|
|
359
|
+
}
|
|
360
|
+
} catch (e: Exception) {
|
|
361
|
+
// Fallback to default on parse error
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Flatten the theme's `components` section into per-component
|
|
366
|
+
// key→string maps consumed via componentColor()/componentValue().
|
|
367
|
+
val componentOverrides = mutableMapOf<String, Map<String, String>>()
|
|
368
|
+
if (jsonString != null && jsonString.startsWith("{")) {
|
|
369
|
+
try {
|
|
370
|
+
JSONObject(jsonString).optJSONObject("components")?.let { comps ->
|
|
371
|
+
for (compName in comps.keys()) {
|
|
372
|
+
val comp = comps.optJSONObject(compName) ?: continue
|
|
373
|
+
val entries = mutableMapOf<String, String>()
|
|
374
|
+
for (key in comp.keys()) {
|
|
375
|
+
comp.opt(key)?.let { value ->
|
|
376
|
+
if (value !is JSONObject) entries[key] = value.toString()
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
componentOverrides[compName] = entries
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
} catch (e: Exception) {
|
|
383
|
+
// Ignore malformed components; scoped lookups fall back to defaults
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return CameraTheme(
|
|
388
|
+
colors, typography, spacing, borderRadius,
|
|
389
|
+
loadConfig(context), componentOverrides
|
|
390
|
+
)
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Parse the white-label extras JSON stored by `setCameraConfig`. Any
|
|
395
|
+
* missing/malformed section degrades to [CameraConfig.DEFAULT] values.
|
|
396
|
+
*/
|
|
397
|
+
fun loadConfig(context: Context): CameraConfig {
|
|
398
|
+
val prefs = context.getSharedPreferences("CameraSettings", Context.MODE_PRIVATE)
|
|
399
|
+
val jsonString = prefs.getString("cameraConfig", null)
|
|
400
|
+
?: return CameraConfig.DEFAULT
|
|
401
|
+
if (!jsonString.startsWith("{")) return CameraConfig.DEFAULT
|
|
402
|
+
|
|
403
|
+
return try {
|
|
404
|
+
val root = JSONObject(jsonString)
|
|
405
|
+
|
|
406
|
+
var globalIconTint: Int? = null
|
|
407
|
+
val iconOverrides = mutableMapOf<String, CameraIconStyle>()
|
|
408
|
+
root.optJSONObject("icons")?.let { icons ->
|
|
409
|
+
globalIconTint = tryParseColor(icons.optString("tintColor"))
|
|
410
|
+
icons.optJSONObject("overrides")?.let { overrides ->
|
|
411
|
+
for (name in overrides.keys()) {
|
|
412
|
+
val o = overrides.optJSONObject(name) ?: continue
|
|
413
|
+
iconOverrides[name] = CameraIconStyle(
|
|
414
|
+
tintColor = tryParseColor(o.optString("tintColor")),
|
|
415
|
+
sizeDp = if (o.has("size")) o.optInt("size") else null,
|
|
416
|
+
resourceName = o.optString("resourceName")
|
|
417
|
+
.takeIf { it.isNotEmpty() },
|
|
418
|
+
svg = o.optString("svg").takeIf { it.isNotEmpty() }
|
|
419
|
+
)
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
val animationDurations = mutableMapOf<String, Long>()
|
|
425
|
+
var animationsDisabled = false
|
|
426
|
+
root.optJSONObject("animations")?.let { anims ->
|
|
427
|
+
animationsDisabled = anims.optBoolean("disableAnimations", false)
|
|
428
|
+
for (key in anims.keys()) {
|
|
429
|
+
if (key == "disableAnimations") continue
|
|
430
|
+
animationDurations[key] = anims.optLong(key)
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
val dimensionOverrides = mutableMapOf<String, Int>()
|
|
435
|
+
root.optJSONObject("dimensions")?.let { dims ->
|
|
436
|
+
for (key in dims.keys()) {
|
|
437
|
+
dimensionOverrides[key] = dims.optInt(key)
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
val defaults = CameraConfig.DEFAULT.notifications
|
|
442
|
+
val notifications = root.optJSONObject("notifications")?.let { n ->
|
|
443
|
+
CameraConfig.NotificationConfig(
|
|
444
|
+
progressChannelId = n.optString("progressChannelId")
|
|
445
|
+
.takeIf { it.isNotEmpty() } ?: defaults.progressChannelId,
|
|
446
|
+
progressChannelName = n.optString("progressChannelName")
|
|
447
|
+
.takeIf { it.isNotEmpty() },
|
|
448
|
+
resultChannelId = n.optString("resultChannelId")
|
|
449
|
+
.takeIf { it.isNotEmpty() } ?: defaults.resultChannelId,
|
|
450
|
+
resultChannelName = n.optString("resultChannelName")
|
|
451
|
+
.takeIf { it.isNotEmpty() },
|
|
452
|
+
accentColor = tryParseColor(n.optString("accentColor")),
|
|
453
|
+
smallIconResourceName = n.optString("smallIconResourceName")
|
|
454
|
+
.takeIf { it.isNotEmpty() }
|
|
455
|
+
)
|
|
456
|
+
} ?: defaults
|
|
457
|
+
|
|
458
|
+
val gif = root.optJSONObject("gif")?.let { g ->
|
|
459
|
+
CameraConfig.GifConfig(
|
|
460
|
+
provider = g.optString("provider").takeIf { it.isNotEmpty() },
|
|
461
|
+
apiKey = g.optString("apiKey").takeIf { it.isNotEmpty() }
|
|
462
|
+
)
|
|
463
|
+
} ?: CameraConfig.DEFAULT.gif
|
|
464
|
+
|
|
465
|
+
CameraConfig(
|
|
466
|
+
globalIconTint = globalIconTint,
|
|
467
|
+
iconOverrides = iconOverrides,
|
|
468
|
+
animationDurations = animationDurations,
|
|
469
|
+
animationsDisabled = animationsDisabled,
|
|
470
|
+
dimensionOverrides = dimensionOverrides,
|
|
471
|
+
notifications = notifications,
|
|
472
|
+
gif = gif
|
|
473
|
+
)
|
|
474
|
+
} catch (e: Exception) {
|
|
475
|
+
CameraConfig.DEFAULT
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|