From 79717e4a777d2640567d5247bbe25bcbd3f1dfa5 Mon Sep 17 00:00:00 2001 From: Vojtech Novak Date: Tue, 3 Mar 2026 10:54:14 +0100 Subject: [PATCH 01/13] [fingerprint] include expo-font plugin font files in fingerprint hash computation (#43575) --- packages/@expo/fingerprint/CHANGELOG.md | 2 + .../@expo/fingerprint/build/sourcer/Expo.js | 7 + .../fingerprint/build/sourcer/Expo.js.map | 2 +- .../@expo/fingerprint/src/sourcer/Expo.ts | 16 +++ .../src/sourcer/__tests__/Expo-test.ts | 120 +++++++++++++++++- 5 files changed, 145 insertions(+), 2 deletions(-) diff --git a/packages/@expo/fingerprint/CHANGELOG.md b/packages/@expo/fingerprint/CHANGELOG.md index 3e4d5f7f627b30..765a89b86ba660 100644 --- a/packages/@expo/fingerprint/CHANGELOG.md +++ b/packages/@expo/fingerprint/CHANGELOG.md @@ -6,6 +6,8 @@ ### 🎉 New features +- Include expo-font plugin font files in fingerprint hash calculation ([#43575](https://github.com/expo/expo/pull/43575) by [@vonovak](https://github.com/vonovak)) + ### 🐛 Bug fixes ### 💡 Others diff --git a/packages/@expo/fingerprint/build/sourcer/Expo.js b/packages/@expo/fingerprint/build/sourcer/Expo.js index 3c9598805a7d1d..edfddfa3be4bdd 100644 --- a/packages/@expo/fingerprint/build/sourcer/Expo.js +++ b/packages/@expo/fingerprint/build/sourcer/Expo.js @@ -33,7 +33,14 @@ async function getExpoConfigSourcesAsync(projectRoot, config, loadedModules, opt const isAndroid = options.platforms.includes('android'); const isIos = options.platforms.includes('ios'); const splashScreenPluginProps = getConfigPluginProps(expoConfig, 'expo-splash-screen'); + const fontPluginProps = getConfigPluginProps(expoConfig, 'expo-font'); const externalFiles = [ + // expo-font files + ...(fontPluginProps?.fonts ?? []), + ...(isIos ? (fontPluginProps?.ios?.fonts ?? []) : []), + ...(isAndroid + ? (fontPluginProps?.android?.fonts ?? []).flatMap((f) => typeof f === 'string' ? [f] : (f.fontDefinitions ?? []).map((d) => d.path)) + : []), // icons expoConfig.icon, isAndroid ? expoConfig.android?.icon : undefined, diff --git a/packages/@expo/fingerprint/build/sourcer/Expo.js.map b/packages/@expo/fingerprint/build/sourcer/Expo.js.map index c0da648278185f..0eab25569742a1 100644 --- a/packages/@expo/fingerprint/build/sourcer/Expo.js.map +++ b/packages/@expo/fingerprint/build/sourcer/Expo.js.map @@ -1 +1 @@ -{"version":3,"file":"Expo.js","sourceRoot":"","sources":["../../src/sourcer/Expo.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Expo.js","sourceRoot":"","sources":["../../src/sourcer/Expo.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/@expo/fingerprint/src/sourcer/Expo.ts b/packages/@expo/fingerprint/src/sourcer/Expo.ts index a10fc194d6514e..2bc9bca198ab92 100644 --- a/packages/@expo/fingerprint/src/sourcer/Expo.ts +++ b/packages/@expo/fingerprint/src/sourcer/Expo.ts @@ -39,7 +39,23 @@ export async function getExpoConfigSourcesAsync( android?: NonNullable['splash']; ios?: NonNullable['splash']; }>(expoConfig, 'expo-splash-screen'); + const fontPluginProps = getConfigPluginProps<{ + // Type mirrors FontProps from expo-font/plugin/src/withFonts.ts + fonts?: string[]; + android?: { fonts?: (string | { fontDefinitions: { path: string }[] })[] }; + ios?: { fonts?: string[] }; + }>(expoConfig, 'expo-font'); + const externalFiles = [ + // expo-font files + ...(fontPluginProps?.fonts ?? []), + ...(isIos ? (fontPluginProps?.ios?.fonts ?? []) : []), + ...(isAndroid + ? (fontPluginProps?.android?.fonts ?? []).flatMap((f) => + typeof f === 'string' ? [f] : (f.fontDefinitions ?? []).map((d) => d.path) + ) + : []), + // icons expoConfig.icon, isAndroid ? expoConfig.android?.icon : undefined, diff --git a/packages/@expo/fingerprint/src/sourcer/__tests__/Expo-test.ts b/packages/@expo/fingerprint/src/sourcer/__tests__/Expo-test.ts index af1da632552c14..4c9e596a02cd93 100644 --- a/packages/@expo/fingerprint/src/sourcer/__tests__/Expo-test.ts +++ b/packages/@expo/fingerprint/src/sourcer/__tests__/Expo-test.ts @@ -6,7 +6,7 @@ import path from 'path'; import requireString from 'require-from-string'; import { getExpoConfigAsync } from '../../ExpoConfig'; -import { HashSourceContents } from '../../Fingerprint.types'; +import { HashSource, HashSourceContents } from '../../Fingerprint.types'; import { normalizeOptionsAsync } from '../../Options'; import { SourceSkips } from '../../sourcer/SourceSkips'; import { spawnWithIpcAsync } from '../../utils/SpawnIPC'; @@ -316,6 +316,124 @@ describe(getExpoConfigSourcesAsync, () => { ); }); + describe('fingerprint sources from expo-font plugin font files', () => { + async function getFontSources( + fontFiles: Record, + pluginProps: Record, + platform?: 'ios' | 'android' + ) { + vol.fromJSON(require('./fixtures/ExpoManaged47Project.json')); + vol.mkdirSync('/app/assets/fonts', { recursive: true }); + for (const [filePath, content] of Object.entries(fontFiles)) { + vol.writeFileSync(`/app/${filePath}`, content); + } + + const appJson = JSON.parse(vol.readFileSync('/app/app.json', 'utf8').toString()); + appJson.expo.plugins = [['expo-font', pluginProps]]; + + const configResult = JSON.stringify({ + config: { exp: appJson.expo }, + loadedModules: [], + }); + (spawnWithIpcAsync as jest.MockedFunction).mockResolvedValueOnce({ + output: [], + stdout: configResult, + message: configResult, + stderr: '', + signal: null, + status: 0, + }); + const options = await normalizeOptionsAsync( + '/app', + platform ? { platforms: [platform] } : undefined + ); + const { config, loadedModules } = await getExpoConfigAsync('/app', options); + return getExpoConfigSourcesAsync('/app', config, loadedModules, options); + } + + function expectFontSource(sources: HashSource[], filePath: string, type: string = 'file') { + expect(sources).toContainEqual( + expect.objectContaining({ + type, + filePath, + overrideHashKey: 'expoConfigExternalFile:contentsOnly', + }) + ); + } + + function expectNoFontSource(sources: HashSource[], filePath: string) { + expect(sources).not.toContainEqual(expect.objectContaining({ filePath })); + } + + it('includes platform-specific fonts and excludes cross-platform fonts', async () => { + const files = { + 'assets/fonts/SpaceMono-Regular.ttf': 'font data v1', + 'assets/fonts/SF-Pro.ttf': 'sf pro data', + 'assets/fonts/Roboto-Regular.ttf': 'roboto regular data', + 'assets/fonts/Roboto-Bold.ttf': 'roboto bold data', + }; + const pluginProps = { + fonts: ['./assets/fonts/SpaceMono-Regular.ttf'], + ios: { fonts: ['./assets/fonts/SF-Pro.ttf'] }, + android: { + fonts: [ + { + fontFamily: 'Roboto', + fontDefinitions: [ + { path: './assets/fonts/Roboto-Regular.ttf', weight: 400 }, + { path: './assets/fonts/Roboto-Bold.ttf', weight: 700 }, + ], + }, + ], + }, + }; + + const iosSources = await getFontSources(files, pluginProps, 'ios'); + expectFontSource(iosSources, 'assets/fonts/SpaceMono-Regular.ttf'); + expectFontSource(iosSources, 'assets/fonts/SF-Pro.ttf'); + expectNoFontSource(iosSources, 'assets/fonts/Roboto-Regular.ttf'); + expectNoFontSource(iosSources, 'assets/fonts/Roboto-Bold.ttf'); + + const androidSources = await getFontSources(files, pluginProps, 'android'); + expectFontSource(androidSources, 'assets/fonts/SpaceMono-Regular.ttf'); + expectFontSource(androidSources, 'assets/fonts/Roboto-Regular.ttf'); + expectFontSource(androidSources, 'assets/fonts/Roboto-Bold.ttf'); + expectNoFontSource(androidSources, 'assets/fonts/SF-Pro.ttf'); + }); + + it('includes android string font paths', async () => { + const sources = await getFontSources( + { + 'assets/fonts/SpaceMono-Regular.ttf': 'font data v1', + 'assets/fonts/Noto-Sans.ttf': 'noto sans data', + }, + { + fonts: ['./assets/fonts/SpaceMono-Regular.ttf'], + android: { fonts: ['./assets/fonts/Noto-Sans.ttf'] }, + }, + 'android' + ); + + expectFontSource(sources, 'assets/fonts/Noto-Sans.ttf'); + expectFontSource(sources, 'assets/fonts/SpaceMono-Regular.ttf'); + }); + + // When a directory path is passed to `fonts`, the config plugin resolves individual + // font files from it (filtering by extension). The fingerprint, hashes the + // entire directory — this over-hashes slightly but is safe + it('hashes entire font directory when a directory path is specified', async () => { + const sources = await getFontSources( + { + 'assets/fonts/Inter.ttf': 'inter font data', + 'assets/fonts/Roboto.otf': 'roboto font data', + }, + { fonts: ['./assets/fonts'] } + ); + + expectFontSource(sources, 'assets/fonts', 'dir'); + }); + }); + it('should contain external google service files with override hash key', async () => { vol.fromJSON(require('./fixtures/ExpoManaged47Project.json')); vol.writeFileSync('/app/google-services.json', 'JSON data'); From c6a0b6755b9dbb60900cb226926afe21f98acd6c Mon Sep 17 00:00:00 2001 From: Alan Hughes <30924086+alanjhughes@users.noreply.github.com> Date: Tue, 3 Mar 2026 11:32:27 +0000 Subject: [PATCH 02/13] [camera] Module cleanup (#43551) --- .../src/screens/Camera/GalleryScreen.tsx | 29 +++++- packages/expo-camera/android/build.gradle | 5 +- .../expo/modules/camera/CameraViewHelper.kt | 38 -------- .../expo/modules/camera/CameraViewModule.kt | 1 + .../expo/modules/camera/ExpoCameraView.kt | 3 +- .../camera/analyzers/MLKitBarcodeAnalyzer.kt | 14 +-- .../modules/camera/utils/CameraViewHelper.kt | 8 +- .../expo/modules/camera/utils/ExifTags.kt | 6 -- packages/expo-camera/build/CameraView.d.ts | 4 +- .../expo-camera/build/CameraView.d.ts.map | 2 +- packages/expo-camera/build/CameraView.js | 33 +------ packages/expo-camera/build/CameraView.js.map | 2 +- .../expo-camera/build/ExpoCamera.web.d.ts.map | 2 +- packages/expo-camera/build/ExpoCamera.web.js | 40 +++----- .../expo-camera/build/ExpoCamera.web.js.map | 2 +- .../build/ExpoCameraManager.web.d.ts.map | 2 +- .../build/ExpoCameraManager.web.js | 96 +++++-------------- .../build/ExpoCameraManager.web.js.map | 2 +- .../build/web/WebCameraUtils.d.ts.map | 2 +- .../expo-camera/build/web/WebCameraUtils.js | 35 +++---- .../build/web/WebCameraUtils.js.map | 2 +- .../build/web/useWebBarcodeScanner.d.ts.map | 2 +- .../build/web/useWebBarcodeScanner.js | 10 +- .../build/web/useWebBarcodeScanner.js.map | 2 +- .../build/web/useWebCameraStream.d.ts.map | 2 +- .../build/web/useWebCameraStream.js | 15 +-- .../build/web/useWebCameraStream.js.map | 2 +- .../expo-camera/ios/CameraViewModule.swift | 18 +--- .../Common/CameraPermissionsRequester.swift | 34 ------- .../ios/Current/BarcodeScannerUtils.swift | 2 - .../ios/Current/CameraSessionManager.swift | 14 +-- .../ios/Current/CameraVideoRecording.swift | 18 ++-- .../ios/Current/VisionScannerDelegate.swift | 2 +- packages/expo-camera/src/CameraView.tsx | 37 ++----- packages/expo-camera/src/ExpoCamera.web.tsx | 40 +++----- .../expo-camera/src/ExpoCameraManager.web.ts | 94 +++++------------- .../expo-camera/src/web/WebCameraUtils.ts | 42 +++----- .../src/web/useWebBarcodeScanner.ts | 10 +- .../expo-camera/src/web/useWebCameraStream.ts | 16 +--- 39 files changed, 178 insertions(+), 510 deletions(-) delete mode 100644 packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewHelper.kt diff --git a/apps/native-component-list/src/screens/Camera/GalleryScreen.tsx b/apps/native-component-list/src/screens/Camera/GalleryScreen.tsx index c602262c8bd1e8..744b85ab735180 100644 --- a/apps/native-component-list/src/screens/Camera/GalleryScreen.tsx +++ b/apps/native-component-list/src/screens/Camera/GalleryScreen.tsx @@ -33,18 +33,38 @@ function useLoadedPhotos() { isMounted = false; }; }, []); - return photos; + return [photos, setPhotos] as const; } export default function GalleryScreen( props: TouchableOpacityProps & { photos?: CameraCapturedPicture[] } ) { - const photos = useLoadedPhotos(); + const [photos, setPhotos] = useLoadedPhotos(); const uris = props.photos?.map((photo) => photo.uri) ?? []; - return ; + return ( + { + setPhotos((prev) => prev.filter((p) => !deleted.has(`${PHOTOS_DIR}/${p}`))); + if (props.photos) { + props.photos.splice( + 0, + props.photos.length, + ...props.photos.filter((p) => !deleted.has(p.uri)) + ); + } + }} + /> + ); } -function LoadedGalleryScreen(props: TouchableOpacityProps & { photos: string[] }) { +function LoadedGalleryScreen( + props: TouchableOpacityProps & { + photos: string[]; + onPhotosDeleted: (deleted: Set) => void; + } +) { const [selectedPhotos, setSelectedPhotos] = React.useState([]); const toggleSelection = (uri: string, isSelected: boolean) => { @@ -91,6 +111,7 @@ function LoadedGalleryScreen(props: TouchableOpacityProps & { photos: string[] } }); await Promise.all(promises); + props.onPhotosDeleted(new Set(selectedPhotos)); setSelectedPhotos([]); } else { alert('No photos to delete!'); diff --git a/packages/expo-camera/android/build.gradle b/packages/expo-camera/android/build.gradle index 9b5c7d56dc529f..02f838a8c7cb9b 100644 --- a/packages/expo-camera/android/build.gradle +++ b/packages/expo-camera/android/build.gradle @@ -18,9 +18,9 @@ android { } dependencies { - def camerax_version = "1.5.1" + def camerax_version = "1.5.3" - api "androidx.exifinterface:exifinterface:1.4.1" + api "androidx.exifinterface:exifinterface:1.4.2" api "androidx.appcompat:appcompat:1.7.1" implementation "androidx.camera:camera-core:${camerax_version}" @@ -30,6 +30,7 @@ dependencies { implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}" + implementation "androidx.core:core-ktx:1.17.0" def barcodeDependencyConfiguration = isBarcodeScannerEnabled ? "implementation" : "compileOnly" add(barcodeDependencyConfiguration, "com.google.android.gms:play-services-code-scanner:16.1.0") diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewHelper.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewHelper.kt deleted file mode 100644 index 56e5eec4cd2db1..00000000000000 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package expo.modules.camera - -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import java.io.ByteArrayOutputStream -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale - -object CameraViewHelper { - fun generateSimulatorPhoto(width: Int, height: Int): ByteArray { - val fakePhotoBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(fakePhotoBitmap) - val background = Paint().apply { - color = Color.BLACK - } - canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), background) - val textPaint = Paint().apply { - color = Color.YELLOW - textSize = 35f - } - val calendar = Calendar.getInstance() - val simpleDateFormat = SimpleDateFormat("dd.MM.yy HH:mm:ss", Locale.US) - canvas.drawText(simpleDateFormat.format(calendar.time), width * 0.1f, height * 0.9f, textPaint) - - val stream = ByteArrayOutputStream() - fakePhotoBitmap.compress(Bitmap.CompressFormat.PNG, 90, stream) - return stream.toByteArray() - } -} - -fun Bitmap.toByteArray(): ByteArray { - val stream = ByteArrayOutputStream() - this.compress(Bitmap.CompressFormat.PNG, 90, stream) - return stream.toByteArray() -} diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewModule.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewModule.kt index 7e50b98d82e9a1..21382f81b3f428 100644 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewModule.kt +++ b/packages/expo-camera/android/src/main/java/expo/modules/camera/CameraViewModule.kt @@ -22,6 +22,7 @@ import expo.modules.camera.records.VideoStabilizationMode import expo.modules.camera.tasks.ResolveTakenPicture import expo.modules.camera.tasks.writeStreamToFile import expo.modules.camera.utils.CameraUtils +import expo.modules.camera.utils.CameraViewHelper import expo.modules.core.errors.ModuleDestroyedException import expo.modules.core.utilities.EmulatorUtilities import expo.modules.core.utilities.VRUtilities diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/ExpoCameraView.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/ExpoCameraView.kt index 1ff8116fb7c756..d9690e37ebf047 100644 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/ExpoCameraView.kt +++ b/packages/expo-camera/android/src/main/java/expo/modules/camera/ExpoCameraView.kt @@ -394,8 +394,7 @@ class ExpoCameraView( else -> promise.reject( CameraExceptions.VideoRecordingFailed( - event.cause?.message - ?: "Video recording Failed: ${event.cause?.message ?: "Unknown error"}" + event.cause?.message ?: "Unknown error" ) ) } diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/MLKitBarcodeAnalyzer.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/MLKitBarcodeAnalyzer.kt index 3ba4f0a8dcb1a1..681995d2551afa 100644 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/MLKitBarcodeAnalyzer.kt +++ b/packages/expo-camera/android/src/main/java/expo/modules/camera/analyzers/MLKitBarcodeAnalyzer.kt @@ -56,19 +56,7 @@ class MLKitBarCodeScanner { } private fun areNewAndOldBarCodeTypesEqual(newBarCodeTypes: List): Boolean { - barCodeTypes?.run { - // create distinct-values sets - val prevTypesSet = toHashSet() - val nextTypesSet = newBarCodeTypes.toHashSet() - - // sets sizes are equal -> possible content equality - if (prevTypesSet.size == nextTypesSet.size) { - prevTypesSet.removeAll(nextTypesSet) - // every element from new set was in previous one -> sets are equal - return prevTypesSet.isEmpty() - } - } - return false + return barCodeTypes?.toSet() == newBarCodeTypes.toSet() } companion object { diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/CameraViewHelper.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/CameraViewHelper.kt index 8813f69449af7c..3bab0e93aa410a 100644 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/CameraViewHelper.kt +++ b/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/CameraViewHelper.kt @@ -14,9 +14,6 @@ import java.util.Locale import kotlin.math.roundToLong object CameraViewHelper { - // Utilities - - @JvmStatic fun getExifData(exifInterface: ExifInterface): Bundle { val exifMap = Bundle() for ((type, name) in exifTags) { @@ -36,7 +33,6 @@ object CameraViewHelper { return exifMap } - @JvmStatic @Throws(IllegalArgumentException::class) fun setExifData(baseExif: ExifInterface, exifMap: Map) { for ((type, name) in exifTags) { @@ -65,7 +61,6 @@ object CameraViewHelper { } } - @JvmStatic @Throws(IOException::class) fun addExifData(baseExif: ExifInterface, additionalExif: ExifInterface) { for (tagInfo in exifTags) { @@ -103,7 +98,6 @@ object CameraViewHelper { val stream = ByteArrayOutputStream() fakePhotoBitmap.compress(Bitmap.CompressFormat.PNG, 90, stream) - val fakePhotoByteArray = stream.toByteArray() - return fakePhotoByteArray + return stream.toByteArray() } } diff --git a/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/ExifTags.kt b/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/ExifTags.kt index 6f8f2334c24449..22e18bbf80b9f7 100644 --- a/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/ExifTags.kt +++ b/packages/expo-camera/android/src/main/java/expo/modules/camera/utils/ExifTags.kt @@ -2,12 +2,6 @@ package expo.modules.camera.utils import androidx.exifinterface.media.ExifInterface -const val VIDEO_2160P = 0 -const val VIDEO_1080P = 1 -const val VIDEO_720P = 2 -const val VIDEO_480P = 3 -const val VIDEO_4x3 = 4 - val exifTags = arrayOf( arrayOf("string", ExifInterface.TAG_ARTIST), arrayOf("int", ExifInterface.TAG_BITS_PER_SAMPLE), diff --git a/packages/expo-camera/build/CameraView.d.ts b/packages/expo-camera/build/CameraView.d.ts index 8b68d2e1601c42..4c8be7bf3443e4 100644 --- a/packages/expo-camera/build/CameraView.d.ts +++ b/packages/expo-camera/build/CameraView.d.ts @@ -1,5 +1,5 @@ import { type EventSubscription } from 'expo-modules-core'; -import { type Ref, Component } from 'react'; +import { Component } from 'react'; import { CameraCapturedPicture, CameraOrientation, CameraPictureOptions, CameraViewProps, CameraRecordingOptions, CameraViewRef, ScanningOptions, ScanningResult, VideoCodec, AvailableLenses } from './Camera.types'; import { PictureRef } from './PictureRef'; export default class CameraView extends Component { @@ -54,7 +54,6 @@ export default class CameraView extends Component { flash: Record; }; static defaultProps: CameraViewProps; - _cameraHandle?: number | null; _cameraRef: import("react").RefObject; _lastEvents: { [eventName: string]: string; @@ -171,7 +170,6 @@ export default class CameraView extends Component { _onObjectDetected: (callback?: Function) => ({ nativeEvent }: { nativeEvent: any; }) => void; - _setReference: (ref: Ref) => void; render(): import("react").JSX.Element; } //# sourceMappingURL=CameraView.d.ts.map \ No newline at end of file diff --git a/packages/expo-camera/build/CameraView.d.ts.map b/packages/expo-camera/build/CameraView.d.ts.map index 7ab11b322c0a5f..8bfdbbb5e2ec0a 100644 --- a/packages/expo-camera/build/CameraView.d.ts.map +++ b/packages/expo-camera/build/CameraView.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"CameraView.d.ts","sourceRoot":"","sources":["../src/CameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,KAAK,GAAG,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAEvD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA+D1C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS,CAAC,eAAe,CAAC;IAChE;;OAEG;IACH,MAAM,CAAC,+BAA+B,EAAE,OAAO,CAAiD;IAChG;;;;;OAKG;WACU,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IASjD;;;;OAIG;WACU,4BAA4B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQlE;;;;OAIG;IACG,6BAA6B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxD;;;;;OAKG;IACG,uBAAuB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlD;;OAEG;IACH,oBAAoB,IAAI;QACtB,+BAA+B,EAAE,OAAO,CAAC;QACzC,6BAA6B,EAAE,OAAO,CAAC;KACxC;IAOD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,MAAM,CAAC,gBAAgB;;;;MAAoB;IAE3C,MAAM,CAAC,YAAY,EAAE,eAAe,CAMlC;IAEF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,kDAA8B;IACxC,WAAW,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAM;IAClD,gBAAgB,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAM;IAErD;;;;;;;;;OASG;IACG,gBAAgB,CACpB,cAAc,EAAE,oBAAoB,GAAG;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,GAC1D,OAAO,CAAC,UAAU,CAAC;IAEtB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWtF;;;;;OAKG;WACU,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE;;;;OAIG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5C;;;;;;;;OAQG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,iBAAiB;IAI3F;;;;;;;;OAQG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,sBAAsB;;;IAKlD;;;;;;;;;;;;;OAaG;IACG,oBAAoB;IAI1B;;;;OAIG;IACH,aAAa;IAIb,cAAc,aAIZ;IAEF,yBAAyB,GAAI,iBAAiB;QAAE,WAAW,EAAE,eAAe,CAAA;KAAE,UAI5E;IAEF,aAAa,GAAI,iBAAiB;QAAE,WAAW,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,UAIpE;IAEF,+BAA+B,GAAI,kBAEhC;QACD,WAAW,EAAE;YAAE,WAAW,EAAE,iBAAiB,CAAA;SAAE,CAAC;KACjD,UAIC;IAEF,iBAAiB,GACd,WAAW,QAAQ,MACnB,iBAAiB;QAAE,WAAW,EAAE,GAAG,CAAA;KAAE,UAgBpC;IAEJ,aAAa,GAAI,KAAK,GAAG,CAAC,aAAa,CAAC,UAOtC;IAEF,MAAM;CA2BP"} \ No newline at end of file +{"version":3,"file":"CameraView.d.ts","sourceRoot":"","sources":["../src/CameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAE7C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA2D1C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS,CAAC,eAAe,CAAC;IAChE;;OAEG;IACH,MAAM,CAAC,+BAA+B,EAAE,OAAO,CAAiD;IAChG;;;;;OAKG;WACU,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IASjD;;;;OAIG;WACU,4BAA4B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQlE;;;;OAIG;IACG,6BAA6B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxD;;;;;OAKG;IACG,uBAAuB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlD;;OAEG;IACH,oBAAoB,IAAI;QACtB,+BAA+B,EAAE,OAAO,CAAC;QACzC,6BAA6B,EAAE,OAAO,CAAC;KACxC;IAOD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC,MAAM,CAAC,gBAAgB;;;;MAAoB;IAE3C,MAAM,CAAC,YAAY,EAAE,eAAe,CAMlC;IAEF,UAAU,kDAA8B;IACxC,WAAW,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAM;IAClD,gBAAgB,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAM;IAErD;;;;;;;;;OASG;IACG,gBAAgB,CACpB,cAAc,EAAE,oBAAoB,GAAG;QAAE,UAAU,EAAE,IAAI,CAAA;KAAE,GAC1D,OAAO,CAAC,UAAU,CAAC;IAEtB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAWtF;;;;;OAKG;WACU,aAAa,CAAC,OAAO,GAAE,eAAsC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1F;;;;OAIG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5C;;;;;;;;OAQG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,iBAAiB;IAI3F;;;;;;;;OAQG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,sBAAsB;;;IAKlD;;;;;;;;;;;;;OAaG;IACG,oBAAoB;IAI1B;;;;OAIG;IACH,aAAa;IAIb,cAAc,aAEZ;IAEF,yBAAyB,GAAI,iBAAiB;QAAE,WAAW,EAAE,eAAe,CAAA;KAAE,UAE5E;IAEF,aAAa,GAAI,iBAAiB;QAAE,WAAW,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,UAEpE;IAEF,+BAA+B,GAAI,kBAEhC;QACD,WAAW,EAAE;YAAE,WAAW,EAAE,iBAAiB,CAAA;SAAE,CAAC;KACjD,UAEC;IAEF,iBAAiB,GACd,WAAW,QAAQ,MACnB,iBAAiB;QAAE,WAAW,EAAE,GAAG,CAAA;KAAE,UAgBpC;IAEJ,MAAM;CA2BP"} \ No newline at end of file diff --git a/packages/expo-camera/build/CameraView.js b/packages/expo-camera/build/CameraView.js index 0da8747a033bf1..931d6b23b03ae0 100644 --- a/packages/expo-camera/build/CameraView.js +++ b/packages/expo-camera/build/CameraView.js @@ -26,9 +26,6 @@ function ensurePictureOptions(options) { return options; } function ensureRecordingOptions(options = {}) { - if (!options || typeof options !== 'object') { - return {}; - } if (options.mirror) { console.warn('The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'); } @@ -118,7 +115,6 @@ export default class CameraView extends Component { mode: 'picture', flash: 'off', }; - _cameraHandle; _cameraRef = createRef(); _lastEvents = {}; _lastEventsTimes = {}; @@ -135,10 +131,7 @@ export default class CameraView extends Component { * @platform android * @platform ios */ - static async launchScanner(options) { - if (!options) { - options = { barcodeTypes: [] }; - } + static async launchScanner(options = { barcodeTypes: [] }) { if (Platform.OS !== 'web' && CameraView.isModernBarcodeScannerAvailable) { await CameraManager.launchScanner(options); } @@ -204,24 +197,16 @@ export default class CameraView extends Component { this._cameraRef.current?.stopRecording(); } _onCameraReady = () => { - if (this.props.onCameraReady) { - this.props.onCameraReady(); - } + this.props.onCameraReady?.(); }; _onAvailableLensesChanged = ({ nativeEvent }) => { - if (this.props.onAvailableLensesChanged) { - this.props.onAvailableLensesChanged(nativeEvent); - } + this.props.onAvailableLensesChanged?.(nativeEvent); }; _onMountError = ({ nativeEvent }) => { - if (this.props.onMountError) { - this.props.onMountError(nativeEvent); - } + this.props.onMountError?.(nativeEvent); }; _onResponsiveOrientationChanged = ({ nativeEvent, }) => { - if (this.props.onResponsiveOrientationChanged) { - this.props.onResponsiveOrientationChanged(nativeEvent); - } + this.props.onResponsiveOrientationChanged?.(nativeEvent); }; _onObjectDetected = (callback) => ({ nativeEvent }) => { const { type } = nativeEvent; @@ -237,14 +222,6 @@ export default class CameraView extends Component { this._lastEvents[type] = JSON.stringify(nativeEvent); } }; - _setReference = (ref) => { - if (ref) { - // TODO(Bacon): Unify these - perhaps with hooks? - if (Platform.OS === 'web') { - this._cameraHandle = ref; - } - } - }; render() { const nativeProps = ensureNativeProps(this.props); const onBarcodeScanned = this.props.onBarcodeScanned diff --git a/packages/expo-camera/build/CameraView.js.map b/packages/expo-camera/build/CameraView.js.map index 9ed47fe1755b33..112b859ce69498 100644 --- a/packages/expo-camera/build/CameraView.js.map +++ b/packages/expo-camera/build/CameraView.js.map @@ -1 +1 @@ -{"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../src/CameraView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Platform, UnavailabilityError, type EventSubscription } from 'expo-modules-core';\nimport { type Ref, Component, createRef } from 'react';\n\nimport {\n CameraCapturedPicture,\n CameraOrientation,\n CameraPictureOptions,\n CameraViewProps,\n CameraRecordingOptions,\n CameraViewRef,\n ScanningOptions,\n ScanningResult,\n VideoCodec,\n AvailableLenses,\n} from './Camera.types';\nimport ExpoCamera from './ExpoCamera';\nimport CameraManager from './ExpoCameraManager';\nimport { PictureRef } from './PictureRef';\nimport { ConversionTables, ensureNativeProps } from './utils/props';\n\nconst EventThrottleMs = 500;\n\nconst _PICTURE_SAVED_CALLBACKS: Record =\n {};\n\nlet loggedRenderingChildrenWarning = false;\nlet _GLOBAL_PICTURE_ID = 1;\n\nfunction ensurePictureOptions(options?: CameraPictureOptions): CameraPictureOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.quality === undefined) {\n options.quality = 1;\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n if (options.onPictureSaved) {\n const id = _GLOBAL_PICTURE_ID++;\n _PICTURE_SAVED_CALLBACKS[id] = options.onPictureSaved;\n options.id = id;\n options.fastMode = true;\n }\n\n return options;\n}\n\nfunction ensureRecordingOptions(options: CameraRecordingOptions = {}): CameraRecordingOptions {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n if (options.mirror) {\n console.warn(\n 'The `mirror` option is deprecated. Please use the `mirror` prop on the `CameraView` instead.'\n );\n }\n\n return options;\n}\n\nfunction _onPictureSaved({\n nativeEvent,\n}: {\n nativeEvent: { data: CameraCapturedPicture; id: number };\n}) {\n const { id, data } = nativeEvent;\n const callback = _PICTURE_SAVED_CALLBACKS[id];\n if (callback) {\n callback(data);\n delete _PICTURE_SAVED_CALLBACKS[id];\n }\n}\n\nexport default class CameraView extends Component {\n /**\n * Property that determines if the current device has the ability to use `DataScannerViewController` (iOS 16+) or the Google code scanner (Android).\n */\n static isModernBarcodeScannerAvailable: boolean = CameraManager.isModernBarcodeScannerAvailable;\n /**\n * Check whether the current device has a camera. This is useful for web and simulators cases.\n * This isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\n * You will still need to check if the native permission has been accepted.\n * @platform web\n */\n static async isAvailableAsync(): Promise {\n if (!CameraManager.isAvailableAsync) {\n throw new UnavailabilityError('expo-camera', 'isAvailableAsync');\n }\n\n return CameraManager.isAvailableAsync();\n }\n\n // @needsAudit\n /**\n * Queries the device for the available video codecs that can be used in video recording.\n * @return A promise that resolves to a list of strings that represents available codecs.\n * @platform ios\n */\n static async getAvailableVideoCodecsAsync(): Promise {\n if (!CameraManager.getAvailableVideoCodecsAsync) {\n throw new UnavailabilityError('Camera', 'getAvailableVideoCodecsAsync');\n }\n\n return CameraManager.getAvailableVideoCodecsAsync();\n }\n\n /**\n * Get picture sizes that are supported by the device.\n * @return Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to `pictureSize` prop.\n * The list varies across Android devices but is the same for every iOS.\n */\n async getAvailablePictureSizesAsync(): Promise {\n return (await this._cameraRef.current?.getAvailablePictureSizes()) ?? [];\n }\n\n /**\n * Returns the available lenses for the currently selected camera.\n *\n * @return Returns a Promise that resolves to an array of strings representing the lens type that can be passed to `selectedLens` prop.\n * @platform ios\n */\n async getAvailableLensesAsync(): Promise {\n return (await this._cameraRef.current?.getAvailableLenses()) ?? [];\n }\n\n /**\n * Returns an object with the supported features of the camera on the current device.\n */\n getSupportedFeatures(): {\n isModernBarcodeScannerAvailable: boolean;\n toggleRecordingAsyncAvailable: boolean;\n } {\n return {\n isModernBarcodeScannerAvailable: CameraManager.isModernBarcodeScannerAvailable,\n toggleRecordingAsyncAvailable: CameraManager.toggleRecordingAsyncAvailable,\n };\n }\n\n /**\n * Resumes the camera preview.\n */\n async resumePreview(): Promise {\n return this._cameraRef.current?.resumePreview();\n }\n\n /**\n * Pauses the camera preview. It is not recommended to use `takePictureAsync` when preview is paused.\n */\n async pausePreview(): Promise {\n return this._cameraRef.current?.pausePreview();\n }\n\n // Values under keys from this object will be transformed to native options\n static ConversionTables = ConversionTables;\n\n static defaultProps: CameraViewProps = {\n zoom: 0,\n facing: 'back',\n enableTorch: false,\n mode: 'picture',\n flash: 'off',\n };\n\n _cameraHandle?: number | null;\n _cameraRef = createRef();\n _lastEvents: { [eventName: string]: string } = {};\n _lastEventsTimes: { [eventName: string]: Date } = {};\n\n /**\n * Takes a picture and returns an object that references the native image instance.\n * > **Note**: Make sure to wait for the [`onCameraReady`](#oncameraready) callback before calling this method.\n *\n * > **Note:** Avoid calling this method while the preview is paused. On Android, this will throw an error. On iOS, this will take a picture of the last frame that is currently on screen.\n *\n * @param optionsWithRef An object in form of `CameraPictureOptions` type and `pictureRef` key set to `true`.\n * @return Returns a Promise that resolves to `PictureRef` class which contains basic image data, and a reference to native image instance which can be passed\n * to other Expo packages supporting handling such an instance.\n */\n async takePictureAsync(\n optionsWithRef: CameraPictureOptions & { pictureRef: true }\n ): Promise;\n\n /**\n * Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n * (if `options.skipProcessing` flag is not enabled) and scaled to match the preview.\n * > **Note**: Make sure to wait for the [`onCameraReady`](#oncameraready) callback before calling this method.\n *\n * > **Note:** Avoid calling this method while the preview is paused. On Android, this will throw an error. On iOS, this will take a picture of the last frame that is currently on screen.\n *\n * @param options An object in form of `CameraPictureOptions` type.\n * @return Returns a Promise that resolves to `CameraCapturedPicture` object, where `uri` is a URI to the local image file on Android,\n * iOS, and a base64 string on web (usable as the source for an `Image` element). The `width` and `height` properties specify\n * the dimensions of the image.\n *\n * `base64` is included if the `base64` option was truthy, and is a string containing the JPEG data\n * of the image in Base64. Prepend it with `'data:image/jpg;base64,'` to get a data URI, which you can use as the source\n * for an `Image` element for example.\n *\n * `exif` is included if the `exif` option was truthy, and is an object containing EXIF\n * data for the image. The names of its properties are EXIF tags and their values are the values for those tags.\n *\n * > On native platforms, the local image URI is temporary. Use [`FileSystem.copy`](filesystem/#copydestination-1)\n * > to make a permanent copy of the image.\n */\n async takePictureAsync(options?: CameraPictureOptions): Promise;\n\n async takePictureAsync(options?: CameraPictureOptions) {\n const pictureOptions = ensurePictureOptions(options);\n\n if (Platform.OS === 'ios' && options?.pictureRef) {\n return this._cameraRef.current?.takePictureRef?.(options);\n }\n return this._cameraRef.current?.takePicture(pictureOptions);\n }\n\n /**\n * On Android, we will use the [Google code scanner](https://developers.google.com/ml-kit/vision/barcode-scanning/code-scanner).\n * On iOS, presents a modal view controller that uses the [`DataScannerViewController`](https://developer.apple.com/documentation/visionkit/scanning_data_with_the_camera) available on iOS 16+.\n * @platform android\n * @platform ios\n */\n static async launchScanner(options?: ScanningOptions): Promise {\n if (!options) {\n options = { barcodeTypes: [] };\n }\n if (Platform.OS !== 'web' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.launchScanner(options);\n }\n }\n\n /**\n * Dismiss the scanner presented by `launchScanner`.\n * > **info** On Android, the scanner is dismissed automatically when a barcode is scanned.\n * @platform ios\n */\n static async dismissScanner(): Promise {\n if (Platform.OS !== 'web' && CameraView.isModernBarcodeScannerAvailable) {\n await CameraManager.dismissScanner();\n }\n }\n\n /**\n * Invokes the `listener` function when a bar code has been successfully scanned. The callback is provided with\n * an object of the `ScanningResult` shape, where the `type` refers to the bar code type that was scanned and the `data` is the information encoded in the bar code\n * (in this case of QR codes, this is often a URL). See [`BarcodeType`](#barcodetype) for supported values.\n * @param listener Invoked with the [ScanningResult](#scanningresult) when a bar code has been successfully scanned.\n *\n * @platform ios\n * @platform android\n */\n static onModernBarcodeScanned(listener: (event: ScanningResult) => void): EventSubscription {\n return CameraManager.addListener('onModernBarcodeScanned', listener);\n }\n\n /**\n * Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\n * Flipping camera during a recording results in stopping it.\n * @param options A map of `CameraRecordingOptions` type.\n * @return Returns a Promise that resolves to an object containing video file `uri` property and a `codec` property on iOS.\n * The Promise is returned if `stopRecording` was invoked, one of `maxDuration` and `maxFileSize` is reached or camera preview is stopped.\n * @platform android\n * @platform ios\n */\n async recordAsync(options?: CameraRecordingOptions) {\n const recordingOptions = ensureRecordingOptions(options);\n return this._cameraRef.current?.record(recordingOptions);\n }\n\n /**\n * Pauses or resumes the video recording. Only has an effect if there is an active recording. On `iOS`, this method only supported on `iOS` 18.\n *\n * @example\n * ```ts\n * const { toggleRecordingAsyncAvailable } = getSupportedFeatures()\n *\n * return (\n * {toggleRecordingAsyncAvailable && (\n *