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,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Schema versioning & migrations for the encrypted media database.
|
|
5
|
+
*
|
|
6
|
+
* Versioning uses SQLite's built-in `PRAGMA user_version`. On every open,
|
|
7
|
+
* `runMigrations` reads the current version and applies — inside a single
|
|
8
|
+
* transaction — every migration whose target version is greater than it, in
|
|
9
|
+
* ascending order. Adding a new schema change is a matter of appending one more
|
|
10
|
+
* entry to `MIGRATIONS`; never edit or reorder existing entries.
|
|
11
|
+
*/
|
|
12
|
+
import { MEDIA_TABLE, MediaColumns } from "./types.js";
|
|
13
|
+
|
|
14
|
+
/** A single forward migration step. */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Ordered list of migrations. `LATEST_SCHEMA_VERSION` is derived from the last
|
|
18
|
+
* entry, so bumping the schema only requires appending a new `Migration`.
|
|
19
|
+
*/
|
|
20
|
+
export const MIGRATIONS = [{
|
|
21
|
+
version: 1,
|
|
22
|
+
description: 'Initial media table with type/source indexes',
|
|
23
|
+
statements: [`CREATE TABLE IF NOT EXISTS ${MEDIA_TABLE} (
|
|
24
|
+
${MediaColumns.id} TEXT PRIMARY KEY NOT NULL,
|
|
25
|
+
${MediaColumns.mediaType} TEXT NOT NULL CHECK (${MediaColumns.mediaType} IN ('image','video')),
|
|
26
|
+
${MediaColumns.source} TEXT NOT NULL CHECK (${MediaColumns.source} IN ('camera','gallery')),
|
|
27
|
+
${MediaColumns.filePath} TEXT NOT NULL,
|
|
28
|
+
${MediaColumns.fileName} TEXT NOT NULL,
|
|
29
|
+
${MediaColumns.fileSize} INTEGER,
|
|
30
|
+
${MediaColumns.width} INTEGER,
|
|
31
|
+
${MediaColumns.height} INTEGER,
|
|
32
|
+
${MediaColumns.duration} INTEGER,
|
|
33
|
+
${MediaColumns.mimeType} TEXT,
|
|
34
|
+
${MediaColumns.createdAt} INTEGER NOT NULL,
|
|
35
|
+
${MediaColumns.updatedAt} INTEGER NOT NULL
|
|
36
|
+
);`, `CREATE INDEX IF NOT EXISTS idx_media_type
|
|
37
|
+
ON ${MEDIA_TABLE} (${MediaColumns.mediaType});`, `CREATE INDEX IF NOT EXISTS idx_media_created_at
|
|
38
|
+
ON ${MEDIA_TABLE} (${MediaColumns.createdAt} DESC);`,
|
|
39
|
+
// Non-unique: speeds up delete-by-path without rejecting a re-selected
|
|
40
|
+
// file that arrives under a new id (dedup is keyed on the primary id).
|
|
41
|
+
`CREATE INDEX IF NOT EXISTS idx_media_file_path
|
|
42
|
+
ON ${MEDIA_TABLE} (${MediaColumns.filePath});`]
|
|
43
|
+
}, {
|
|
44
|
+
version: 2,
|
|
45
|
+
description: 'Composite (media_type, created_at DESC) index for the filtered+ordered list query',
|
|
46
|
+
statements: [
|
|
47
|
+
// The Photos/Videos filters run `WHERE media_type = ? ORDER BY created_at DESC`
|
|
48
|
+
// (see MediaRepository.getAll). The single-column idx_media_type filters but then
|
|
49
|
+
// forces a sort of the matching rows on every query; the single-column
|
|
50
|
+
// idx_media_created_at orders but can't also filter. A composite index lets SQLite
|
|
51
|
+
// satisfy BOTH the equality filter and the ordering from one index — no separate
|
|
52
|
+
// sort step — which keeps the filtered list fast as the library grows into the
|
|
53
|
+
// thousands. Purely additive (CREATE INDEX IF NOT EXISTS): no data change, and the
|
|
54
|
+
// unfiltered "All" query keeps using idx_media_created_at.
|
|
55
|
+
`CREATE INDEX IF NOT EXISTS idx_media_type_created_at
|
|
56
|
+
ON ${MEDIA_TABLE} (${MediaColumns.mediaType}, ${MediaColumns.createdAt} DESC);`]
|
|
57
|
+
}, {
|
|
58
|
+
version: 3,
|
|
59
|
+
description: 'Widen media_type to include document + audio, and reclassify legacy rows by MIME/extension',
|
|
60
|
+
// SQLite cannot ALTER a CHECK constraint in place, so the table is rebuilt.
|
|
61
|
+
// The copy step reclassifies rows the old two-kind schema was forced to store
|
|
62
|
+
// as `image`: a picked PDF/track kept its real MIME (e.g. application/pdf,
|
|
63
|
+
// audio/mpeg) even though media_type was clamped to 'image', so we recover the
|
|
64
|
+
// correct kind here from mime_type (then the file extension as a fallback).
|
|
65
|
+
statements: [
|
|
66
|
+
// 1. Park the current table out of the way (its indexes move with it).
|
|
67
|
+
`ALTER TABLE ${MEDIA_TABLE} RENAME TO ${MEDIA_TABLE}_legacy_v2;`,
|
|
68
|
+
// 2. Recreate the table with the widened media_type CHECK constraint.
|
|
69
|
+
`CREATE TABLE ${MEDIA_TABLE} (
|
|
70
|
+
${MediaColumns.id} TEXT PRIMARY KEY NOT NULL,
|
|
71
|
+
${MediaColumns.mediaType} TEXT NOT NULL CHECK (${MediaColumns.mediaType} IN ('image','video','document','audio')),
|
|
72
|
+
${MediaColumns.source} TEXT NOT NULL CHECK (${MediaColumns.source} IN ('camera','gallery')),
|
|
73
|
+
${MediaColumns.filePath} TEXT NOT NULL,
|
|
74
|
+
${MediaColumns.fileName} TEXT NOT NULL,
|
|
75
|
+
${MediaColumns.fileSize} INTEGER,
|
|
76
|
+
${MediaColumns.width} INTEGER,
|
|
77
|
+
${MediaColumns.height} INTEGER,
|
|
78
|
+
${MediaColumns.duration} INTEGER,
|
|
79
|
+
${MediaColumns.mimeType} TEXT,
|
|
80
|
+
${MediaColumns.createdAt} INTEGER NOT NULL,
|
|
81
|
+
${MediaColumns.updatedAt} INTEGER NOT NULL
|
|
82
|
+
);`,
|
|
83
|
+
// 3. Copy rows over, reclassifying media_type from mime_type / file extension.
|
|
84
|
+
`INSERT INTO ${MEDIA_TABLE} (
|
|
85
|
+
${MediaColumns.id}, ${MediaColumns.mediaType}, ${MediaColumns.source},
|
|
86
|
+
${MediaColumns.filePath}, ${MediaColumns.fileName}, ${MediaColumns.fileSize},
|
|
87
|
+
${MediaColumns.width}, ${MediaColumns.height}, ${MediaColumns.duration},
|
|
88
|
+
${MediaColumns.mimeType}, ${MediaColumns.createdAt}, ${MediaColumns.updatedAt}
|
|
89
|
+
)
|
|
90
|
+
SELECT
|
|
91
|
+
${MediaColumns.id},
|
|
92
|
+
CASE
|
|
93
|
+
WHEN ${MediaColumns.mediaType} = 'video' THEN 'video'
|
|
94
|
+
WHEN ${MediaColumns.mimeType} LIKE 'video/%' THEN 'video'
|
|
95
|
+
WHEN ${MediaColumns.mimeType} LIKE 'audio/%' THEN 'audio'
|
|
96
|
+
WHEN ${MediaColumns.mimeType} LIKE 'image/%' THEN 'image'
|
|
97
|
+
WHEN ${MediaColumns.mimeType} = 'application/pdf'
|
|
98
|
+
OR ${MediaColumns.mimeType} LIKE 'application/vnd.%'
|
|
99
|
+
OR ${MediaColumns.mimeType} LIKE 'application/msword%'
|
|
100
|
+
OR ${MediaColumns.mimeType} LIKE 'application/rtf%'
|
|
101
|
+
OR ${MediaColumns.mimeType} = 'application/epub+zip'
|
|
102
|
+
OR ${MediaColumns.mimeType} LIKE 'text/%' THEN 'document'
|
|
103
|
+
WHEN lower(${MediaColumns.fileName}) LIKE '%.mp4'
|
|
104
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.mov'
|
|
105
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.mkv'
|
|
106
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.webm'
|
|
107
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.3gp'
|
|
108
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.m4v' THEN 'video'
|
|
109
|
+
WHEN lower(${MediaColumns.fileName}) LIKE '%.mp3'
|
|
110
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.wav'
|
|
111
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.aac'
|
|
112
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.m4a'
|
|
113
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.ogg'
|
|
114
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.flac'
|
|
115
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.opus'
|
|
116
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.amr' THEN 'audio'
|
|
117
|
+
WHEN lower(${MediaColumns.fileName}) LIKE '%.pdf'
|
|
118
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.doc'
|
|
119
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.docx'
|
|
120
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.xls'
|
|
121
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.xlsx'
|
|
122
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.ppt'
|
|
123
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.pptx'
|
|
124
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.txt'
|
|
125
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.csv'
|
|
126
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.rtf'
|
|
127
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.odt'
|
|
128
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.ods'
|
|
129
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.odp'
|
|
130
|
+
OR lower(${MediaColumns.fileName}) LIKE '%.epub' THEN 'document'
|
|
131
|
+
ELSE 'image'
|
|
132
|
+
END,
|
|
133
|
+
${MediaColumns.source}, ${MediaColumns.filePath}, ${MediaColumns.fileName},
|
|
134
|
+
${MediaColumns.fileSize}, ${MediaColumns.width}, ${MediaColumns.height},
|
|
135
|
+
${MediaColumns.duration}, ${MediaColumns.mimeType}, ${MediaColumns.createdAt},
|
|
136
|
+
${MediaColumns.updatedAt}
|
|
137
|
+
FROM ${MEDIA_TABLE}_legacy_v2;`,
|
|
138
|
+
// 4. Drop the legacy table (this also drops its now-orphaned indexes,
|
|
139
|
+
// freeing the index names for recreation below).
|
|
140
|
+
`DROP TABLE ${MEDIA_TABLE}_legacy_v2;`,
|
|
141
|
+
// 5. Recreate every index on the rebuilt table.
|
|
142
|
+
`CREATE INDEX IF NOT EXISTS idx_media_type
|
|
143
|
+
ON ${MEDIA_TABLE} (${MediaColumns.mediaType});`, `CREATE INDEX IF NOT EXISTS idx_media_created_at
|
|
144
|
+
ON ${MEDIA_TABLE} (${MediaColumns.createdAt} DESC);`, `CREATE INDEX IF NOT EXISTS idx_media_file_path
|
|
145
|
+
ON ${MEDIA_TABLE} (${MediaColumns.filePath});`, `CREATE INDEX IF NOT EXISTS idx_media_type_created_at
|
|
146
|
+
ON ${MEDIA_TABLE} (${MediaColumns.mediaType}, ${MediaColumns.createdAt} DESC);`]
|
|
147
|
+
}, {
|
|
148
|
+
version: 4,
|
|
149
|
+
description: 'Add size_is_display_estimate flag: true when file_size is a compressed video’s proportional display figure, not the exact bytes on disk',
|
|
150
|
+
// Purely additive. Existing rows get NULL (read back as false), so nothing
|
|
151
|
+
// that was stored before this column re-stats differently. Only compressed
|
|
152
|
+
// videos published from the editor set it to 1 (see CameraAsset.sizeIsDisplayEstimate).
|
|
153
|
+
statements: [`ALTER TABLE ${MEDIA_TABLE} ADD COLUMN ${MediaColumns.sizeIsDisplayEstimate} INTEGER;`]
|
|
154
|
+
}];
|
|
155
|
+
|
|
156
|
+
/** The schema version the app expects after all migrations are applied. */
|
|
157
|
+
export const LATEST_SCHEMA_VERSION = MIGRATIONS.length > 0 ? MIGRATIONS[MIGRATIONS.length - 1].version : 0;
|
|
158
|
+
|
|
159
|
+
/** Minimal executor contract so migrations don't depend on the concrete manager. */
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Applies all pending migrations. Safe to call on every launch — a fully
|
|
163
|
+
* up-to-date database performs only a cheap version read and returns.
|
|
164
|
+
*
|
|
165
|
+
* @returns the schema version after migration.
|
|
166
|
+
*/
|
|
167
|
+
export async function runMigrations(executor) {
|
|
168
|
+
const currentVersion = await executor.getVersion();
|
|
169
|
+
if (currentVersion >= LATEST_SCHEMA_VERSION) {
|
|
170
|
+
return currentVersion;
|
|
171
|
+
}
|
|
172
|
+
const pending = MIGRATIONS.filter(m => m.version > currentVersion).sort((a, b) => a.version - b.version);
|
|
173
|
+
for (const migration of pending) {
|
|
174
|
+
// Each migration is atomic: the DDL statements and the version bump land in
|
|
175
|
+
// one transaction, or the whole step rolls back and the next launch retries.
|
|
176
|
+
await executor.runBatch([...migration.statements, `PRAGMA user_version = ${Math.floor(migration.version)};`]);
|
|
177
|
+
}
|
|
178
|
+
return LATEST_SCHEMA_VERSION;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MEDIA_TABLE","MediaColumns","MIGRATIONS","version","description","statements","id","mediaType","source","filePath","fileName","fileSize","width","height","duration","mimeType","createdAt","updatedAt","sizeIsDisplayEstimate","LATEST_SCHEMA_VERSION","length","runMigrations","executor","currentVersion","getVersion","pending","filter","m","sort","a","b","migration","runBatch","Math","floor"],"sourceRoot":"..\\..\\..\\src","sources":["db/migrations.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"..\\..\\..\\src","sources":["db/react-native-sqlcipher.d.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Encryption-key provisioning for the SQLCipher database.
|
|
5
|
+
*
|
|
6
|
+
* Strategy (most secure first):
|
|
7
|
+
* 1. Native `SecureKeyModule` (Android) — generates a cryptographically random
|
|
8
|
+
* 256-bit key on first launch and persists it in `EncryptedSharedPreferences`,
|
|
9
|
+
* which is sealed by a master key held in the Android Keystore. The raw key
|
|
10
|
+
* material therefore never lives in the JS bundle or in plaintext on disk.
|
|
11
|
+
* 2. Fallback — a locally derived key used only when the native module is
|
|
12
|
+
* unavailable (web, iOS without the native helper, or an older build). This
|
|
13
|
+
* keeps the app functional but is NOT hardware-backed; see the warning below.
|
|
14
|
+
*
|
|
15
|
+
* The resolved key is cached in-memory for the process lifetime so the native
|
|
16
|
+
* bridge is hit at most once.
|
|
17
|
+
*/
|
|
18
|
+
import { NativeModules, Platform } from 'react-native';
|
|
19
|
+
|
|
20
|
+
/** Shape of the optional native key module. */
|
|
21
|
+
|
|
22
|
+
const nativeKeyModule = NativeModules.SecureKeyModule;
|
|
23
|
+
let cachedKey = null;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Deterministic fallback key. Used ONLY when no native Keystore-backed module is
|
|
27
|
+
* present. It is intentionally derived (not a bare literal) but, because it is
|
|
28
|
+
* reconstructable from the bundle, it does not provide hardware-backed secrecy.
|
|
29
|
+
* On Android the native module supersedes this path.
|
|
30
|
+
*/
|
|
31
|
+
function deriveFallbackKey() {
|
|
32
|
+
// A stable, app-scoped seed combined into a 64-hex-char (256-bit) string.
|
|
33
|
+
const seed = `rncc.media.${Platform.OS}.v1.9f3ac21e-secure-media-store`;
|
|
34
|
+
let h1 = 0x811c9dc5;
|
|
35
|
+
let h2 = 0xc2b2ae35;
|
|
36
|
+
for (let i = 0; i < seed.length; i++) {
|
|
37
|
+
const c = seed.charCodeAt(i);
|
|
38
|
+
h1 = Math.imul(h1 ^ c, 0x01000193) >>> 0;
|
|
39
|
+
h2 = Math.imul(h2 ^ c, 0x85ebca77) >>> 0;
|
|
40
|
+
}
|
|
41
|
+
// Expand the two 32-bit hashes into 64 hex chars deterministically.
|
|
42
|
+
let out = '';
|
|
43
|
+
let a = h1 >>> 0;
|
|
44
|
+
let b = h2 >>> 0;
|
|
45
|
+
for (let i = 0; i < 8; i++) {
|
|
46
|
+
a = Math.imul(a, 0x9e3779b1) + 0x7f4a7c15 >>> 0;
|
|
47
|
+
b = Math.imul(b, 0x85ebca6b) + 0xc2b2ae35 >>> 0;
|
|
48
|
+
out += a.toString(16).padStart(8, '0');
|
|
49
|
+
out += b.toString(16).padStart(8, '0');
|
|
50
|
+
}
|
|
51
|
+
return out.slice(0, 64);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the SQLCipher passphrase, preferring the hardware-backed native key.
|
|
56
|
+
* The result is memoized for the lifetime of the JS runtime.
|
|
57
|
+
*/
|
|
58
|
+
export async function getDatabaseKey() {
|
|
59
|
+
if (cachedKey) return cachedKey;
|
|
60
|
+
if (nativeKeyModule?.getOrCreateDatabaseKey) {
|
|
61
|
+
try {
|
|
62
|
+
const key = await nativeKeyModule.getOrCreateDatabaseKey();
|
|
63
|
+
if (key && key.length >= 16) {
|
|
64
|
+
cachedKey = key;
|
|
65
|
+
return cachedKey;
|
|
66
|
+
}
|
|
67
|
+
console.warn('[SecureKey] Native module returned an unusable key; using fallback.');
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.warn('[SecureKey] Native key retrieval failed; using fallback.', error);
|
|
70
|
+
}
|
|
71
|
+
} else if (Platform.OS === 'android') {
|
|
72
|
+
console.warn('[SecureKey] SecureKeyModule not linked. Rebuild the Android app to enable ' + 'Keystore-backed encryption; using derived fallback key for now.');
|
|
73
|
+
}
|
|
74
|
+
cachedKey = deriveFallbackKey();
|
|
75
|
+
return cachedKey;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** True when the hardware-backed native key module is available. */
|
|
79
|
+
export function isHardwareBackedKeyAvailable() {
|
|
80
|
+
return Boolean(nativeKeyModule?.getOrCreateDatabaseKey);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Test/hot-reload helper: clears the in-memory key cache. */
|
|
84
|
+
export function __resetDatabaseKeyCache() {
|
|
85
|
+
cachedKey = null;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=secureKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","nativeKeyModule","SecureKeyModule","cachedKey","deriveFallbackKey","seed","OS","h1","h2","i","length","c","charCodeAt","Math","imul","out","a","b","toString","padStart","slice","getDatabaseKey","getOrCreateDatabaseKey","key","console","warn","error","isHardwareBackedKeyAvailable","Boolean","__resetDatabaseKeyCache"],"sourceRoot":"..\\..\\..\\src","sources":["db/secureKey.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;;AAEtD;;AAKA,MAAMC,eAAkD,GACtDF,aAAa,CACbG,eAAe;AAEjB,IAAIC,SAAwB,GAAG,IAAI;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iBAAiBA,CAAA,EAAW;EACnC;EACA,MAAMC,IAAI,GAAG,cAAcL,QAAQ,CAACM,EAAE,iCAAiC;EACvE,IAAIC,EAAE,GAAG,UAAU;EACnB,IAAIC,EAAE,GAAG,UAAU;EACnB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,CAACK,MAAM,EAAED,CAAC,EAAE,EAAE;IACpC,MAAME,CAAC,GAAGN,IAAI,CAACO,UAAU,CAACH,CAAC,CAAC;IAC5BF,EAAE,GAAGM,IAAI,CAACC,IAAI,CAACP,EAAE,GAAGI,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;IACxCH,EAAE,GAAGK,IAAI,CAACC,IAAI,CAACN,EAAE,GAAGG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;EAC1C;EACA;EACA,IAAII,GAAG,GAAG,EAAE;EACZ,IAAIC,CAAC,GAAGT,EAAE,KAAK,CAAC;EAChB,IAAIU,CAAC,GAAGT,EAAE,KAAK,CAAC;EAChB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;IAC1BO,CAAC,GAAIH,IAAI,CAACC,IAAI,CAACE,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,KAAM,CAAC;IACjDC,CAAC,GAAIJ,IAAI,CAACC,IAAI,CAACG,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,KAAM,CAAC;IACjDF,GAAG,IAAIC,CAAC,CAACE,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACtCJ,GAAG,IAAIE,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EACxC;EACA,OAAOJ,GAAG,CAACK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACzB;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeC,cAAcA,CAAA,EAAoB;EACtD,IAAIlB,SAAS,EAAE,OAAOA,SAAS;EAE/B,IAAIF,eAAe,EAAEqB,sBAAsB,EAAE;IAC3C,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMtB,eAAe,CAACqB,sBAAsB,CAAC,CAAC;MAC1D,IAAIC,GAAG,IAAIA,GAAG,CAACb,MAAM,IAAI,EAAE,EAAE;QAC3BP,SAAS,GAAGoB,GAAG;QACf,OAAOpB,SAAS;MAClB;MACAqB,OAAO,CAACC,IAAI,CACV,qEACF,CAAC;IACH,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdF,OAAO,CAACC,IAAI,CACV,0DAA0D,EAC1DC,KACF,CAAC;IACH;EACF,CAAC,MAAM,IAAI1B,QAAQ,CAACM,EAAE,KAAK,SAAS,EAAE;IACpCkB,OAAO,CAACC,IAAI,CACV,4EAA4E,GAC1E,iEACJ,CAAC;EACH;EAEAtB,SAAS,GAAGC,iBAAiB,CAAC,CAAC;EAC/B,OAAOD,SAAS;AAClB;;AAEA;AACA,OAAO,SAASwB,4BAA4BA,CAAA,EAAY;EACtD,OAAOC,OAAO,CAAC3B,eAAe,EAAEqB,sBAAsB,CAAC;AACzD;;AAEA;AACA,OAAO,SAASO,uBAAuBA,CAAA,EAAS;EAC9C1B,SAAS,GAAG,IAAI;AAClB","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Strongly-typed media models for the encrypted SQLCipher database.
|
|
5
|
+
*
|
|
6
|
+
* These types describe the *persistence* shape of a media item — the exact
|
|
7
|
+
* columns stored in the `media` table — independently of the UI-facing
|
|
8
|
+
* `CameraAsset` type. Mapping between the two lives in `MediaMapper.ts`, keeping
|
|
9
|
+
* a clean separation between the database schema and the rest of the app.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Persisted media kind. Photos are normalized to `image`; documents and audio
|
|
14
|
+
* are first-class kinds so a picked PDF/track is never mis-stored as an image.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Where a media item originated. */
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A single row of the `media` table — the canonical, strongly-typed record.
|
|
21
|
+
*
|
|
22
|
+
* `null` is used (never `undefined`) for absent optional columns so the shape
|
|
23
|
+
* maps 1:1 onto SQL rows.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Fields required to insert a new media record. Timestamps are optional on
|
|
28
|
+
* input — the repository fills `createdAt`/`updatedAt` when omitted.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/** Filter used when querying the media list. */
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Aggregate counts computed directly from the database via `COUNT(*)`.
|
|
35
|
+
* Backs the filter-card counters (All / Photos / Videos / Documents / Audio).
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/** Options for ordered/paged queries against the media table. */
|
|
39
|
+
|
|
40
|
+
/** Table + column name constants — single source of truth for SQL strings. */
|
|
41
|
+
export const MEDIA_TABLE = 'media';
|
|
42
|
+
export const MediaColumns = {
|
|
43
|
+
id: 'id',
|
|
44
|
+
mediaType: 'media_type',
|
|
45
|
+
source: 'source',
|
|
46
|
+
filePath: 'file_path',
|
|
47
|
+
fileName: 'file_name',
|
|
48
|
+
fileSize: 'file_size',
|
|
49
|
+
width: 'width',
|
|
50
|
+
height: 'height',
|
|
51
|
+
duration: 'duration',
|
|
52
|
+
mimeType: 'mime_type',
|
|
53
|
+
createdAt: 'created_at',
|
|
54
|
+
updatedAt: 'updated_at',
|
|
55
|
+
sizeIsDisplayEstimate: 'size_is_display_estimate'
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MEDIA_TABLE","MediaColumns","id","mediaType","source","filePath","fileName","fileSize","width","height","duration","mimeType","createdAt","updatedAt","sizeIsDisplayEstimate"],"sourceRoot":"..\\..\\..\\src","sources":["db/types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAmCA;AACA;AACA;AACA;;AAkBA;;AAGA;AACA;AACA;AACA;;AASA;;AAWA;AACA,OAAO,MAAMA,WAAW,GAAG,OAAO;AAElC,OAAO,MAAMC,YAAY,GAAG;EAC1BC,EAAE,EAAE,IAAI;EACRC,SAAS,EAAE,YAAY;EACvBC,MAAM,EAAE,QAAQ;EAChBC,QAAQ,EAAE,WAAW;EACrBC,QAAQ,EAAE,WAAW;EACrBC,QAAQ,EAAE,WAAW;EACrBC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE,QAAQ;EAChBC,QAAQ,EAAE,UAAU;EACpBC,QAAQ,EAAE,WAAW;EACrBC,SAAS,EAAE,YAAY;EACvBC,SAAS,EAAE,YAAY;EACvBC,qBAAqB,EAAE;AACzB,CAAU","ignoreList":[]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useMediaDatabase — the clean bridge between the Media Library UI and the
|
|
5
|
+
* encrypted SQLCipher store.
|
|
6
|
+
*
|
|
7
|
+
* The screen renders `CameraAsset`s and never touches SQL: it consumes this
|
|
8
|
+
* hook's state (`assets`, `counts`, `loading`) and calls its actions
|
|
9
|
+
* (`addAssets`, `removeById`, `refresh`). Every mutation writes to SQLCipher
|
|
10
|
+
* first, then refreshes derived state from the database so the list and the
|
|
11
|
+
* filter-card counters always stay in sync with persistence.
|
|
12
|
+
*/
|
|
13
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
14
|
+
// Imported from the TurboModule directly, NOT from '../index': index re-exports this
|
|
15
|
+
// hook, so going through it would close an import cycle.
|
|
16
|
+
import CustomCamera from '../NativeCustomCamera';
|
|
17
|
+
import { initializeMediaDatabase } from "./DatabaseManager.js";
|
|
18
|
+
import { getMediaRepository } from "./MediaRepository.js";
|
|
19
|
+
import { recordToAsset } from "./MediaMapper.js";
|
|
20
|
+
const EMPTY_COUNTS = {
|
|
21
|
+
all: 0,
|
|
22
|
+
image: 0,
|
|
23
|
+
video: 0,
|
|
24
|
+
document: 0,
|
|
25
|
+
audio: 0
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* @param autoInit when true (default) the hook opens the DB and loads on mount.
|
|
29
|
+
*/
|
|
30
|
+
export function useMediaDatabase(autoInit = true) {
|
|
31
|
+
const [assets, setAssets] = useState([]);
|
|
32
|
+
const [counts, setCounts] = useState(EMPTY_COUNTS);
|
|
33
|
+
const [loading, setLoading] = useState(autoInit);
|
|
34
|
+
const [error, setError] = useState(null);
|
|
35
|
+
const mountedRef = useRef(true);
|
|
36
|
+
const repo = getMediaRepository();
|
|
37
|
+
|
|
38
|
+
/** Reloads the full list and counts from SQLCipher. */
|
|
39
|
+
const refresh = useCallback(async () => {
|
|
40
|
+
const [records, freshCounts] = await Promise.all([repo.getAll(), repo.getCounts()]);
|
|
41
|
+
if (!mountedRef.current) return;
|
|
42
|
+
setAssets(records.map(recordToAsset));
|
|
43
|
+
setCounts(freshCounts);
|
|
44
|
+
}, [repo]);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
mountedRef.current = true;
|
|
47
|
+
if (!autoInit) return;
|
|
48
|
+
(async () => {
|
|
49
|
+
try {
|
|
50
|
+
await initializeMediaDatabase();
|
|
51
|
+
await refresh();
|
|
52
|
+
} catch (err) {
|
|
53
|
+
if (mountedRef.current) {
|
|
54
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
55
|
+
}
|
|
56
|
+
// Keep the app usable even if the encrypted DB can't open (e.g. web).
|
|
57
|
+
console.warn('[useMediaDatabase] initialization failed:', err);
|
|
58
|
+
} finally {
|
|
59
|
+
if (mountedRef.current) setLoading(false);
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
return () => {
|
|
63
|
+
mountedRef.current = false;
|
|
64
|
+
};
|
|
65
|
+
}, [autoInit, refresh]);
|
|
66
|
+
const addAssets = useCallback(async (incoming, source) => {
|
|
67
|
+
if (!incoming || incoming.length === 0) return [];
|
|
68
|
+
// The repository persists ONLY assets confirmed in the Documents directory
|
|
69
|
+
// and auto-detects the origin when `source` is omitted. It returns just the
|
|
70
|
+
// records actually written (cache-only/publish-failed assets are skipped).
|
|
71
|
+
const records = await repo.insertAssets(incoming, source);
|
|
72
|
+
// Re-read from the DB so the list + counters reflect exactly what was
|
|
73
|
+
// persisted — the single source of truth.
|
|
74
|
+
await refresh();
|
|
75
|
+
return records.map(recordToAsset);
|
|
76
|
+
}, [repo, refresh]);
|
|
77
|
+
const removeById = useCallback(async id => {
|
|
78
|
+
await repo.deleteById(id);
|
|
79
|
+
await refresh();
|
|
80
|
+
}, [repo, refresh]);
|
|
81
|
+
const removeMany = useCallback(async ids => {
|
|
82
|
+
await repo.deleteMany(ids);
|
|
83
|
+
await refresh();
|
|
84
|
+
}, [repo, refresh]);
|
|
85
|
+
const secureRemoveById = useCallback(async id => {
|
|
86
|
+
const record = await repo.getById(id);
|
|
87
|
+
if (!record) return null;
|
|
88
|
+
|
|
89
|
+
// The FILE goes first. Deleting the row first would strand the media on disk
|
|
90
|
+
// with nothing left pointing at it — unreachable from the UI, but fully
|
|
91
|
+
// intact and recoverable, which is the opposite of what a delete promises.
|
|
92
|
+
let report = null;
|
|
93
|
+
try {
|
|
94
|
+
report = await CustomCamera.secureDeleteMedia(record.filePath, {
|
|
95
|
+
assetId: record.id,
|
|
96
|
+
fileName: record.fileName
|
|
97
|
+
});
|
|
98
|
+
} catch (err) {
|
|
99
|
+
// Swallowed deliberately: the row is still removed below so the item does
|
|
100
|
+
// not linger in the library, and the null report tells the caller the
|
|
101
|
+
// secure-erase guarantee was NOT met.
|
|
102
|
+
console.warn('[useMediaDatabase] secure erase failed for', id, err);
|
|
103
|
+
}
|
|
104
|
+
if (report && !report.fullySecure) {
|
|
105
|
+
console.warn('[useMediaDatabase] media removed without a verified secure erase:', JSON.stringify(report));
|
|
106
|
+
}
|
|
107
|
+
await repo.deleteById(id);
|
|
108
|
+
await refresh();
|
|
109
|
+
return report;
|
|
110
|
+
}, [repo, refresh]);
|
|
111
|
+
return {
|
|
112
|
+
assets,
|
|
113
|
+
counts,
|
|
114
|
+
loading,
|
|
115
|
+
error,
|
|
116
|
+
addAssets,
|
|
117
|
+
removeById,
|
|
118
|
+
removeMany,
|
|
119
|
+
secureRemoveById,
|
|
120
|
+
refresh
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=useMediaDatabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","useState","CustomCamera","initializeMediaDatabase","getMediaRepository","recordToAsset","EMPTY_COUNTS","all","image","video","document","audio","useMediaDatabase","autoInit","assets","setAssets","counts","setCounts","loading","setLoading","error","setError","mountedRef","repo","refresh","records","freshCounts","Promise","getAll","getCounts","current","map","err","Error","String","console","warn","addAssets","incoming","source","length","insertAssets","removeById","id","deleteById","removeMany","ids","deleteMany","secureRemoveById","record","getById","report","secureDeleteMedia","filePath","assetId","fileName","fullySecure","JSON","stringify"],"sourceRoot":"..\\..\\..\\src","sources":["db/useMediaDatabase.ts"],"mappings":"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","ignoreList":[]}
|