From 9eb55020764462e7055c59c734fd71c595e31b69 Mon Sep 17 00:00:00 2001 From: Krzysztof Moch Date: Sun, 20 Oct 2024 20:04:02 +0200 Subject: [PATCH] chore: rework examples (#4225) * remove unused examples * init bare example with test app * add react-native-video * add test app suport in expo plugin * expo plugin: skip keys that are already in pod file * fix podfile * add src files * fix metro config * finalize react native test app configuration * init expo example * remove old examples * add guide for example * Add link to examples apps in docs * adopt bare example to CI tests * update CI workflows * CI build lib after node_modules install * fix examples readme * fix iOS CI * Add Example for DRM * Update examples/README.md * fix links * update examples README * sync example code * update README --- .github/workflows/build-android.yml | 44 +- .github/workflows/build-ios.yml | 91 +- docs/pages/_meta.json | 5 + examples/FabricExample/.buckconfig | 6 - examples/FabricExample/.bundle/config | 2 - examples/FabricExample/.eslintrc.js | 16 - examples/FabricExample/.gitignore | 67 - examples/FabricExample/.prettierrc.js | 7 - examples/FabricExample/.ruby-version | 1 - examples/FabricExample/.watchmanconfig | 1 - examples/FabricExample/App.tsx | 19 - examples/FabricExample/Gemfile | 7 - examples/FabricExample/Gemfile.lock | 107 - examples/FabricExample/__tests__/App-test.tsx | 17 - examples/FabricExample/android/app/_BUCK | 55 - .../FabricExample/android/app/build.gradle | 123 - .../FabricExample/android/app/build_defs.bzl | 19 - .../android/app/proguard-rules.pro | 10 - .../android/app/src/main/AndroidManifest.xml | 26 - .../net/video/fabricexample/MainActivity.kt | 22 - .../video/fabricexample/MainApplication.kt | 45 - .../android/app/src/main/jni/CMakeLists.txt | 7 - .../jni/MainApplicationModuleProvider.cpp | 32 - .../main/jni/MainApplicationModuleProvider.h | 16 - ...nApplicationTurboModuleManagerDelegate.cpp | 45 - ...ainApplicationTurboModuleManagerDelegate.h | 38 - .../src/main/jni/MainComponentsRegistry.cpp | 65 - .../app/src/main/jni/MainComponentsRegistry.h | 32 - .../android/app/src/main/jni/OnLoad.cpp | 11 - .../res/drawable/rn_edit_text_material.xml | 36 - .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 9 - examples/FabricExample/android/build.gradle | 26 - .../FabricExample/android/gradle.properties | 39 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 0 bytes examples/FabricExample/android/gradlew.bat | 178 - .../FabricExample/android/settings.gradle | 11 - examples/FabricExample/app.json | 4 - examples/FabricExample/babel.config.js | 17 - examples/FabricExample/index.js | 9 - .../FabricExample.xcodeproj/project.pbxproj | 730 - .../xcschemes/FabricExample.xcscheme | 88 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../ios/FabricExample/AppDelegate.h | 6 - .../ios/FabricExample/AppDelegate.mm | 31 - .../AppIcon.appiconset/Contents.json | 53 - .../Images.xcassets/Contents.json | 6 - .../ios/FabricExample/Info.plist | 51 - .../ios/FabricExample/LaunchScreen.storyboard | 47 - .../FabricExample/ios/FabricExample/main.m | 10 - .../FabricExampleTests/FabricExampleTests.m | 66 - .../ios/FabricExampleTests/Info.plist | 24 - examples/FabricExample/ios/Podfile | 39 - examples/FabricExample/ios/_xcode.env | 11 - examples/FabricExample/jest.config.js | 3 - examples/FabricExample/metro.config.js | 43 - examples/FabricExample/package.json | 56 - examples/FabricExample/react-native.config.js | 10 - examples/FabricExample/src/VideoPlayer.tsx | 831 - examples/FabricExample/tsconfig.json | 13 - examples/README.md | 172 + examples/bare/.gitignore | 16 + examples/bare/.watchmanconfig | 1 + examples/bare/android/build.gradle | 48 + .../{basic => bare}/android/gradle.properties | 36 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../{FabricExample => bare}/android/gradlew | 18 +- examples/{basic => bare}/android/gradlew.bat | 2 +- examples/bare/android/settings.gradle | 21 + examples/bare/app.json | 54 + examples/bare/babel.config.js | 3 + examples/bare/index.js | 11 + examples/bare/ios/Podfile | 23 + .../{FabricExample => bare}/ios/Podfile.lock | 364 +- examples/bare/metro.config.js | 20 + examples/bare/package.json | 52 + .../@react-native-picker+picker+2.8.1.patch | 21 + examples/bare/react-native.config.js | 23 + examples/bare/src/BasicExample.tsx | 345 + .../src/BasicExample.windows.tsx} | 0 examples/bare/src/DRMExample.tsx | 231 + examples/{basic => bare}/src/assets/index.ts | 0 .../src/assets/videos}/broadchurch.mp4 | Bin .../src/assets/videos/index.ts | 0 .../src/assets/videos}/portrait.mp4 | Bin .../src/components/AudioTracksSelector.tsx | 0 .../src/components/Indicator.tsx | 0 .../src/components/MultiValueControl.tsx | 0 .../src/components/Overlay.tsx | 0 .../{basic => bare}/src/components/Seeker.tsx | 0 .../src/components/TextTracksSelector.tsx | 0 .../{basic => bare}/src/components/Toast.ts | 0 .../src/components/ToggleControl.tsx | 0 .../src/components/TopControl.tsx | 0 .../src/components/VideoLoader.tsx | 0 .../src/components/VideoTracksSelector.tsx | 0 .../{basic => bare}/src/components/index.ts | 0 .../{basic => bare}/src/constants/general.ts | 0 .../{basic => bare}/src/constants/index.ts | 0 examples/{basic => bare}/src/styles.tsx | 0 examples/{basic => bare}/src/types/index.ts | 0 examples/{basic => bare}/src/types/types.ts | 0 examples/bare/tsconfig.json | 3 + examples/bare/visionos/Podfile | 9 + examples/bare/visionos/Podfile.lock | 1333 + examples/bare/windows/.gitignore | 33 + examples/basic/.eslintrc | 13 - examples/basic/.eslintrc.js | 16 - examples/basic/.gitignore | 77 - examples/basic/.prettierrc.js | 7 - examples/basic/.watchmanconfig | 1 - examples/basic/Gemfile | 9 - examples/basic/Gemfile.lock | 102 - examples/basic/__tests__/App-test.js | 14 - examples/basic/_bundle/config | 2 - examples/basic/android/app/_BUCK | 55 - examples/basic/android/app/build_defs.bzl | 19 - examples/basic/android/app/debug.keystore | Bin 2257 -> 0 bytes examples/basic/android/app/proguard-rules.pro | 10 - .../android/app/src/debug/AndroidManifest.xml | 9 - .../android/app/src/main/AndroidManifest.xml | 47 - .../main/java/com/videoplayer/MainActivity.kt | 23 - .../android/app/src/main/jni/CMakeLists.txt | 7 - .../jni/MainApplicationModuleProvider.cpp | 32 - .../main/jni/MainApplicationModuleProvider.h | 16 - ...nApplicationTurboModuleManagerDelegate.cpp | 45 - ...ainApplicationTurboModuleManagerDelegate.h | 38 - .../src/main/jni/MainComponentsRegistry.cpp | 65 - .../app/src/main/jni/MainComponentsRegistry.h | 32 - .../basic/android/app/src/main/jni/OnLoad.cpp | 11 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 0 bytes .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 9 - examples/basic/android/build.gradle | 34 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 0 bytes examples/basic/android/settings.gradle | 18 - examples/basic/app.json | 4 - examples/basic/babel.config.js | 17 - examples/basic/index.js | 2 - examples/basic/ios/.xcode.env | 1 - examples/basic/ios/Podfile | 65 - examples/basic/ios/PrivacyInfo.xcprivacy | 37 - examples/basic/ios/_xcode.env | 11 - .../ios/videoplayer.xcodeproj/project.pbxproj | 881 - .../contents.xcworkspacedata | 13 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - examples/basic/ios/videoplayer/AppDelegate.mm | 31 - .../AppIcon.appiconset/Contents.json | 53 - .../videoplayer/Images.xcassets/Contents.json | 6 - examples/basic/ios/videoplayer/Info.plist | 55 - .../ios/videoplayer/LaunchScreen.storyboard | 47 - examples/basic/ios/videoplayer/main.m | 10 - .../basic/ios/videoplayerTests/Info.plist | 24 - .../ios/videoplayerTests/videoplayerTests.m | 66 - examples/basic/jest.config.js | 3 - examples/basic/metro.config.js | 70 - examples/basic/package.json | 48 - .../basic/src/assets/videos/broadchurch.mp4 | Bin 3446053 -> 0 bytes examples/basic/src/index.js | 5 - examples/basic/tsconfig.json | 12 - examples/basic/windows/.gitignore | 92 - examples/basic/windows/VideoPlayer.sln | 205 - examples/basic/windows/VideoPlayer/.gitignore | 1 - examples/basic/windows/VideoPlayer/App.cpp | 79 - examples/basic/windows/VideoPlayer/App.h | 18 - examples/basic/windows/VideoPlayer/App.idl | 3 - examples/basic/windows/VideoPlayer/App.xaml | 10 - .../Assets/LockScreenLogo.scale-200.png | Bin 1430 -> 0 bytes .../Assets/SplashScreen.scale-200.png | Bin 7700 -> 0 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 2937 -> 0 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 0 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 0 bytes .../windows/VideoPlayer/Assets/StoreLogo.png | Bin 1451 -> 0 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 0 bytes .../VideoPlayer/AutolinkedNativeModules.g.cpp | 18 - .../VideoPlayer/AutolinkedNativeModules.g.h | 10 - .../AutolinkedNativeModules.g.props | 6 - .../AutolinkedNativeModules.g.targets | 10 - .../basic/windows/VideoPlayer/MainPage.cpp | 20 - examples/basic/windows/VideoPlayer/MainPage.h | 19 - .../basic/windows/VideoPlayer/MainPage.idl | 8 - .../basic/windows/VideoPlayer/MainPage.xaml | 16 - .../windows/VideoPlayer/Package.appxmanifest | 50 - .../windows/VideoPlayer/PropertySheet.props | 16 - .../VideoPlayer/ReactPackageProvider.cpp | 15 - .../VideoPlayer/ReactPackageProvider.h | 13 - .../VideoPlayer/VideoPlayer_TemporaryKey.pfx | Bin 2606 -> 0 bytes .../basic/windows/VideoPlayer/packages.config | 5 - examples/basic/windows/VideoPlayer/pch.cpp | 1 - examples/basic/windows/VideoPlayer/pch.h | 26 - .../windows/VideoPlayer/videoplayer.vcxproj | 196 - .../VideoPlayer/videoplayer.vcxproj.filters | 63 - examples/basic/yarn.lock | 9745 -- examples/embed-and-fullscreen/.babelrc | 3 - examples/embed-and-fullscreen/.buckconfig | 6 - examples/embed-and-fullscreen/.flowconfig | 58 - examples/embed-and-fullscreen/.gitattributes | 1 - examples/embed-and-fullscreen/.gitignore | 53 - .../.vscode/.react/debuggerWorker.js | 144 - .../.vscode/.react/index.ios.bundle | 80702 ---------------- .../.vscode/.react/index.ios.map | 1 - .../embed-and-fullscreen/.vscode/launch.json | 79 - .../.vscode/settings.json | 5 - examples/embed-and-fullscreen/.watchmanconfig | 1 - examples/embed-and-fullscreen/Utils.js | 31 - examples/embed-and-fullscreen/broadchurch.mp4 | Bin 3446053 -> 0 bytes examples/embed-and-fullscreen/index.ios.js | 81 - .../embed-and-fullscreen/ios/AppDelegate.h | 16 - .../embed-and-fullscreen/ios/AppDelegate.m | 52 - .../ios/Base.lproj/LaunchScreen.xib | 42 - examples/embed-and-fullscreen/ios/Info.plist | 47 - .../ios/VideoPlayer-tvOS.plist | 53 - .../ios/VideoPlayer.xcodeproj/project.pbxproj | 1216 - .../xcschemes/VideoPlayer-tvOS.xcscheme | 105 - .../xcschemes/VideoPlayer.xcscheme | 105 - .../ios/VideoPlayer/AppDelegate.h | 16 - .../ios/VideoPlayer/AppDelegate.m | 37 - .../VideoPlayer/Base.lproj/LaunchScreen.xib | 42 - .../ios/VideoPlayer/Info.plist | 54 - .../ios/VideoPlayer/main.m | 18 - .../embed-and-fullscreen/ios/main.jsbundle | 5 - examples/embed-and-fullscreen/ios/main.m | 19 - .../embed-and-fullscreen/rn-cli.config.js | 7 - examples/exampletvOS/.bundle/config | 2 - examples/exampletvOS/.eslintrc.js | 4 - examples/exampletvOS/.gitignore | 63 - examples/exampletvOS/.node-version | 1 - examples/exampletvOS/.prettierrc.js | 7 - examples/exampletvOS/.watchmanconfig | 1 - examples/exampletvOS/App.tsx | 62 - examples/exampletvOS/Gemfile | 6 - examples/exampletvOS/Gemfile.lock | 98 - examples/exampletvOS/__tests__/App-test.tsx | 14 - examples/exampletvOS/android/app/build.gradle | 176 - .../exampletvOS/android/app/debug.keystore | Bin 2257 -> 0 bytes .../android/app/src/debug/AndroidManifest.xml | 13 - .../com/exampletvos/ReactNativeFlipper.java | 75 - .../android/app/src/main/AndroidManifest.xml | 32 - .../java/com/exampletvos/MainActivity.java | 35 - .../java/com/exampletvos/MainApplication.java | 64 - .../res/drawable/rn_edit_text_material.xml | 36 - .../app/src/main/res/drawable/tv_banner.png | Bin 28517 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 0 bytes .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 9 - .../com/exampletvos/ReactNativeFlipper.java | 20 - examples/exampletvOS/android/build.gradle | 21 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - examples/exampletvOS/android/gradlew | 234 - examples/exampletvOS/android/settings.gradle | 4 - examples/exampletvOS/app.json | 4 - examples/exampletvOS/babel.config.js | 17 - examples/exampletvOS/index.js | 9 - examples/exampletvOS/ios/Podfile | 87 - examples/exampletvOS/ios/Podfile.lock | 614 - .../ios/exampletvOS-tvOS/Info.plist | 53 - .../ios/exampletvOS-tvOSTests/Info.plist | 24 - .../ios/exampletvOS.xcodeproj/project.pbxproj | 1136 - .../xcschemes/exampletvOS-tvOS.xcscheme | 88 - .../xcschemes/exampletvOS.xcscheme | 88 - .../exampletvOS/ios/exampletvOS/AppDelegate.h | 6 - .../ios/exampletvOS/AppDelegate.mm | 36 - .../AppIcon.appiconset/Contents.json | 53 - .../exampletvOS/ios/exampletvOS/Info.plist | 55 - .../ios/exampletvOS/LaunchScreen.storyboard | 47 - .../ios/exampletvOSTests/Info.plist | 24 - .../ios/exampletvOSTests/exampletvOSTests.m | 66 - examples/exampletvOS/metro.config.js | 39 - examples/exampletvOS/package.json | 38 - examples/exampletvOS/react-native.config.js | 10 - examples/exampletvOS/tsconfig.json | 3 - examples/expo/.gitignore | 14 + examples/expo/App.tsx | 6 + examples/expo/App.tv.tsx | 64 + examples/expo/README.md | 34 + examples/expo/android/.gitignore | 16 + .../{basic => expo}/android/app/build.gradle | 136 +- .../android/app/debug.keystore | Bin .../android/app/proguard-rules.pro | 4 + .../android/app/src/debug/AndroidManifest.xml | 6 +- .../android/app/src/main/AndroidManifest.xml | 39 + .../com/anonymous/ExpoExample/MainActivity.kt | 61 + .../anonymous/ExpoExample}/MainApplication.kt | 55 +- .../res/drawable/rn_edit_text_material.xml | 2 +- .../src/main/res/drawable/splashscreen.xml | 4 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../app/src/main/res/values-night/colors.xml | 1 + .../app/src/main/res/values/colors.xml | 4 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 17 + examples/expo/android/build.gradle | 41 + .../android/gradle.properties | 26 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/{basic => expo}/android/gradlew | 2 +- .../{exampletvOS => expo}/android/gradlew.bat | 181 +- .../react-settings-plugin/build.gradle.kts | 19 + .../expo/plugins/ReactSettingsPlugin.kt | 10 + examples/expo/android/settings.gradle | 72 + examples/expo/app.json | 45 + examples/expo/assets/images/icon-1280x768.png | Bin 0 -> 158436 bytes examples/expo/assets/images/icon-1920x720.png | Bin 0 -> 217024 bytes examples/expo/assets/images/icon-2320x720.png | Bin 0 -> 251864 bytes .../expo/assets/images/icon-3840x1440.png | Bin 0 -> 535624 bytes examples/expo/assets/images/icon-400x240.png | Bin 0 -> 38229 bytes .../expo/assets/images/icon-4640x1440.png | Bin 0 -> 631293 bytes examples/expo/assets/images/icon-800x480.png | Bin 0 -> 97399 bytes examples/expo/babel.config.js | 20 + examples/expo/index.js | 5 + examples/expo/ios/.gitignore | 30 + examples/{exampletvOS => expo}/ios/.xcode.env | 0 .../ios/ExpoExample.xcodeproj/project.pbxproj | 529 + .../xcschemes/ExpoExample.xcscheme} | 26 +- .../contents.xcworkspacedata | 2 +- .../ios/ExpoExample}/AppDelegate.h | 2 +- examples/expo/ios/ExpoExample/AppDelegate.mm | 62 + .../ExpoExample/ExpoExample-Bridging-Header.h | 3 + .../ios/ExpoExample/ExpoExample.entitlements} | 7 +- .../App-Icon-1024x1024@1x.png | Bin 0 -> 5856 bytes .../AppIcon.appiconset/Contents.json | 14 + .../Images.xcassets/Contents.json | 2 +- .../Contents.json | 21 + .../SplashScreenBackground.imageset/image.png | Bin 0 -> 68 bytes examples/expo/ios/ExpoExample/Info.plist | 78 + .../ios/ExpoExample}/PrivacyInfo.xcprivacy | 0 .../ios/ExpoExample/SplashScreen.storyboard | 43 + .../ios/ExpoExample/Supporting/Expo.plist | 12 + .../ios/ExpoExample}/main.m | 4 +- examples/expo/ios/ExpoExample/noop-file.swift | 4 + examples/expo/ios/Podfile | 88 + examples/{basic => expo}/ios/Podfile.lock | 600 +- examples/expo/ios/Podfile.properties.json | 4 + examples/expo/metro.config.js | 54 + examples/expo/package.json | 43 + .../src/BasicExample.tsx} | 20 +- .../src/BasicExample.windows.tsx} | 132 +- examples/expo/src/assets/index.ts | 1 + .../src/assets/videos}/broadchurch.mp4 | Bin examples/expo/src/assets/videos/index.ts | 4 + .../src/assets/videos/portrait.mp4 | Bin .../src/components/AudioTracksSelector.tsx | 30 +- examples/expo/src/components/Indicator.tsx | 8 + .../src/components}/MultiValueControl.tsx | 17 +- examples/expo/src/components/Overlay.tsx | 350 + .../src/components/Seeker.tsx | 4 +- .../src/components/TextTracksSelector.tsx | 34 +- examples/expo/src/components/Toast.ts | 18 + .../src/components}/ToggleControl.tsx | 2 +- examples/expo/src/components/TopControl.tsx | 37 + examples/expo/src/components/VideoLoader.tsx | 15 + .../src/components/VideoTracksSelector.tsx | 8 +- examples/expo/src/components/index.ts | 11 + examples/expo/src/constants/general.ts | 182 + examples/expo/src/constants/index.ts | 1 + .../{FabricExample => expo}/src/styles.tsx | 10 +- examples/expo/src/types/index.ts | 1 + examples/expo/src/types/types.ts | 11 + examples/expo/tsconfig.json | 4 + examples/video-caching/.babelrc | 3 - examples/video-caching/.buckconfig | 6 - examples/video-caching/.flowconfig | 54 - examples/video-caching/.gitattributes | 1 - examples/video-caching/.gitignore | 57 - examples/video-caching/.watchmanconfig | 1 - examples/video-caching/App.ios.js | 104 - examples/video-caching/App.js | 33 - examples/video-caching/README.md | 24 - examples/video-caching/__tests__/App.js | 12 - examples/video-caching/android/app/BUCK | 65 - .../video-caching/android/app/build.gradle | 150 - .../android/app/proguard-rules.pro | 70 - .../android/app/src/main/AndroidManifest.xml | 32 - .../java/com/videocaching/MainActivity.java | 15 - .../com/videocaching/MainApplication.java | 45 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 0 bytes .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 8 - examples/video-caching/android/build.gradle | 24 - .../video-caching/android/gradle.properties | 20 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 52266 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - examples/video-caching/android/gradlew | 164 - examples/video-caching/android/gradlew.bat | 90 - examples/video-caching/android/keystores/BUCK | 8 - .../keystores/debug.keystore.properties | 4 - .../video-caching/android/settings.gradle | 3 - examples/video-caching/app.json | 4 - examples/video-caching/index.js | 4 - examples/video-caching/ios/Podfile | 32 - examples/video-caching/ios/Podfile.lock | 128 - .../ios/VideoCaching-tvOS/Info.plist | 54 - .../ios/VideoCaching-tvOSTests/Info.plist | 24 - .../VideoCaching.xcodeproj/project.pbxproj | 1495 - .../xcschemes/VideoCaching-tvOS.xcscheme | 129 - .../xcschemes/VideoCaching.xcscheme | 129 - .../ios/VideoCaching/AppDelegate.h | 16 - .../ios/VideoCaching/AppDelegate.m | 37 - .../VideoCaching/Base.lproj/LaunchScreen.xib | 42 - .../AppIcon.appiconset/Contents.json | 53 - .../Images.xcassets/Contents.json | 6 - .../video-caching/ios/VideoCaching/Info.plist | 57 - .../video-caching/ios/VideoCaching/main.m | 18 - .../ios/VideoCachingTests/Info.plist | 24 - .../ios/VideoCachingTests/VideoCachingTests.m | 70 - examples/video-caching/package.json | 24 - examples/video-caching/rn-cli.config.js | 19 - examples/video-caching/update.sh | 5 - src/expo-plugins/@types.ts | 1 + src/expo-plugins/withAds.ts | 6 +- src/expo-plugins/withCaching.ts | 9 +- src/expo-plugins/withRNVideo.ts | 10 +- src/expo-plugins/writeToPodfile.ts | 47 + 445 files changed, 5510 insertions(+), 106905 deletions(-) delete mode 100644 examples/FabricExample/.buckconfig delete mode 100644 examples/FabricExample/.bundle/config delete mode 100644 examples/FabricExample/.eslintrc.js delete mode 100644 examples/FabricExample/.gitignore delete mode 100644 examples/FabricExample/.prettierrc.js delete mode 100644 examples/FabricExample/.ruby-version delete mode 100644 examples/FabricExample/.watchmanconfig delete mode 100644 examples/FabricExample/App.tsx delete mode 100644 examples/FabricExample/Gemfile delete mode 100644 examples/FabricExample/Gemfile.lock delete mode 100644 examples/FabricExample/__tests__/App-test.tsx delete mode 100644 examples/FabricExample/android/app/_BUCK delete mode 100644 examples/FabricExample/android/app/build.gradle delete mode 100644 examples/FabricExample/android/app/build_defs.bzl delete mode 100644 examples/FabricExample/android/app/proguard-rules.pro delete mode 100644 examples/FabricExample/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.kt delete mode 100644 examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.kt delete mode 100644 examples/FabricExample/android/app/src/main/jni/CMakeLists.txt delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp delete mode 100644 examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h delete mode 100644 examples/FabricExample/android/app/src/main/jni/OnLoad.cpp delete mode 100644 examples/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml delete mode 100644 examples/FabricExample/android/app/src/main/res/values/strings.xml delete mode 100644 examples/FabricExample/android/app/src/main/res/values/styles.xml delete mode 100644 examples/FabricExample/android/build.gradle delete mode 100644 examples/FabricExample/android/gradle.properties delete mode 100644 examples/FabricExample/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/FabricExample/android/gradlew.bat delete mode 100644 examples/FabricExample/android/settings.gradle delete mode 100644 examples/FabricExample/app.json delete mode 100644 examples/FabricExample/babel.config.js delete mode 100644 examples/FabricExample/index.js delete mode 100644 examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj delete mode 100644 examples/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme delete mode 100644 examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 examples/FabricExample/ios/FabricExample/AppDelegate.h delete mode 100644 examples/FabricExample/ios/FabricExample/AppDelegate.mm delete mode 100644 examples/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/FabricExample/ios/FabricExample/Images.xcassets/Contents.json delete mode 100644 examples/FabricExample/ios/FabricExample/Info.plist delete mode 100644 examples/FabricExample/ios/FabricExample/LaunchScreen.storyboard delete mode 100644 examples/FabricExample/ios/FabricExample/main.m delete mode 100644 examples/FabricExample/ios/FabricExampleTests/FabricExampleTests.m delete mode 100644 examples/FabricExample/ios/FabricExampleTests/Info.plist delete mode 100644 examples/FabricExample/ios/Podfile delete mode 100644 examples/FabricExample/ios/_xcode.env delete mode 100644 examples/FabricExample/jest.config.js delete mode 100644 examples/FabricExample/metro.config.js delete mode 100644 examples/FabricExample/package.json delete mode 100644 examples/FabricExample/react-native.config.js delete mode 100644 examples/FabricExample/src/VideoPlayer.tsx delete mode 100644 examples/FabricExample/tsconfig.json create mode 100644 examples/README.md create mode 100644 examples/bare/.gitignore create mode 100644 examples/bare/.watchmanconfig create mode 100644 examples/bare/android/build.gradle rename examples/{basic => bare}/android/gradle.properties (50%) create mode 100644 examples/bare/android/gradle/wrapper/gradle-wrapper.jar rename examples/{FabricExample => bare}/android/gradle/wrapper/gradle-wrapper.properties (94%) rename examples/{FabricExample => bare}/android/gradlew (92%) rename examples/{basic => bare}/android/gradlew.bat (96%) create mode 100644 examples/bare/android/settings.gradle create mode 100644 examples/bare/app.json create mode 100644 examples/bare/babel.config.js create mode 100644 examples/bare/index.js create mode 100644 examples/bare/ios/Podfile rename examples/{FabricExample => bare}/ios/Podfile.lock (82%) create mode 100644 examples/bare/metro.config.js create mode 100644 examples/bare/package.json create mode 100644 examples/bare/patches/@react-native-picker+picker+2.8.1.patch create mode 100644 examples/bare/react-native.config.js create mode 100644 examples/bare/src/BasicExample.tsx rename examples/{basic/src/VideoPlayer.windows.tsx => bare/src/BasicExample.windows.tsx} (100%) create mode 100644 examples/bare/src/DRMExample.tsx rename examples/{basic => bare}/src/assets/index.ts (100%) rename examples/{FabricExample/src => bare/src/assets/videos}/broadchurch.mp4 (100%) rename examples/{basic => bare}/src/assets/videos/index.ts (100%) rename examples/{FabricExample/src => bare/src/assets/videos}/portrait.mp4 (100%) rename examples/{basic => bare}/src/components/AudioTracksSelector.tsx (100%) rename examples/{basic => bare}/src/components/Indicator.tsx (100%) rename examples/{basic => bare}/src/components/MultiValueControl.tsx (100%) rename examples/{basic => bare}/src/components/Overlay.tsx (100%) rename examples/{basic => bare}/src/components/Seeker.tsx (100%) rename examples/{basic => bare}/src/components/TextTracksSelector.tsx (100%) rename examples/{basic => bare}/src/components/Toast.ts (100%) rename examples/{basic => bare}/src/components/ToggleControl.tsx (100%) rename examples/{basic => bare}/src/components/TopControl.tsx (100%) rename examples/{basic => bare}/src/components/VideoLoader.tsx (100%) rename examples/{basic => bare}/src/components/VideoTracksSelector.tsx (100%) rename examples/{basic => bare}/src/components/index.ts (100%) rename examples/{basic => bare}/src/constants/general.ts (100%) rename examples/{basic => bare}/src/constants/index.ts (100%) rename examples/{basic => bare}/src/styles.tsx (100%) rename examples/{basic => bare}/src/types/index.ts (100%) rename examples/{basic => bare}/src/types/types.ts (100%) create mode 100644 examples/bare/tsconfig.json create mode 100644 examples/bare/visionos/Podfile create mode 100644 examples/bare/visionos/Podfile.lock create mode 100644 examples/bare/windows/.gitignore delete mode 100644 examples/basic/.eslintrc delete mode 100644 examples/basic/.eslintrc.js delete mode 100644 examples/basic/.gitignore delete mode 100644 examples/basic/.prettierrc.js delete mode 100644 examples/basic/.watchmanconfig delete mode 100644 examples/basic/Gemfile delete mode 100644 examples/basic/Gemfile.lock delete mode 100644 examples/basic/__tests__/App-test.js delete mode 100644 examples/basic/_bundle/config delete mode 100644 examples/basic/android/app/_BUCK delete mode 100644 examples/basic/android/app/build_defs.bzl delete mode 100644 examples/basic/android/app/debug.keystore delete mode 100644 examples/basic/android/app/proguard-rules.pro delete mode 100644 examples/basic/android/app/src/debug/AndroidManifest.xml delete mode 100644 examples/basic/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/basic/android/app/src/main/java/com/videoplayer/MainActivity.kt delete mode 100644 examples/basic/android/app/src/main/jni/CMakeLists.txt delete mode 100644 examples/basic/android/app/src/main/jni/MainApplicationModuleProvider.cpp delete mode 100644 examples/basic/android/app/src/main/jni/MainApplicationModuleProvider.h delete mode 100644 examples/basic/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp delete mode 100644 examples/basic/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h delete mode 100644 examples/basic/android/app/src/main/jni/MainComponentsRegistry.cpp delete mode 100644 examples/basic/android/app/src/main/jni/MainComponentsRegistry.h delete mode 100644 examples/basic/android/app/src/main/jni/OnLoad.cpp delete mode 100644 examples/basic/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 examples/basic/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 examples/basic/android/app/src/main/res/values/strings.xml delete mode 100644 examples/basic/android/app/src/main/res/values/styles.xml delete mode 100644 examples/basic/android/build.gradle delete mode 100644 examples/basic/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/basic/android/settings.gradle delete mode 100644 examples/basic/app.json delete mode 100644 examples/basic/babel.config.js delete mode 100644 examples/basic/index.js delete mode 100644 examples/basic/ios/.xcode.env delete mode 100644 examples/basic/ios/Podfile delete mode 100644 examples/basic/ios/PrivacyInfo.xcprivacy delete mode 100644 examples/basic/ios/_xcode.env delete mode 100644 examples/basic/ios/videoplayer.xcodeproj/project.pbxproj delete mode 100644 examples/basic/ios/videoplayer.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/basic/ios/videoplayer.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 examples/basic/ios/videoplayer/AppDelegate.mm delete mode 100644 examples/basic/ios/videoplayer/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/basic/ios/videoplayer/Images.xcassets/Contents.json delete mode 100644 examples/basic/ios/videoplayer/Info.plist delete mode 100644 examples/basic/ios/videoplayer/LaunchScreen.storyboard delete mode 100644 examples/basic/ios/videoplayer/main.m delete mode 100644 examples/basic/ios/videoplayerTests/Info.plist delete mode 100644 examples/basic/ios/videoplayerTests/videoplayerTests.m delete mode 100644 examples/basic/jest.config.js delete mode 100644 examples/basic/metro.config.js delete mode 100644 examples/basic/package.json delete mode 100644 examples/basic/src/assets/videos/broadchurch.mp4 delete mode 100644 examples/basic/src/index.js delete mode 100644 examples/basic/tsconfig.json delete mode 100644 examples/basic/windows/.gitignore delete mode 100644 examples/basic/windows/VideoPlayer.sln delete mode 100644 examples/basic/windows/VideoPlayer/.gitignore delete mode 100644 examples/basic/windows/VideoPlayer/App.cpp delete mode 100644 examples/basic/windows/VideoPlayer/App.h delete mode 100644 examples/basic/windows/VideoPlayer/App.idl delete mode 100644 examples/basic/windows/VideoPlayer/App.xaml delete mode 100644 examples/basic/windows/VideoPlayer/Assets/LockScreenLogo.scale-200.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/SplashScreen.scale-200.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/Square150x150Logo.scale-200.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/Square44x44Logo.scale-200.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/StoreLogo.png delete mode 100644 examples/basic/windows/VideoPlayer/Assets/Wide310x150Logo.scale-200.png delete mode 100644 examples/basic/windows/VideoPlayer/AutolinkedNativeModules.g.cpp delete mode 100644 examples/basic/windows/VideoPlayer/AutolinkedNativeModules.g.h delete mode 100644 examples/basic/windows/VideoPlayer/AutolinkedNativeModules.g.props delete mode 100644 examples/basic/windows/VideoPlayer/AutolinkedNativeModules.g.targets delete mode 100644 examples/basic/windows/VideoPlayer/MainPage.cpp delete mode 100644 examples/basic/windows/VideoPlayer/MainPage.h delete mode 100644 examples/basic/windows/VideoPlayer/MainPage.idl delete mode 100644 examples/basic/windows/VideoPlayer/MainPage.xaml delete mode 100644 examples/basic/windows/VideoPlayer/Package.appxmanifest delete mode 100644 examples/basic/windows/VideoPlayer/PropertySheet.props delete mode 100644 examples/basic/windows/VideoPlayer/ReactPackageProvider.cpp delete mode 100644 examples/basic/windows/VideoPlayer/ReactPackageProvider.h delete mode 100644 examples/basic/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx delete mode 100644 examples/basic/windows/VideoPlayer/packages.config delete mode 100644 examples/basic/windows/VideoPlayer/pch.cpp delete mode 100644 examples/basic/windows/VideoPlayer/pch.h delete mode 100644 examples/basic/windows/VideoPlayer/videoplayer.vcxproj delete mode 100644 examples/basic/windows/VideoPlayer/videoplayer.vcxproj.filters delete mode 100644 examples/basic/yarn.lock delete mode 100644 examples/embed-and-fullscreen/.babelrc delete mode 100644 examples/embed-and-fullscreen/.buckconfig delete mode 100644 examples/embed-and-fullscreen/.flowconfig delete mode 100644 examples/embed-and-fullscreen/.gitattributes delete mode 100644 examples/embed-and-fullscreen/.gitignore delete mode 100644 examples/embed-and-fullscreen/.vscode/.react/debuggerWorker.js delete mode 100644 examples/embed-and-fullscreen/.vscode/.react/index.ios.bundle delete mode 100644 examples/embed-and-fullscreen/.vscode/.react/index.ios.map delete mode 100644 examples/embed-and-fullscreen/.vscode/launch.json delete mode 100644 examples/embed-and-fullscreen/.vscode/settings.json delete mode 100644 examples/embed-and-fullscreen/.watchmanconfig delete mode 100644 examples/embed-and-fullscreen/Utils.js delete mode 100644 examples/embed-and-fullscreen/broadchurch.mp4 delete mode 100644 examples/embed-and-fullscreen/index.ios.js delete mode 100644 examples/embed-and-fullscreen/ios/AppDelegate.h delete mode 100644 examples/embed-and-fullscreen/ios/AppDelegate.m delete mode 100644 examples/embed-and-fullscreen/ios/Base.lproj/LaunchScreen.xib delete mode 100644 examples/embed-and-fullscreen/ios/Info.plist delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer-tvOS.plist delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer.xcodeproj/project.pbxproj delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer.xcodeproj/xcshareddata/xcschemes/VideoPlayer-tvOS.xcscheme delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer.xcodeproj/xcshareddata/xcschemes/VideoPlayer.xcscheme delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer/AppDelegate.h delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer/AppDelegate.m delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer/Base.lproj/LaunchScreen.xib delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer/Info.plist delete mode 100644 examples/embed-and-fullscreen/ios/VideoPlayer/main.m delete mode 100644 examples/embed-and-fullscreen/ios/main.jsbundle delete mode 100644 examples/embed-and-fullscreen/ios/main.m delete mode 100644 examples/embed-and-fullscreen/rn-cli.config.js delete mode 100644 examples/exampletvOS/.bundle/config delete mode 100644 examples/exampletvOS/.eslintrc.js delete mode 100644 examples/exampletvOS/.gitignore delete mode 100644 examples/exampletvOS/.node-version delete mode 100644 examples/exampletvOS/.prettierrc.js delete mode 100644 examples/exampletvOS/.watchmanconfig delete mode 100644 examples/exampletvOS/App.tsx delete mode 100644 examples/exampletvOS/Gemfile delete mode 100644 examples/exampletvOS/Gemfile.lock delete mode 100644 examples/exampletvOS/__tests__/App-test.tsx delete mode 100644 examples/exampletvOS/android/app/build.gradle delete mode 100644 examples/exampletvOS/android/app/debug.keystore delete mode 100644 examples/exampletvOS/android/app/src/debug/AndroidManifest.xml delete mode 100644 examples/exampletvOS/android/app/src/debug/java/com/exampletvos/ReactNativeFlipper.java delete mode 100644 examples/exampletvOS/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/exampletvOS/android/app/src/main/java/com/exampletvos/MainActivity.java delete mode 100644 examples/exampletvOS/android/app/src/main/java/com/exampletvos/MainApplication.java delete mode 100644 examples/exampletvOS/android/app/src/main/res/drawable/rn_edit_text_material.xml delete mode 100644 examples/exampletvOS/android/app/src/main/res/drawable/tv_banner.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 examples/exampletvOS/android/app/src/main/res/values/strings.xml delete mode 100644 examples/exampletvOS/android/app/src/main/res/values/styles.xml delete mode 100644 examples/exampletvOS/android/app/src/release/java/com/exampletvos/ReactNativeFlipper.java delete mode 100644 examples/exampletvOS/android/build.gradle delete mode 100644 examples/exampletvOS/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/exampletvOS/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/exampletvOS/android/gradlew delete mode 100644 examples/exampletvOS/android/settings.gradle delete mode 100644 examples/exampletvOS/app.json delete mode 100644 examples/exampletvOS/babel.config.js delete mode 100644 examples/exampletvOS/index.js delete mode 100644 examples/exampletvOS/ios/Podfile delete mode 100644 examples/exampletvOS/ios/Podfile.lock delete mode 100644 examples/exampletvOS/ios/exampletvOS-tvOS/Info.plist delete mode 100644 examples/exampletvOS/ios/exampletvOS-tvOSTests/Info.plist delete mode 100644 examples/exampletvOS/ios/exampletvOS.xcodeproj/project.pbxproj delete mode 100644 examples/exampletvOS/ios/exampletvOS.xcodeproj/xcshareddata/xcschemes/exampletvOS-tvOS.xcscheme delete mode 100644 examples/exampletvOS/ios/exampletvOS.xcodeproj/xcshareddata/xcschemes/exampletvOS.xcscheme delete mode 100644 examples/exampletvOS/ios/exampletvOS/AppDelegate.h delete mode 100644 examples/exampletvOS/ios/exampletvOS/AppDelegate.mm delete mode 100644 examples/exampletvOS/ios/exampletvOS/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/exampletvOS/ios/exampletvOS/Info.plist delete mode 100644 examples/exampletvOS/ios/exampletvOS/LaunchScreen.storyboard delete mode 100644 examples/exampletvOS/ios/exampletvOSTests/Info.plist delete mode 100644 examples/exampletvOS/ios/exampletvOSTests/exampletvOSTests.m delete mode 100644 examples/exampletvOS/metro.config.js delete mode 100644 examples/exampletvOS/package.json delete mode 100644 examples/exampletvOS/react-native.config.js delete mode 100644 examples/exampletvOS/tsconfig.json create mode 100644 examples/expo/.gitignore create mode 100644 examples/expo/App.tsx create mode 100644 examples/expo/App.tv.tsx create mode 100644 examples/expo/README.md create mode 100644 examples/expo/android/.gitignore rename examples/{basic => expo}/android/app/build.gradle (51%) rename examples/{FabricExample => expo}/android/app/debug.keystore (100%) rename examples/{exampletvOS => expo}/android/app/proguard-rules.pro (77%) rename examples/{FabricExample => expo}/android/app/src/debug/AndroidManifest.xml (54%) create mode 100644 examples/expo/android/app/src/main/AndroidManifest.xml create mode 100644 examples/expo/android/app/src/main/java/com/anonymous/ExpoExample/MainActivity.kt rename examples/{basic/android/app/src/main/java/com/videoplayer => expo/android/app/src/main/java/com/anonymous/ExpoExample}/MainApplication.kt (55%) rename examples/{basic => expo}/android/app/src/main/res/drawable/rn_edit_text_material.xml (99%) create mode 100644 examples/expo/android/app/src/main/res/drawable/splashscreen.xml rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename examples/{FabricExample => expo}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) create mode 100644 examples/expo/android/app/src/main/res/values-night/colors.xml create mode 100644 examples/expo/android/app/src/main/res/values/colors.xml create mode 100644 examples/expo/android/app/src/main/res/values/strings.xml create mode 100644 examples/expo/android/app/src/main/res/values/styles.xml create mode 100644 examples/expo/android/build.gradle rename examples/{exampletvOS => expo}/android/gradle.properties (70%) create mode 100644 examples/expo/android/gradle/wrapper/gradle-wrapper.jar rename examples/{basic => expo}/android/gradle/wrapper/gradle-wrapper.properties (94%) rename examples/{basic => expo}/android/gradlew (99%) rename examples/{exampletvOS => expo}/android/gradlew.bat (80%) create mode 100644 examples/expo/android/react-settings-plugin/build.gradle.kts create mode 100644 examples/expo/android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt create mode 100644 examples/expo/android/settings.gradle create mode 100644 examples/expo/app.json create mode 100644 examples/expo/assets/images/icon-1280x768.png create mode 100644 examples/expo/assets/images/icon-1920x720.png create mode 100644 examples/expo/assets/images/icon-2320x720.png create mode 100644 examples/expo/assets/images/icon-3840x1440.png create mode 100644 examples/expo/assets/images/icon-400x240.png create mode 100644 examples/expo/assets/images/icon-4640x1440.png create mode 100644 examples/expo/assets/images/icon-800x480.png create mode 100644 examples/expo/babel.config.js create mode 100644 examples/expo/index.js create mode 100644 examples/expo/ios/.gitignore rename examples/{exampletvOS => expo}/ios/.xcode.env (100%) create mode 100644 examples/expo/ios/ExpoExample.xcodeproj/project.pbxproj rename examples/{basic/ios/videoplayer.xcodeproj/xcshareddata/xcschemes/videoplayer.xcscheme => expo/ios/ExpoExample.xcodeproj/xcshareddata/xcschemes/ExpoExample.xcscheme} (79%) rename examples/{exampletvOS/ios/exampletvOS.xcworkspace => expo/ios/ExpoExample.xcworkspace}/contents.xcworkspacedata (79%) rename examples/{basic/ios/videoplayer => expo/ios/ExpoExample}/AppDelegate.h (100%) create mode 100644 examples/expo/ios/ExpoExample/AppDelegate.mm create mode 100644 examples/expo/ios/ExpoExample/ExpoExample-Bridging-Header.h rename examples/{exampletvOS/ios/exampletvOS.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist => expo/ios/ExpoExample/ExpoExample.entitlements} (68%) create mode 100644 examples/expo/ios/ExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png create mode 100644 examples/expo/ios/ExpoExample/Images.xcassets/AppIcon.appiconset/Contents.json rename examples/{exampletvOS/ios/exampletvOS => expo/ios/ExpoExample}/Images.xcassets/Contents.json (63%) create mode 100644 examples/expo/ios/ExpoExample/Images.xcassets/SplashScreenBackground.imageset/Contents.json create mode 100644 examples/expo/ios/ExpoExample/Images.xcassets/SplashScreenBackground.imageset/image.png create mode 100644 examples/expo/ios/ExpoExample/Info.plist rename examples/{basic/ios/videoplayer => expo/ios/ExpoExample}/PrivacyInfo.xcprivacy (100%) create mode 100644 examples/expo/ios/ExpoExample/SplashScreen.storyboard create mode 100644 examples/expo/ios/ExpoExample/Supporting/Expo.plist rename examples/{exampletvOS/ios/exampletvOS => expo/ios/ExpoExample}/main.m (81%) create mode 100644 examples/expo/ios/ExpoExample/noop-file.swift create mode 100644 examples/expo/ios/Podfile rename examples/{basic => expo}/ios/Podfile.lock (73%) create mode 100644 examples/expo/ios/Podfile.properties.json create mode 100644 examples/expo/metro.config.js create mode 100644 examples/expo/package.json rename examples/{basic/src/VideoPlayer.tsx => expo/src/BasicExample.tsx} (96%) rename examples/{embed-and-fullscreen/index.windows.js => expo/src/BasicExample.windows.tsx} (54%) create mode 100644 examples/expo/src/assets/index.ts rename examples/{basic/android/app/src/main/assets => expo/src/assets/videos}/broadchurch.mp4 (100%) create mode 100644 examples/expo/src/assets/videos/index.ts rename examples/{basic => expo}/src/assets/videos/portrait.mp4 (100%) rename examples/{FabricExample => expo}/src/components/AudioTracksSelector.tsx (59%) create mode 100644 examples/expo/src/components/Indicator.tsx rename examples/{FabricExample/src => expo/src/components}/MultiValueControl.tsx (78%) create mode 100644 examples/expo/src/components/Overlay.tsx rename examples/{FabricExample => expo}/src/components/Seeker.tsx (98%) rename examples/{FabricExample => expo}/src/components/TextTracksSelector.tsx (66%) create mode 100644 examples/expo/src/components/Toast.ts rename examples/{FabricExample/src => expo/src/components}/ToggleControl.tsx (97%) create mode 100644 examples/expo/src/components/TopControl.tsx create mode 100644 examples/expo/src/components/VideoLoader.tsx rename examples/{FabricExample => expo}/src/components/VideoTracksSelector.tsx (94%) create mode 100644 examples/expo/src/components/index.ts create mode 100644 examples/expo/src/constants/general.ts create mode 100644 examples/expo/src/constants/index.ts rename examples/{FabricExample => expo}/src/styles.tsx (95%) create mode 100644 examples/expo/src/types/index.ts create mode 100644 examples/expo/src/types/types.ts create mode 100644 examples/expo/tsconfig.json delete mode 100644 examples/video-caching/.babelrc delete mode 100644 examples/video-caching/.buckconfig delete mode 100644 examples/video-caching/.flowconfig delete mode 100644 examples/video-caching/.gitattributes delete mode 100644 examples/video-caching/.gitignore delete mode 100644 examples/video-caching/.watchmanconfig delete mode 100644 examples/video-caching/App.ios.js delete mode 100644 examples/video-caching/App.js delete mode 100644 examples/video-caching/README.md delete mode 100644 examples/video-caching/__tests__/App.js delete mode 100644 examples/video-caching/android/app/BUCK delete mode 100644 examples/video-caching/android/app/build.gradle delete mode 100644 examples/video-caching/android/app/proguard-rules.pro delete mode 100644 examples/video-caching/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/video-caching/android/app/src/main/java/com/videocaching/MainActivity.java delete mode 100644 examples/video-caching/android/app/src/main/java/com/videocaching/MainApplication.java delete mode 100644 examples/video-caching/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/video-caching/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/video-caching/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/video-caching/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/video-caching/android/app/src/main/res/values/strings.xml delete mode 100644 examples/video-caching/android/app/src/main/res/values/styles.xml delete mode 100644 examples/video-caching/android/build.gradle delete mode 100644 examples/video-caching/android/gradle.properties delete mode 100644 examples/video-caching/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/video-caching/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/video-caching/android/gradlew delete mode 100644 examples/video-caching/android/gradlew.bat delete mode 100644 examples/video-caching/android/keystores/BUCK delete mode 100644 examples/video-caching/android/keystores/debug.keystore.properties delete mode 100644 examples/video-caching/android/settings.gradle delete mode 100644 examples/video-caching/app.json delete mode 100644 examples/video-caching/index.js delete mode 100644 examples/video-caching/ios/Podfile delete mode 100644 examples/video-caching/ios/Podfile.lock delete mode 100644 examples/video-caching/ios/VideoCaching-tvOS/Info.plist delete mode 100644 examples/video-caching/ios/VideoCaching-tvOSTests/Info.plist delete mode 100644 examples/video-caching/ios/VideoCaching.xcodeproj/project.pbxproj delete mode 100644 examples/video-caching/ios/VideoCaching.xcodeproj/xcshareddata/xcschemes/VideoCaching-tvOS.xcscheme delete mode 100644 examples/video-caching/ios/VideoCaching.xcodeproj/xcshareddata/xcschemes/VideoCaching.xcscheme delete mode 100644 examples/video-caching/ios/VideoCaching/AppDelegate.h delete mode 100644 examples/video-caching/ios/VideoCaching/AppDelegate.m delete mode 100644 examples/video-caching/ios/VideoCaching/Base.lproj/LaunchScreen.xib delete mode 100644 examples/video-caching/ios/VideoCaching/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/video-caching/ios/VideoCaching/Images.xcassets/Contents.json delete mode 100644 examples/video-caching/ios/VideoCaching/Info.plist delete mode 100644 examples/video-caching/ios/VideoCaching/main.m delete mode 100644 examples/video-caching/ios/VideoCachingTests/Info.plist delete mode 100644 examples/video-caching/ios/VideoCachingTests/VideoCachingTests.m delete mode 100644 examples/video-caching/package.json delete mode 100644 examples/video-caching/rn-cli.config.js delete mode 100755 examples/video-caching/update.sh diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index d33db3b3..78664b2a 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -7,16 +7,16 @@ on: paths: - '.github/workflows/build-android.yml' - 'android/**' - - 'examples/basic/android/**' + - 'examples/bare/android/**' - 'yarn.lock' - - 'examples/basic/yarn.lock' + - 'examples/bare/yarn.lock' pull_request: paths: - '.github/workflows/build-android.yml' - 'android/**' - - 'examples/basic/android/**' + - 'examples/bare/android/**' - 'yarn.lock' - - 'examples/basic/yarn.lock' + - 'examples/bare/yarn.lock' jobs: build: @@ -32,10 +32,18 @@ jobs: java-version: 17 java-package: jdk - - name: Install node_modules + - name: Install node_modules at Root uses: ./.github/actions/setup-node with: - working-directory: examples/basic + working-directory: ./ + + - name: Build Library + run: yarn build + + - name: Install node_modules at Example + uses: ./.github/actions/setup-node + with: + working-directory: examples/bare - name: Restore Gradle cache uses: actions/cache@v3 @@ -46,11 +54,11 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - - name: Run Gradle Build for basic example - run: cd examples/basic/android && ./gradlew assembleDebug --build-cache && cd ../../.. + - name: Run Gradle Build for bare example + run: cd examples/bare/android && ./gradlew assembleDebug --build-cache && cd ../../.. - build-without-ads: - name: Build Android Example App Without Ads + build-with-ads: + name: Build Android Example App With Ads runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -62,10 +70,18 @@ jobs: java-version: 17 java-package: jdk - - name: Install node_modules + - name: Install node_modules at Root uses: ./.github/actions/setup-node with: - working-directory: examples/basic + working-directory: ./ + + - name: Build Library + run: yarn build + + - name: Install node_modules at Example + uses: ./.github/actions/setup-node + with: + working-directory: examples/bare - name: Restore Gradle cache uses: actions/cache@v3 @@ -76,5 +92,5 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - - name: Run Gradle Build for basic example - run: cd examples/basic/android && export RNV_SAMPLE_ENABLE_ADS=false && ./gradlew assembleDebug --build-cache && cd ../../.. \ No newline at end of file + - name: Run Gradle Build for bare example + run: cd examples/bare/android && export RNV_SAMPLE_ENABLE_ADS=true && ./gradlew assembleDebug --build-cache && cd ../../.. diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 9e9d4854..f78a8105 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -9,28 +9,37 @@ on: - '.github/workflows/build-ios.yml' - 'ios/**' - '*.podspec' - - 'examples/basic/ios/**' + - 'examples/bare/ios/**' pull_request: paths: - '.github/workflows/build-ios.yml' - 'ios/**' - '*.podspec' - - 'examples/basic/ios/**' + - 'examples/bare/ios/**' jobs: build: name: Build iOS Example App - runs-on: macos-14 # This allow us to use Xcode 15.0.1 which is a lot faster - TODO change to "macos-latest" once it's out of beta + runs-on: macos-latest defaults: run: - working-directory: examples/basic/ios + working-directory: examples/bare/ios steps: - uses: actions/checkout@v4 - - name: Install node_modules + - name: Install node_modules at Root uses: ./.github/actions/setup-node with: - working-directory: examples/basic + working-directory: ./ + + - name: Build Library + working-directory: ./ + run: yarn build + + - name: Install node_modules at Example + uses: ./.github/actions/setup-node + with: + working-directory: examples/bare - name: Restore buildcache uses: mikehardy/buildcache-action@v2 @@ -46,21 +55,27 @@ jobs: uses: actions/cache@v3 with: path: | - examples/basic/ios/Pods + examples/bare/ios/Pods ~/Library/Caches/CocoaPods ~/.cocoapods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- + + - name: Generate Native Project + run: pod install + - name: Install Pods run: pod install + - name: Install xcpretty run: gem install xcpretty + - name: Build App run: "set -o pipefail && xcodebuild \ -derivedDataPath build -UseModernBuildSystem=YES \ - -workspace videoplayer.xcworkspace \ - -scheme videoplayer \ + -workspace BareExample.xcworkspace \ + -scheme BareExample \ -sdk iphonesimulator \ -configuration Debug \ -destination 'platform=iOS Simulator,name=iPhone 14' \ @@ -69,17 +84,26 @@ jobs: build-with-ads: name: Build iOS Example App With Ads - runs-on: macos-14 # This allow us to use Xcode 15.0.1 which is a lot faster - TODO change to "macos-latest" once it's out of beta + runs-on: macos-latest defaults: run: - working-directory: examples/basic/ios + working-directory: examples/bare/ios steps: - uses: actions/checkout@v4 - - name: Install node_modules + - name: Install node_modules at Root uses: ./.github/actions/setup-node with: - working-directory: examples/basic + working-directory: ./ + + - name: Build Library + working-directory: ./ + run: yarn build + + - name: Install node_modules at Example + uses: ./.github/actions/setup-node + with: + working-directory: examples/bare - name: Restore buildcache uses: mikehardy/buildcache-action@v2 @@ -95,21 +119,27 @@ jobs: uses: actions/cache@v3 with: path: | - examples/basic/ios/Pods + examples/bare/ios/Pods ~/Library/Caches/CocoaPods ~/.cocoapods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- + + - name: Generate Native Project + run: export RNV_SAMPLE_ENABLE_ADS=true && pod install + - name: Install Pods run: export RNV_SAMPLE_ENABLE_ADS=true && pod install + - name: Install xcpretty run: gem install xcpretty + - name: Build App run: "set -o pipefail && export RNV_SAMPLE_ENABLE_ADS=true && xcodebuild \ -derivedDataPath build -UseModernBuildSystem=YES \ - -workspace videoplayer.xcworkspace \ - -scheme videoplayer \ + -workspace BareExample.xcworkspace \ + -scheme BareExample \ -sdk iphonesimulator \ -configuration Debug \ -destination 'platform=iOS Simulator,name=iPhone 14' \ @@ -118,17 +148,26 @@ jobs: build-with-caching: name: Build iOS Example App With Caching - runs-on: macos-14 # This allow us to use Xcode 15.0.1 which is a lot faster - TODO change to "macos-latest" once it's out of beta + runs-on: macos-latest defaults: run: - working-directory: examples/basic/ios + working-directory: examples/bare/ios steps: - uses: actions/checkout@v4 - - name: Install node_modules + - name: Install node_modules at Root uses: ./.github/actions/setup-node with: - working-directory: examples/basic + working-directory: ./ + + - name: Build Library + working-directory: ./ + run: yarn build + + - name: Install node_modules at Example + uses: ./.github/actions/setup-node + with: + working-directory: examples/bare - name: Restore buildcache uses: mikehardy/buildcache-action@v2 @@ -144,21 +183,27 @@ jobs: uses: actions/cache@v3 with: path: | - examples/basic/ios/Pods + examples/bare/ios/Pods ~/Library/Caches/CocoaPods ~/.cocoapods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- + + - name: Generate Native Project + run: export RNV_SAMPLE_VIDEO_CACHING=true && pod install + - name: Install Pods run: export RNV_SAMPLE_VIDEO_CACHING=true && pod install + - name: Install xcpretty run: gem install xcpretty + - name: Build App run: "set -o pipefail && export RNV_SAMPLE_VIDEO_CACHING=true && xcodebuild \ -derivedDataPath build -UseModernBuildSystem=YES \ - -workspace videoplayer.xcworkspace \ - -scheme videoplayer \ + -workspace BareExample.xcworkspace \ + -scheme BareExample \ -sdk iphonesimulator \ -configuration Debug \ -destination 'platform=iOS Simulator,name=iPhone 14' \ diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index bbf5bdae..3e330ad3 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -17,5 +17,10 @@ "type": "separator", "title": "" }, + "example_apps": { + "title": "Example Apps", + "newWindow": true, + "href": "https://github.com/TheWidlarzGroup/react-native-video/tree/master/examples" + }, "projects": "Useful projects" } \ No newline at end of file diff --git a/examples/FabricExample/.buckconfig b/examples/FabricExample/.buckconfig deleted file mode 100644 index 934256cb..00000000 --- a/examples/FabricExample/.buckconfig +++ /dev/null @@ -1,6 +0,0 @@ - -[android] - target = Google Inc.:Google APIs:23 - -[maven_repositories] - central = https://repo1.maven.org/maven2 diff --git a/examples/FabricExample/.bundle/config b/examples/FabricExample/.bundle/config deleted file mode 100644 index 848943bb..00000000 --- a/examples/FabricExample/.bundle/config +++ /dev/null @@ -1,2 +0,0 @@ -BUNDLE_PATH: "vendor/bundle" -BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/examples/FabricExample/.eslintrc.js b/examples/FabricExample/.eslintrc.js deleted file mode 100644 index 9dd57a79..00000000 --- a/examples/FabricExample/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native', - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - overrides: [ - { - files: ['*.ts', '*.tsx'], - rules: { - '@typescript-eslint/no-shadow': ['error'], - 'no-shadow': 'off', - 'no-undef': 'off', - }, - }, - ], -}; diff --git a/examples/FabricExample/.gitignore b/examples/FabricExample/.gitignore deleted file mode 100644 index 613b9bdc..00000000 --- a/examples/FabricExample/.gitignore +++ /dev/null @@ -1,67 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -ios/.xcode.env.local - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof -.cxx/ - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -# BUCK -buck-out/ -\.buckd/ -*.keystore -!debug.keystore - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -**/fastlane/report.xml -**/fastlane/Preview.html -**/fastlane/screenshots -**/fastlane/test_output - -# Bundle artifact -*.jsbundle - -# Ruby / CocoaPods -/ios/Pods/ -/vendor/bundle/ - -# testing -/coverage \ No newline at end of file diff --git a/examples/FabricExample/.prettierrc.js b/examples/FabricExample/.prettierrc.js deleted file mode 100644 index 2b540746..00000000 --- a/examples/FabricExample/.prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - arrowParens: 'avoid', - bracketSameLine: true, - bracketSpacing: false, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/examples/FabricExample/.ruby-version b/examples/FabricExample/.ruby-version deleted file mode 100644 index a603bb50..00000000 --- a/examples/FabricExample/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.7.5 diff --git a/examples/FabricExample/.watchmanconfig b/examples/FabricExample/.watchmanconfig deleted file mode 100644 index 9e26dfee..00000000 --- a/examples/FabricExample/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/examples/FabricExample/App.tsx b/examples/FabricExample/App.tsx deleted file mode 100644 index 2a3575dc..00000000 --- a/examples/FabricExample/App.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * Generated with the TypeScript template - * https://github.com/react-native-community/react-native-template-typescript - * - * @format - */ - -import React, {type PropsWithChildren} from 'react'; -import {StyleSheet, View} from 'react-native'; -import VideoPlayer from './src/VideoPlayer'; - -const App = () => { - return ; -}; - -export default App; diff --git a/examples/FabricExample/Gemfile b/examples/FabricExample/Gemfile deleted file mode 100644 index 6a7d5c7a..00000000 --- a/examples/FabricExample/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://rubygems.org' - -# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby ">= 2.6.10" - -gem 'cocoapods', '~> 1.13' -gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/examples/FabricExample/Gemfile.lock b/examples/FabricExample/Gemfile.lock deleted file mode 100644 index ab5cb310..00000000 --- a/examples/FabricExample/Gemfile.lock +++ /dev/null @@ -1,107 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.7) - base64 - nkf - rexml - activesupport (6.1.7.8) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - algoliasearch (1.27.5) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - atomos (0.1.3) - base64 (0.2.0) - claide (1.1.0) - cocoapods (1.15.2) - addressable (~> 2.8) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.15.2) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 2.1, < 3.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.6.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.8.0) - nap (~> 1.0) - ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.15.2) - activesupport (>= 5.0, < 8) - addressable (~> 2.8) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - netrc (~> 0.11) - public_suffix (~> 4.0) - typhoeus (~> 1.0) - cocoapods-deintegrate (1.0.5) - cocoapods-downloader (2.1) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.1) - cocoapods-trunk (1.6.0) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.2.0) - colored2 (3.1.2) - concurrent-ruby (1.2.2) - escape (0.0.4) - ethon (0.16.0) - ffi (>= 1.15.0) - ffi (1.17.0) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - httpclient (2.8.3) - i18n (1.12.0) - concurrent-ruby (~> 1.0) - json (2.7.2) - minitest (5.18.0) - molinillo (0.8.0) - nanaimo (0.3.0) - nap (1.1.0) - netrc (0.11.0) - nkf (0.2.0) - public_suffix (4.0.7) - rexml (3.2.9) - strscan - ruby-macho (2.5.1) - strscan (3.1.0) - typhoeus (1.4.1) - ethon (>= 0.9.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) - xcodeproj (1.24.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) - zeitwerk (2.6.16) - -PLATFORMS - ruby - -DEPENDENCIES - activesupport (>= 6.1.7.3, < 7.1.0) - cocoapods (~> 1.13) - -RUBY VERSION - ruby 2.7.5p203 - -BUNDLED WITH - 2.4.5 diff --git a/examples/FabricExample/__tests__/App-test.tsx b/examples/FabricExample/__tests__/App-test.tsx deleted file mode 100644 index 9eac6fbc..00000000 --- a/examples/FabricExample/__tests__/App-test.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @format - */ - -import 'react-native'; -import React from 'react'; -import App from '../App'; - -// Note: import explicitly to use the types shipped with jest. -import {it} from '@jest/globals'; - -// Note: test renderer must be required after react-native. -import renderer from 'react-test-renderer'; - -it('renders correctly', () => { - renderer.create(); -}); diff --git a/examples/FabricExample/android/app/_BUCK b/examples/FabricExample/android/app/_BUCK deleted file mode 100644 index 6f629726..00000000 --- a/examples/FabricExample/android/app/_BUCK +++ /dev/null @@ -1,55 +0,0 @@ -# To learn about Buck see [Docs](https://buckbuild.com/). -# To run your application with Buck: -# - install Buck -# - `npm start` - to start the packager -# - `cd android` -# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` -# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck -# - `buck install -r android/app` - compile, install and run application -# - -load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") - -lib_deps = [] - -create_aar_targets(glob(["libs/*.aar"])) - -create_jar_targets(glob(["libs/*.jar"])) - -android_library( - name = "all-libs", - exported_deps = lib_deps, -) - -android_library( - name = "app-code", - srcs = glob([ - "src/main/java/**/*.java", - ]), - deps = [ - ":all-libs", - ":build_config", - ":res", - ], -) - -android_build_config( - name = "build_config", - package = "net.video.fabricexample", -) - -android_resource( - name = "res", - package = "net.video.fabricexample", - res = "src/main/res", -) - -android_binary( - name = "app", - keystore = "//android/keystores:debug", - manifest = "src/main/AndroidManifest.xml", - package_type = "debug", - deps = [ - ":app-code", - ], -) diff --git a/examples/FabricExample/android/app/build.gradle b/examples/FabricExample/android/app/build.gradle deleted file mode 100644 index 6da4d1a8..00000000 --- a/examples/FabricExample/android/app/build.gradle +++ /dev/null @@ -1,123 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "org.jetbrains.kotlin.android" -apply plugin: "com.facebook.react" - -import com.android.build.OutputFile - -/** - * This is the configuration block to customize your React Native Android app. - * By default you don't need to apply any configuration, just uncomment the lines you need. - */ -react { - /* Folders */ - // The root of your project, i.e. where "package.json" lives. Default is '..' - // root = file("../") - // The folder where the react-native NPM package is. Default is ../node_modules/react-native - // reactNativeDir = file("../node-modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen - // codegenDir = file("../node_modules/@react-native/codegen") - // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js - // cliFile = file("../node_modules/react-native/cli.js") - - /* Variants */ - // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. - // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. - // debuggableVariants = ["liteDebug", "prodDebug"] - - /* Bundling */ - // A list containing the node command and its flags. Default is just 'node'. - // nodeExecutableAndArgs = ["node"] - // - // The command to run when bundling. By default is 'bundle' - // bundleCommand = "ram-bundle" - // - // The path to the CLI configuration file. Default is empty. - // bundleConfig = file(../rn-cli.config.js) - // - // The name of the generated asset file containing your JS bundle - // bundleAssetName = "MyApplication.android.bundle" - // - // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") - // - // A list of extra flags to pass to the 'bundle' commands. - // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle - // extraPackagerArgs = [] - - /* Hermes Commands */ - // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" - // - // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" - // hermesFlags = ["-O", "-output-source-map"] -} - -/** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. - */ -def enableProguardInReleaseBuilds = false - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * The international variant includes ICU i18n library and necessary data - * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that - * this variant is about 6MiB larger per architecture than default. - */ -def jscFlavor = 'org.webkit:android-jsc:+' - -android { - ndkVersion rootProject.ext.ndkVersion - - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion - - namespace "net.video.fabricexample" - defaultConfig { - applicationId "net.video.fabricexample" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - } - - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.debug - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - implementation("com.facebook.react:flipper-integration") - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} - -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) \ No newline at end of file diff --git a/examples/FabricExample/android/app/build_defs.bzl b/examples/FabricExample/android/app/build_defs.bzl deleted file mode 100644 index fff270f8..00000000 --- a/examples/FabricExample/android/app/build_defs.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Helper definitions to glob .aar and .jar targets""" - -def create_aar_targets(aarfiles): - for aarfile in aarfiles: - name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] - lib_deps.append(":" + name) - android_prebuilt_aar( - name = name, - aar = aarfile, - ) - -def create_jar_targets(jarfiles): - for jarfile in jarfiles: - name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] - lib_deps.append(":" + name) - prebuilt_jar( - name = name, - binary_jar = jarfile, - ) diff --git a/examples/FabricExample/android/app/proguard-rules.pro b/examples/FabricExample/android/app/proguard-rules.pro deleted file mode 100644 index 11b02572..00000000 --- a/examples/FabricExample/android/app/proguard-rules.pro +++ /dev/null @@ -1,10 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: diff --git a/examples/FabricExample/android/app/src/main/AndroidManifest.xml b/examples/FabricExample/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 91cd85a6..00000000 --- a/examples/FabricExample/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.kt b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.kt deleted file mode 100644 index d88d6bb9..00000000 --- a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.kt +++ /dev/null @@ -1,22 +0,0 @@ -package net.video.fabricexample - -import com.facebook.react.ReactActivity -import com.facebook.react.ReactActivityDelegate -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled -import com.facebook.react.defaults.DefaultReactActivityDelegate - -class MainActivity : ReactActivity() { - - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - override fun getMainComponentName(): String = "FabricExample" - - /** - * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] - * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] - */ - override fun createReactActivityDelegate(): ReactActivityDelegate = - DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) -} \ No newline at end of file diff --git a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.kt b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.kt deleted file mode 100644 index d6909c94..00000000 --- a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.kt +++ /dev/null @@ -1,45 +0,0 @@ -package net.video.fabricexample - -import android.app.Application -import com.facebook.react.PackageList -import com.facebook.react.ReactApplication -import com.facebook.react.ReactHost -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.flipper.ReactNativeFlipper -import com.facebook.soloader.SoLoader - -class MainApplication : Application(), ReactApplication { - - override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { - override fun getPackages(): List = - PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here, for example: - // add(MyReactNativePackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - - override val reactHost: ReactHost - get() = getDefaultReactHost(this.applicationContext, reactNativeHost) - - override fun onCreate() { - super.onCreate() - SoLoader.init(this, false) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } - ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager) - } -} diff --git a/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt b/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt deleted file mode 100644 index 119269e6..00000000 --- a/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -cmake_minimum_required(VERSION 3.13) - -# Define the library name here. -project(fabricexample_appmodules) - -# This file includes all the necessary to let you build your application with the New Architecture. -include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake) diff --git a/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp b/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp deleted file mode 100644 index 26162dd8..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "MainApplicationModuleProvider.h" - -#include -#include - -namespace facebook { -namespace react { - -std::shared_ptr MainApplicationModuleProvider( - const std::string &moduleName, - const JavaTurboModule::InitParams ¶ms) { - // Here you can provide your own module provider for TurboModules coming from - // either your application or from external libraries. The approach to follow - // is similar to the following (for a library called `samplelibrary`: - // - // auto module = samplelibrary_ModuleProvider(moduleName, params); - // if (module != nullptr) { - // return module; - // } - // return rncore_ModuleProvider(moduleName, params); - - // Module providers autolinked by RN CLI - auto rncli_module = rncli_ModuleProvider(moduleName, params); - if (rncli_module != nullptr) { - return rncli_module; - } - - return rncore_ModuleProvider(moduleName, params); -} - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h b/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h deleted file mode 100644 index b38ccf53..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include - -#include - -namespace facebook { -namespace react { - -std::shared_ptr MainApplicationModuleProvider( - const std::string &moduleName, - const JavaTurboModule::InitParams ¶ms); - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp b/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp deleted file mode 100644 index 5fd688c5..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "MainApplicationTurboModuleManagerDelegate.h" -#include "MainApplicationModuleProvider.h" - -namespace facebook { -namespace react { - -jni::local_ref -MainApplicationTurboModuleManagerDelegate::initHybrid( - jni::alias_ref) { - return makeCxxInstance(); -} - -void MainApplicationTurboModuleManagerDelegate::registerNatives() { - registerHybrid({ - makeNativeMethod( - "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid), - makeNativeMethod( - "canCreateTurboModule", - MainApplicationTurboModuleManagerDelegate::canCreateTurboModule), - }); -} - -std::shared_ptr -MainApplicationTurboModuleManagerDelegate::getTurboModule( - const std::string &name, - const std::shared_ptr &jsInvoker) { - // Not implemented yet: provide pure-C++ NativeModules here. - return nullptr; -} - -std::shared_ptr -MainApplicationTurboModuleManagerDelegate::getTurboModule( - const std::string &name, - const JavaTurboModule::InitParams ¶ms) { - return MainApplicationModuleProvider(name, params); -} - -bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule( - const std::string &name) { - return getTurboModule(name, nullptr) != nullptr || - getTurboModule(name, {.moduleName = name}) != nullptr; -} - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h b/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h deleted file mode 100644 index b2b85e64..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include - -#include -#include - -namespace facebook { -namespace react { - -class MainApplicationTurboModuleManagerDelegate - : public jni::HybridClass< - MainApplicationTurboModuleManagerDelegate, - TurboModuleManagerDelegate> { - public: - // Adapt it to the package you used for your Java class. - static constexpr auto kJavaDescriptor = - "Lnet/video/fabricexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;"; - - static jni::local_ref initHybrid(jni::alias_ref); - - static void registerNatives(); - - std::shared_ptr getTurboModule( - const std::string &name, - const std::shared_ptr &jsInvoker) override; - std::shared_ptr getTurboModule( - const std::string &name, - const JavaTurboModule::InitParams ¶ms) override; - - /** - * Test-only method. Allows user to verify whether a TurboModule can be - * created by instances of this class. - */ - bool canCreateTurboModule(const std::string &name); -}; - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp b/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp deleted file mode 100644 index 54f598a4..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "MainComponentsRegistry.h" - -#include -#include -#include -#include -#include - -namespace facebook { -namespace react { - -MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {} - -std::shared_ptr -MainComponentsRegistry::sharedProviderRegistry() { - auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry(); - - // Autolinked providers registered by RN CLI - rncli_registerProviders(providerRegistry); - - // Custom Fabric Components go here. You can register custom - // components coming from your App or from 3rd party libraries here. - // - // providerRegistry->add(concreteComponentDescriptorProvider< - // AocViewerComponentDescriptor>()); - return providerRegistry; -} - -jni::local_ref -MainComponentsRegistry::initHybrid( - jni::alias_ref, - ComponentFactory *delegate) { - auto instance = makeCxxInstance(delegate); - - auto buildRegistryFunction = - [](EventDispatcher::Weak const &eventDispatcher, - ContextContainer::Shared const &contextContainer) - -> ComponentDescriptorRegistry::Shared { - auto registry = MainComponentsRegistry::sharedProviderRegistry() - ->createComponentDescriptorRegistry( - {eventDispatcher, contextContainer}); - - auto mutableRegistry = - std::const_pointer_cast(registry); - - mutableRegistry->setFallbackComponentDescriptor( - std::make_shared( - ComponentDescriptorParameters{ - eventDispatcher, contextContainer, nullptr})); - - return registry; - }; - - delegate->buildRegistryFunction = buildRegistryFunction; - return instance; -} - -void MainComponentsRegistry::registerNatives() { - registerHybrid({ - makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid), - }); -} - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h b/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h deleted file mode 100644 index 011a3486..00000000 --- a/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace facebook { -namespace react { - -class MainComponentsRegistry - : public facebook::jni::HybridClass { - public: - // Adapt it to the package you used for your Java class. - constexpr static auto kJavaDescriptor = - "Lnet/video/fabricexample/newarchitecture/components/MainComponentsRegistry;"; - - static void registerNatives(); - - MainComponentsRegistry(ComponentFactory *delegate); - - private: - static std::shared_ptr - sharedProviderRegistry(); - - static jni::local_ref initHybrid( - jni::alias_ref, - ComponentFactory *delegate); -}; - -} // namespace react -} // namespace facebook diff --git a/examples/FabricExample/android/app/src/main/jni/OnLoad.cpp b/examples/FabricExample/android/app/src/main/jni/OnLoad.cpp deleted file mode 100644 index c569b6e8..00000000 --- a/examples/FabricExample/android/app/src/main/jni/OnLoad.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "MainApplicationTurboModuleManagerDelegate.h" -#include "MainComponentsRegistry.h" - -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { - return facebook::jni::initialize(vm, [] { - facebook::react::MainApplicationTurboModuleManagerDelegate:: - registerNatives(); - facebook::react::MainComponentsRegistry::registerNatives(); - }); -} diff --git a/examples/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml b/examples/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml deleted file mode 100644 index f35d9962..00000000 --- a/examples/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - diff --git a/examples/FabricExample/android/app/src/main/res/values/strings.xml b/examples/FabricExample/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 30038583..00000000 --- a/examples/FabricExample/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - FabricExample - diff --git a/examples/FabricExample/android/app/src/main/res/values/styles.xml b/examples/FabricExample/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 7ba83a2a..00000000 --- a/examples/FabricExample/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/examples/FabricExample/android/build.gradle b/examples/FabricExample/android/build.gradle deleted file mode 100644 index 992bdc08..00000000 --- a/examples/FabricExample/android/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = "34.0.0" - minSdkVersion = 23 - compileSdkVersion = 34 - targetSdkVersion = 34 - ndkVersion = "26.1.10909125" - kotlinVersion = "1.9.22" - - useExoplayerIMA = System.getenv("RNV_SAMPLE_ENABLE_ADS") ?: true - useExoplayerRtsp = true - } - repositories { - google() - mavenCentral() - } -dependencies { - classpath("com.android.tools.build:gradle") - classpath("com.facebook.react:react-native-gradle-plugin") - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - } -} - -apply plugin: "com.facebook.react.rootproject" \ No newline at end of file diff --git a/examples/FabricExample/android/gradle.properties b/examples/FabricExample/android/gradle.properties deleted file mode 100644 index a0f7834e..00000000 --- a/examples/FabricExample/android/gradle.properties +++ /dev/null @@ -1,39 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - -# Use this property to specify which architecture you want to build. -# You can also override it from the CLI using -# ./gradlew -PreactNativeArchitectures=x86_64 -reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 - -# Use this property to enable support to the new architecture. -# This will allow you to use TurboModules and the Fabric render in -# your application. You should enable this flag either if you want -# to write custom TurboModules/Fabric components OR use libraries that -# are providing them. -newArchEnabled=true - -hermesEnabled=true \ No newline at end of file diff --git a/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.jar b/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/examples/FabricExample/android/gradlew.bat b/examples/FabricExample/android/gradlew.bat deleted file mode 100644 index 2b2bdaa1..00000000 --- a/examples/FabricExample/android/gradlew.bat +++ /dev/null @@ -1,178 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/examples/FabricExample/android/settings.gradle b/examples/FabricExample/android/settings.gradle deleted file mode 100644 index e5a889bc..00000000 --- a/examples/FabricExample/android/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -rootProject.name = 'FabricExample' -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) -include ':app' -includeBuild('../node_modules/@react-native/gradle-plugin') - -// if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { -// include(":ReactAndroid") -// project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') -// include(":ReactAndroid:hermes-engine") -// project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine') -// } diff --git a/examples/FabricExample/app.json b/examples/FabricExample/app.json deleted file mode 100644 index 957883ae..00000000 --- a/examples/FabricExample/app.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "FabricExample", - "displayName": "FabricExample" -} \ No newline at end of file diff --git a/examples/FabricExample/babel.config.js b/examples/FabricExample/babel.config.js deleted file mode 100644 index bd1f13f2..00000000 --- a/examples/FabricExample/babel.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const path = require('path'); -const pak = require('../../package.json'); - -module.exports = { - presets: ['module:@react-native/babel-preset'], - plugins: [ - [ - 'module-resolver', - { - extensions: ['.tsx', '.ts', '.js', '.json'], - alias: { - [pak.name]: path.join(__dirname, '../../', pak.source), - }, - }, - ], - ], -}; diff --git a/examples/FabricExample/index.js b/examples/FabricExample/index.js deleted file mode 100644 index a850d031..00000000 --- a/examples/FabricExample/index.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @format - */ - -import {AppRegistry} from 'react-native'; -import App from './App'; -import {name as appName} from './app.json'; - -AppRegistry.registerComponent(appName, () => App); diff --git a/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj b/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj deleted file mode 100644 index 26875e8c..00000000 --- a/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,730 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 00E356F31AD99517003FC87E /* FabricExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* FabricExampleTests.m */; }; - 0C80B921A6F3F58F76C31292 /* libPods-FabricExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 7699B88040F8A987B510C191 /* libPods-FabricExample-FabricExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */; }; - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = FabricExample; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FabricExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* FabricExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FabricExampleTests.m; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* FabricExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FabricExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = FabricExample/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = FabricExample/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = FabricExample/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = FabricExample/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = FabricExample/main.m; sourceTree = ""; }; - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FabricExample-FabricExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample.debug.xcconfig"; path = "Target Support Files/Pods-FabricExample/Pods-FabricExample.debug.xcconfig"; sourceTree = ""; }; - 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample.release.xcconfig"; path = "Target Support Files/Pods-FabricExample/Pods-FabricExample.release.xcconfig"; sourceTree = ""; }; - 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample-FabricExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests.debug.xcconfig"; sourceTree = ""; }; - 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FabricExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = FabricExample/LaunchScreen.storyboard; sourceTree = ""; }; - 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample-FabricExampleTests.release.xcconfig"; path = "Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests.release.xcconfig"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7699B88040F8A987B510C191 /* libPods-FabricExample-FabricExampleTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0C80B921A6F3F58F76C31292 /* libPods-FabricExample.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* FabricExampleTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* FabricExampleTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = FabricExampleTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* FabricExample */ = { - isa = PBXGroup; - children = ( - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = FabricExample; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */, - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* FabricExample */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* FabricExampleTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - BBD78D7AC51CEA395F1C20DB /* Pods */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* FabricExample.app */, - 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - BBD78D7AC51CEA395F1C20DB /* Pods */ = { - isa = PBXGroup; - children = ( - 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */, - 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */, - 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */, - 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* FabricExampleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "FabricExampleTests" */; - buildPhases = ( - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = FabricExampleTests; - productReference = 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* FabricExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "FabricExample" */; - buildPhases = ( - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, - FD10A7F022414F080027D42C /* Start Packager */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FabricExample; - productName = FabricExample; - productReference = 13B07F961A680F5B00A75B9A /* FabricExample.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1210; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1120; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "FabricExample" */; - compatibilityVersion = "Xcode 12.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* FabricExample */, - 00E356ED1AD99517003FC87E /* FabricExampleTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/.xcode.env.local", - "$(SRCROOT)/.xcode.env", - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; - }; - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-FabricExample-FabricExampleTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-FabricExample-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - FD10A7F022414F080027D42C /* Start Packager */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Start Packager"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* FabricExampleTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* FabricExample */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = FabricExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = net.video.fabricexample; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FabricExample.app/FabricExample"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - INFOPLIST_FILE = FabricExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = net.video.fabricexample; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FabricExample.app/FabricExample"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = FabricExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = FabricExample; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = net.video.fabricexample; - PRODUCT_NAME = FabricExample; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = FabricExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = FabricExample; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = net.video.fabricexample; - PRODUCT_NAME = FabricExample; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-DRN_FABRIC_ENABLED", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DRN_FABRIC_ENABLED", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-Wl", - "-ld_classic", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.4; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-DRN_FABRIC_ENABLED", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DRN_FABRIC_ENABLED", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-Wl", - "-ld_classic", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "FabricExampleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "FabricExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "FabricExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/examples/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme b/examples/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme deleted file mode 100644 index bc4aae22..00000000 --- a/examples/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata b/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 3e9ae53e..00000000 --- a/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.h b/examples/FabricExample/ios/FabricExample/AppDelegate.h deleted file mode 100644 index 5d280825..00000000 --- a/examples/FabricExample/ios/FabricExample/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : RCTAppDelegate - -@end diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.mm b/examples/FabricExample/ios/FabricExample/AppDelegate.mm deleted file mode 100644 index a429e31e..00000000 --- a/examples/FabricExample/ios/FabricExample/AppDelegate.mm +++ /dev/null @@ -1,31 +0,0 @@ -#import "AppDelegate.h" - -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"FabricExample"; - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self getBundleURL]; -} - -- (NSURL *)getBundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -@end diff --git a/examples/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 81213230..00000000 --- a/examples/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/FabricExample/ios/FabricExample/Images.xcassets/Contents.json b/examples/FabricExample/ios/FabricExample/Images.xcassets/Contents.json deleted file mode 100644 index 2d92bd53..00000000 --- a/examples/FabricExample/ios/FabricExample/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/examples/FabricExample/ios/FabricExample/Info.plist b/examples/FabricExample/ios/FabricExample/Info.plist deleted file mode 100644 index b0cb3dac..00000000 --- a/examples/FabricExample/ios/FabricExample/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - FabricExample - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/FabricExample/ios/FabricExample/LaunchScreen.storyboard b/examples/FabricExample/ios/FabricExample/LaunchScreen.storyboard deleted file mode 100644 index c4f28caf..00000000 --- a/examples/FabricExample/ios/FabricExample/LaunchScreen.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/FabricExample/ios/FabricExample/main.m b/examples/FabricExample/ios/FabricExample/main.m deleted file mode 100644 index d645c724..00000000 --- a/examples/FabricExample/ios/FabricExample/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples/FabricExample/ios/FabricExampleTests/FabricExampleTests.m b/examples/FabricExample/ios/FabricExampleTests/FabricExampleTests.m deleted file mode 100644 index f023368a..00000000 --- a/examples/FabricExample/ios/FabricExampleTests/FabricExampleTests.m +++ /dev/null @@ -1,66 +0,0 @@ -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React" - -@interface FabricExampleTests : XCTestCase - -@end - -@implementation FabricExampleTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; -#ifdef DEBUG - RCTSetLogFunction( - ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); -#endif - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view - matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - -#ifdef DEBUG - RCTSetLogFunction(RCTDefaultLogFunction); -#endif - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - -@end diff --git a/examples/FabricExample/ios/FabricExampleTests/Info.plist b/examples/FabricExample/ios/FabricExampleTests/Info.plist deleted file mode 100644 index ba72822e..00000000 --- a/examples/FabricExample/ios/FabricExampleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/examples/FabricExample/ios/Podfile b/examples/FabricExample/ios/Podfile deleted file mode 100644 index eeaebf83..00000000 --- a/examples/FabricExample/ios/Podfile +++ /dev/null @@ -1,39 +0,0 @@ -ENV['RCT_NEW_ARCH_ENABLED'] = "1" - -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip - -platform :ios, '13.4' -install! 'cocoapods', :deterministic_uuids => false - -target 'FabricExample' do - config = use_native_modules! - - use_react_native!( - :path => config[:reactNativePath], - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable the next line. - # :flipper_configuration => FlipperConfiguration.enabled, - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/.." - ) - - target 'FabricExampleTests' do - inherit! :complete - # Pods for testing - end - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false - ) - end -end diff --git a/examples/FabricExample/ios/_xcode.env b/examples/FabricExample/ios/_xcode.env deleted file mode 100644 index 3d5782c7..00000000 --- a/examples/FabricExample/ios/_xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/examples/FabricExample/jest.config.js b/examples/FabricExample/jest.config.js deleted file mode 100644 index 8130fead..00000000 --- a/examples/FabricExample/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - preset: 'react-native', -}; \ No newline at end of file diff --git a/examples/FabricExample/metro.config.js b/examples/FabricExample/metro.config.js deleted file mode 100644 index b5f681a8..00000000 --- a/examples/FabricExample/metro.config.js +++ /dev/null @@ -1,43 +0,0 @@ -const path = require('path'); -const escape = require('escape-string-regexp'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); -const pak = require('../../package.json'); -const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); - -const root = path.resolve(__dirname, '../../'); - -const modules = Object.keys({ - ...pak.peerDependencies, -}); - -const config = { - projectRoot: __dirname, - watchFolders: [root], - - // We need to make sure that only one version is loaded for peerDependencies - // So we block them at the root, and alias them to the versions in example's node_modules - resolver: { - blacklistRE: exclusionList( - modules.map( - (m) => - new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`) - ) - ), - - extraNodeModules: modules.reduce((acc, name) => { - acc[name] = path.join(__dirname, 'node_modules', name); - return acc; - }, {}), - }, - - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, -} - -module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/examples/FabricExample/package.json b/examples/FabricExample/package.json deleted file mode 100644 index 2fdbd92d..00000000 --- a/examples/FabricExample/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "fabricexample", - "version": "0.0.1", - "private": true, - "scripts": { - "android": "react-native run-android", - "ios": "react-native run-ios", - "start": "react-native start", - "test": "jest", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx", - "pod-install": "bundle exec npx pod-install --project-directory=ios --verbose" - }, - "dependencies": { - "@react-native-picker/picker": "2.7.5", - "react": "18.1.0", - "react-native": "0.73.2" - }, - "devDependencies": { - "@babel/core": "^7.12.9", - "@babel/runtime": "^7.12.5", - "@react-native-community/eslint-config": "^2.0.0", - "@react-native/babel-preset": "0.73.19", - "@react-native/eslint-config": "0.73.2", - "@react-native/metro-config": "0.73.3", - "@react-native/typescript-config": "0.73.1", - "@tsconfig/react-native": "^2.0.2", - "@types/jest": "^26.0.23", - "@types/react": "^18.2.6", - "@types/react-native": "^0.70.6", - "@types/react-test-renderer": "^18.0.0", - "@typescript-eslint/eslint-plugin": "^5.37.0", - "@typescript-eslint/parser": "^5.37.0", - "babel-jest": "^29.6.3", - "babel-plugin-module-resolver": "^5.0.0", - "eslint": "^7.32.0", - "jest": "^29.6.3", - "metro-react-native-babel-preset": "0.72.3", - "prettier": "2.8.8", - "react-test-renderer": "18.1.0", - "typescript": "5.0.4" - }, - "jest": { - "preset": "react-native", - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "jsx", - "json", - "node" - ] - }, - "engines": { - "node": ">=18" - } -} diff --git a/examples/FabricExample/react-native.config.js b/examples/FabricExample/react-native.config.js deleted file mode 100644 index 48ddfba3..00000000 --- a/examples/FabricExample/react-native.config.js +++ /dev/null @@ -1,10 +0,0 @@ -const path = require('path'); -const pak = require('../../package.json'); - -module.exports = { - dependencies: { - [pak.name]: { - root: path.join(__dirname, '../../'), - }, - }, -}; diff --git a/examples/FabricExample/src/VideoPlayer.tsx b/examples/FabricExample/src/VideoPlayer.tsx deleted file mode 100644 index ba12f403..00000000 --- a/examples/FabricExample/src/VideoPlayer.tsx +++ /dev/null @@ -1,831 +0,0 @@ -'use strict'; - -import React, {Component} from 'react'; - -import { - Text, - TouchableOpacity, - View, - ActivityIndicator, - ToastAndroid, - Platform, - Alert, -} from 'react-native'; - -import Video, { - AudioTrack, - OnAudioTracksData, - OnLoadData, - OnProgressData, - OnTextTracksData, - OnVideoAspectRatioData, - TextTrack, - VideoDecoderProperties, - OnBufferData, - OnAudioFocusChangedData, - OnVideoErrorData, - VideoRef, - ResizeMode, - SelectedTrack, - DRMType, - OnTextTrackDataChangedData, - TextTrackType, - ISO639_1, - OnSeekData, - OnPlaybackStateChangedData, - OnPlaybackRateChangeData, - OnVideoTracksData, - VideoTrack, - SelectedVideoTrackType, - SelectedVideoTrack, - BufferingStrategyType, - ReactVideoSource, - Drm, - TextTracks, -} from 'react-native-video'; -import ToggleControl from './ToggleControl'; -import MultiValueControl, { - MultiValueControlPropType, -} from './MultiValueControl'; -import styles from './styles'; -import AudioTrackSelector from './components/AudioTracksSelector'; -import TextTrackSelector from './components/TextTracksSelector'; -import VideoTrackSelector from './components/VideoTracksSelector'; -import Seeker from './components/Seeker'; - -type AdditionnalSourceInfo = { - textTracks: TextTracks; - adTagUrl: string; - description: string; - drm: Drm; - noView: boolean; -}; - -type SampleVideoSource = ReactVideoSource | AdditionnalSourceInfo; - -interface StateType { - rate: number; - volume: number; - muted: boolean; - resizeMode: ResizeMode; - duration: number; - currentTime: number; - videoWidth: number; - videoHeight: number; - paused: boolean; - fullscreen: true; - decoration: true; - isLoading: boolean; - audioTracks: Array; - textTracks: Array; - videoTracks: Array; - selectedAudioTrack: SelectedTrack | undefined; - selectedTextTrack: SelectedTrack | undefined; - selectedVideoTrack: SelectedVideoTrack; - srcListId: number; - loop: boolean; - showRNVControls: boolean; - useCache: boolean; - poster?: string; - showNotificationControls: boolean; - isSeeking: boolean; -} - -class VideoPlayer extends Component { - state: StateType = { - rate: 1, - volume: 1, - muted: false, - resizeMode: ResizeMode.CONTAIN, - duration: 0.0, - currentTime: 0.0, - videoWidth: 0, - videoHeight: 0, - paused: false, - fullscreen: true, - decoration: true, - isLoading: false, - audioTracks: [], - textTracks: [], - videoTracks: [], - selectedAudioTrack: undefined, - selectedTextTrack: undefined, - selectedVideoTrack: { - type: SelectedVideoTrackType.AUTO, - }, - srcListId: 0, - loop: false, - showRNVControls: false, - useCache: false, - poster: undefined, - showNotificationControls: false, - isSeeking: false, - }; - - // internal usage change to index if you want to select tracks by index instead of lang - textTracksSelectionBy = 'index'; - - srcAllPlatformList = [ - { - description: 'local file landscape', - uri: require('./broadchurch.mp4'), - }, - { - description: 'local file landscape cropped', - uri: require('./broadchurch.mp4'), - cropStart: 3000, - cropEnd: 10000, - }, - { - description: 'local file portrait', - uri: require('./portrait.mp4'), - metadata: { - title: 'Test Title', - subtitle: 'Test Subtitle', - artist: 'Test Artist', - description: 'Test Description', - imageUri: - 'https://pbs.twimg.com/profile_images/1498641868397191170/6qW2XkuI_400x400.png', - }, - }, - { - description: '(hls|live) red bull tv', - textTracksAllowChunklessPreparation: false, - uri: 'https://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master_928.m3u8', - metadata: { - title: 'Custom Title', - subtitle: 'Custom Subtitle', - artist: 'Custom Artist', - description: 'Custom Description', - imageUri: - 'https://pbs.twimg.com/profile_images/1498641868397191170/6qW2XkuI_400x400.png', - }, - }, - { - description: 'invalid URL', - uri: 'mmt://www.youtube.com', - type: 'mpd', - }, - {description: '(no url) Stopped playback', uri: undefined}, - { - description: '(no view) no View', - noView: true, - }, - { - description: 'Another live sample', - uri: 'https://live.forstreet.cl/live/livestream.m3u8', - }, - { - description: 'another bunny (can be saved)', - uri: 'https://rawgit.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4', - headers: {referer: 'www.github.com', 'User-Agent': 'react.native.video'}, - }, - { - description: 'sintel with subtitles', - uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8', - }, - { - description: 'sintel starts at 20sec', - uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8', - startPosition: 50000, - }, - { - description: 'BigBugBunny sideLoaded subtitles', - // sideloaded subtitles wont work for streaming like HLS on ios - // mp4 - uri: 'https://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', - textTracks: [ - { - title: 'test', - language: 'en' as ISO639_1, - type: TextTrackType.VTT, - uri: 'https://bitdash-a.akamaihd.net/content/sintel/subtitles/subtitles_en.vtt', - }, - ], - }, - ]; - - srcIosList = []; - - srcAndroidList = [ - { - description: 'Another live sample', - uri: 'https://live.forstreet.cl/live/livestream.m3u8', - }, - { - description: 'asset file', - uri: 'asset:///broadchurch.mp4', - }, - { - description: '(dash) sintel subtitles', - uri: 'https://bitmovin-a.akamaihd.net/content/sintel/sintel.mpd', - }, - { - description: '(mp4) big buck bunny', - uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', - }, - { - description: '(mp4|subtitles) demo with sintel Subtitles', - uri: 'http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,source,id,as&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=51AF5F39AB0CEC3E5497CD9C900EBFEAECCCB5C7.8506521BFC350652163895D4C26DEE124209AA9E&key=ik0', - type: 'mpd', - }, - { - description: '(mp4) big buck bunny With Ads', - adTagUrl: - 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator=', - uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4', - }, - { - description: 'WV: Secure SD & HD (cbcs,MP4,H264)', - uri: 'https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs.mpd', - drm: { - type: DRMType.WIDEVINE, - licenseServer: - 'https://proxy.uat.widevine.com/proxy?provider=widevine_test', - }, - }, - { - description: 'Secure UHD (cenc)', - uri: 'https://storage.googleapis.com/wvmedia/cenc/h264/tears/tears_uhd.mpd', - drm: { - type: DRMType.WIDEVINE, - licenseServer: - 'https://proxy.uat.widevine.com/proxy?provider=widevine_test', - }, - }, - { - description: 'rtsp big bug bunny', - uri: 'rtsp://rtspstream:3cfa3c36a9c00f4aa38f3cd35816b287@zephyr.rtsp.stream/movie', - type: 'rtsp', - }, - ]; - - // poster which can be displayed - samplePoster = - 'https://upload.wikimedia.org/wikipedia/commons/1/18/React_Native_Logo.png'; - - srcList: SampleVideoSource[] = this.srcAllPlatformList.concat( - Platform.OS === 'android' ? this.srcAndroidList : this.srcIosList, - ); - - video?: VideoRef; - - popupInfo = () => { - VideoDecoderProperties.getWidevineLevel().then((widevineLevel: number) => { - VideoDecoderProperties.isHEVCSupported().then((hevc: string) => { - VideoDecoderProperties.isCodecSupported('video/avc', 1920, 1080).then( - (avc: string) => { - this.toast( - true, - 'Widevine level: ' + - widevineLevel + - '\n hevc: ' + - hevc + - '\n avc: ' + - avc, - ); - }, - ); - }); - }); - }; - - onLoad = (data: OnLoadData) => { - this.setState({duration: data.duration, loading: false}); - this.onAudioTracks(data); - this.onTextTracks(data); - this.onVideoTracks(data); - }; - - onProgress = (data: OnProgressData) => { - this.setState({currentTime: data.currentTime}); - }; - - onSeek = (data: OnSeekData) => { - this.setState({isSeeking: false}); - this.setState({currentTime: data.currentTime}); - }; - - onVideoLoadStart = () => { - console.log('onVideoLoadStart'); - this.setState({isLoading: true}); - }; - - onAudioTracks = (data: OnAudioTracksData) => { - const selectedTrack = data.audioTracks?.find((x: AudioTrack) => { - return x.selected; - }); - if (selectedTrack?.index) { - this.setState({ - audioTracks: data.audioTracks, - selectedAudioTrack: { - type: SelectedVideoTrackType.INDEX, - value: selectedTrack?.index, - }, - }); - } else { - this.setState({ - audioTracks: data.audioTracks, - }); - } - }; - - onVideoTracks = (data: OnVideoTracksData) => { - console.log('onVideoTracks', data.videoTracks); - this.setState({ - videoTracks: data.videoTracks, - }); - }; - - onTextTracks = (data: OnTextTracksData) => { - const selectedTrack = data.textTracks?.find((x: TextTrack) => { - return x?.selected; - }); - - if (selectedTrack?.language) { - this.setState({ - textTracks: data.textTracks, - selectedTextTrack: - this.textTracksSelectionBy === 'index' - ? { - type: 'index', - value: selectedTrack?.index, - } - : { - type: 'language', - value: selectedTrack?.language, - }, - }); - } else { - this.setState({ - textTracks: data.textTracks, - }); - } - }; - - onTextTrackDataChanged = (data: OnTextTrackDataChangedData) => { - console.log(`Subtitles: ${JSON.stringify(data, null, 2)}`); - }; - - onAspectRatio = (data: OnVideoAspectRatioData) => { - console.log('onAspectRadio called ' + JSON.stringify(data)); - this.setState({ - videoWidth: data.width, - videoHeight: data.height, - }); - }; - - onVideoBuffer = (param: OnBufferData) => { - console.log('onVideoBuffer'); - this.setState({isLoading: param.isBuffering}); - }; - - onReadyForDisplay = () => { - console.log('onReadyForDisplay'); - this.setState({isLoading: false}); - }; - - onAudioBecomingNoisy = () => { - this.setState({paused: true}); - }; - - onAudioFocusChanged = (event: OnAudioFocusChangedData) => { - this.setState({paused: !event.hasAudioFocus}); - }; - - toast = (visible: boolean, message: string) => { - if (visible) { - if (Platform.OS === 'android') { - ToastAndroid.showWithGravityAndOffset( - message, - ToastAndroid.LONG, - ToastAndroid.BOTTOM, - 25, - 50, - ); - } else { - Alert.alert(message, message); - } - } - }; - - onError = (err: OnVideoErrorData) => { - console.log(JSON.stringify(err)); - this.toast(true, 'error: ' + JSON.stringify(err)); - }; - - onEnd = () => { - if (!this.state.loop) { - this.channelUp(); - } - }; - - onPlaybackRateChange = (data: OnPlaybackRateChangeData) => { - console.log('onPlaybackRateChange', data); - }; - - onPlaybackStateChanged = (data: OnPlaybackStateChangedData) => { - console.log('onPlaybackStateChanged', data); - }; - - toggleFullscreen() { - this.setState({fullscreen: !this.state.fullscreen}); - } - toggleControls() { - this.setState({showRNVControls: !this.state.showRNVControls}); - } - - toggleDecoration() { - this.setState({decoration: !this.state.decoration}); - this.video?.setFullScreen(!this.state.decoration); - } - - toggleShowNotificationControls() { - this.setState({ - showNotificationControls: !this.state.showNotificationControls, - }); - } - - goToChannel(channel: number) { - this.setState({ - srcListId: channel, - duration: 0.0, - currentTime: 0.0, - videoWidth: 0, - videoHeight: 0, - isLoading: false, - audioTracks: [], - textTracks: [], - selectedAudioTrack: undefined, - selectedTextTrack: undefined, - selectedVideoTrack: { - type: SelectedVideoTrackType.AUTO, - }, - }); - } - - channelUp() { - console.log('channel up'); - this.goToChannel((this.state.srcListId + 1) % this.srcList.length); - } - - channelDown() { - console.log('channel down'); - this.goToChannel( - (this.state.srcListId + this.srcList.length - 1) % this.srcList.length, - ); - } - - videoSeek(position: number) { - this.setState({isSeeking: true}); - this.video?.seek(position); - } - - renderSeekBar() { - return ( - this.videoSeek(prop)} - isUISeeking={this.state.isSeeking} - /> - ); - } - - IndicatorLoadingView() { - if (this.state.isLoading) { - return ( - - ); - } else { - return ; - } - } - - renderTopControl() { - return ( - - - {(this.srcList[this.state.srcListId] as AdditionnalSourceInfo) - ?.description || 'local file'} - - - { - this.toggleControls(); - }}> - - {this.state.showRNVControls ? 'Hide controls' : 'Show controls'} - - - - - ); - } - - onRateSelected = (value: MultiValueControlPropType) => { - this.setState({rate: value}); - }; - onVolumeSelected = (value: MultiValueControlPropType) => { - this.setState({volume: value}); - }; - onResizeModeSelected = (value: MultiValueControlPropType) => { - this.setState({resizeMode: value}); - }; - - onSelectedAudioTrackChange = (itemValue: string) => { - console.log('on audio value change ' + itemValue); - if (itemValue === 'none') { - this.setState({ - selectedAudioTrack: SelectedVideoTrackType.DISABLED, - }); - } else { - this.setState({ - selectedAudioTrack: { - type: SelectedVideoTrackType.INDEX, - value: itemValue, - }, - }); - } - }; - - onSelectedTextTrackChange = (itemValue: string) => { - console.log('on value change ' + itemValue); - this.setState({ - selectedTextTrack: { - type: this.textTracksSelectionBy === 'index' ? 'index' : 'language', - value: itemValue, - }, - }); - }; - - onSelectedVideoTrackChange = (itemValue: string) => { - console.log('on value change ' + itemValue); - if (itemValue === undefined || itemValue === 'auto') { - this.setState({ - selectedVideoTrack: { - type: SelectedVideoTrackType.AUTO, - }, - }); - } else { - this.setState({ - selectedVideoTrack: { - type: SelectedVideoTrackType.INDEX, - value: itemValue, - }, - }); - } - }; - - renderOverlay() { - return ( - <> - {this.IndicatorLoadingView()} - - - {this.renderTopControl()} - - - {!this.state.showRNVControls ? ( - <> - - { - this.channelDown(); - }} - text="ChDown" - /> - - - { - this.channelUp(); - }} - text="ChUp" - /> - - - - {Platform.OS === 'android' ? ( - - { - this.popupInfo(); - }} - text="decoderInfo" - /> - { - this.setState({useCache: !this.state.useCache}); - }} - selectedText="enable cache" - unselectedText="disable cache" - /> - - ) : null} - { - this.setState({paused: !this.state.paused}); - }} - selectedText="pause" - unselectedText="playing" - /> - { - this.setState({loop: !this.state.loop}); - }} - selectedText="loop enable" - unselectedText="loop disable" - /> - { - this.toggleFullscreen(); - }} - text="fullscreen" - /> - { - this.toggleDecoration(); - }} - text="decoration" - /> - { - this.setState({ - poster: this.state.poster ? undefined : this.samplePoster, - }); - }} - selectedText="poster" - unselectedText="no poster" - /> - { - this.toggleShowNotificationControls(); - }} - selectedText="hide notification controls" - unselectedText="show notification controls" - /> - - - {/* shall be replaced by slider */} - - {/* shall be replaced by slider */} - - - { - this.setState({muted: !this.state.muted}); - }} - text="muted" - /> - {Platform.OS === 'ios' ? ( - { - this.video - ?.save({}) - ?.then(response => { - console.log('Downloaded URI', response); - }) - .catch(error => { - console.log('error during save ', error); - }); - }} - text="save" - /> - ) : null} - - {this.renderSeekBar()} - - - - - - - - ) : null} - - ); - } - - renderVideoView() { - const viewStyle = this.state.fullscreen - ? styles.fullScreen - : styles.halfScreen; - - const currentSrc = this.srcList[this.state.srcListId]; - const additionnal = currentSrc as AdditionnalSourceInfo; - - return ( - - - ); - } - - render() { - return ( - - {(this.srcList[this.state.srcListId] as AdditionnalSourceInfo)?.noView - ? null - : this.renderVideoView()} - {this.renderOverlay()} - - ); - } -} -export default VideoPlayer; diff --git a/examples/FabricExample/tsconfig.json b/examples/FabricExample/tsconfig.json deleted file mode 100644 index a47cb9d4..00000000 --- a/examples/FabricExample/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -// prettier-ignore -{ - "extends": "@react-native/typescript-config/tsconfig.json", - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - "paths": { - "react-native-video": ["../../src/index.ts"], - "react": [ "./node_modules/@types/react" ] - }, - /* Completeness */ - "skipLibCheck": true, /* Skip type checking all .d.ts files. */ - } -} diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..2aed8e90 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,172 @@ +# Examples +This directory contains examples for `react-native-video` - this is a guide that will show you what can you find here and how to use them. + +## Examples Structure + +- **[`bare`](#bare)** - Main example ([react-native-test-app](https://github.com/microsoft/react-native-test-app) - bare react-native app) that you can run on: iOS, Android, Windows, visionOS + +- **[`expo`](#expo)** - Expo example that you can run on: iOS, Android, tvOS, web (support coming soon) + +### Updating Examples Content + +Both of applications have mostly the same code (Windows and tvOS have platform-specific code). Other platform are using codebase from `bare` example. +If you want to update examples content, you should do it in `bare` example. `expo` example is copping (and overwriting!) `src` folder from `bare` on dependency install. +If you want to sync `expo` example, you can use `yarn update-src` command in `expo` example directory. + +## How To Run Examples + +## [Bare](https://github.com/TheWidlarzGroup/react-native-video/tree/master/examples/bare) + +### Configuration + +You can configure the example by changing the settings of expo-plugin `app.json` file in the `bare` directory. + +> [!TIP] +> You can find more information about the expo-plugin configuration [here](https://thewidlarzgroup.github.io/react-native-video/other/expo). + +> [!CAUTION] +> You will need to regenerate the native project after changing the `app.json` file. eg. on Apple platforms you will need to install pods twice. (one for applying expo-plugin changes and second for applying react-native-video changes) + +### Building +1. Install dependency in repository root directory +```bash +yarn install +``` + +2. Install dependency in `bare` example directory +```bash +cd examples/bare && yarn install +``` + +3. Now you will need to generate native project for platform you want to run the example on. + - For iOS / visionOS: + Install pods in `ios` / `visionOS` directory + ```bash + # for ios + pod install --project-directory=ios + # for visionOS + pod install --project-directory=visionos + ``` +> [!IMPORTANT] +> You will need to hit it twice, because expo-plugin changes are not applied in the first run. +> [!TIP] +> Make sure you've already downloaded the visionOS simulator on which you want to launch the app. + + Now you are ready to run the App. (Flag `--interactive` is optional, but it is recommended as it allows you to choose the device you want to run the app on. Select `BareExample` scheme) + ```bash + # for ios + yarn ios --interactive + # for visionOS + yarn visionos --interactive + ``` + + - For Android: + There is no need to run any additional command. you can just run the App. (Flag `--interactive` is optional, but it is recommended as it allows you to choose the device you want to run the app on) + ```bash + yarn android --interactive + ``` + + - For Windows: + There is no need to run any additional command. you can just run the App. + ```bash + yarn windows + ``` + +If Metro Bundler is not running (or it did not start), you can start it by running: +```bash +yarn start +``` + +## [Expo](https://github.com/TheWidlarzGroup/react-native-video/tree/master/examples/bare) + +### Configuration + +#### Expo Plugin +You can configure the example by changing the settings of expo-plugin `app.json` file in the `expo` directory. + +> [!TIP] +> You can find more information about the expo-plugin configuration [here](https://thewidlarzgroup.github.io/react-native-video/other/expo). + +> [!CAUTION] +> You will need to regenerate the native project after changing the `app.json` file - you can do it by running `yarn prebuild` command in `expo` example directory. + +#### Switching between Mobile and TV +If you want to switch between mobile and TV version of the app you will need to regenerate the native project. You can do it by running `yarn prebuild:tv` command in `expo` example directory. + + +### Building +1. Install dependency in repository root directory +```bash +yarn install +``` + +2. Install dependency in `expo` example directory +```bash +cd examples/expo && yarn install +``` + +3. Now you will need to generate native project for platform you want to run the example on. + If you want to use example on tv you should read [Switching between Mobile and TV](#switching-between-mobile-and-tv) section. + + - For iOS / tvOS: + Install pods in `ios` directory + ```bash + pod install --project-directory=ios + ``` + + Now you are ready to run the App. (Flag `--device` is optional, but it is recommended as it allows you to choose the device you want to run the app on) + ```bash + # for ios + yarn ios --device + # for tvOS + yarn ios:tv --device + ``` + + - For Android / Android TV: + There is no need to run any additional command. you can just run the App. (Flag `--device` is optional, but it is recommended as it allows you to choose the device you want to run the app on) + ```bash + # for android + yarn android --device + # for android tv + yarn android:tv --device + ``` + +> [!WARNING] +> Setup for android is not complete yet. Please use bare app for android testing. + + - For Web: + Support for web is coming soon. + +If Metro Bundler is not running (or it did not start), you can start it by running: +```bash +yarn start +``` + +## For Maintainers + +### Opening React Native Video in Android Studio / Xcode +To open `react-native-video` in Android Studio / Xcode you need to open `examples/bare/android` or `examples/bare/ios` directory. +First, you need to follow the [How To Run Examples](#how-to-run-examples) guide to generate the native project. Then you can open the project in Android Studio / Xcode by running below command in `examples/bare` directory. +```bash +# for android +studio ./android +# for ios +xed ./ios +``` + +### Updating Examples + +#### Bare +Because `bare` example is using react-native-test-app it is very easy to update it. + +1. Change version of `react-native` in `package.json` file in `bare` directory. +2. Hit below command and verify if everything is working correctly - RN_VERSION should be the version you want to update to. +```bash +npx @rnx-kit/align-deps@latest --requirements react-native@RN_VERSION --write +``` + +That's it! Now you can commit changes and create a PR. + +#### Expo +To update `expo` example you should follow this [guide](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough). +After updating `expo` example you will need to use prebuild (yarn expo prebuild) - if it fails you will need to add `--clean` flag to the command - this will remove manual link of `react-native-video` package so you will need to link it again. \ No newline at end of file diff --git a/examples/bare/.gitignore b/examples/bare/.gitignore new file mode 100644 index 00000000..65aa665c --- /dev/null +++ b/examples/bare/.gitignore @@ -0,0 +1,16 @@ +*.binlog +*.hprof +*.xcworkspace/ +*.zip +.DS_Store +.gradle/ +.idea/ +.vs/ +.xcode.env +Pods/ +build/ +dist/* +!dist/.gitignore +local.properties +msbuild.binlog +node_modules/ diff --git a/examples/bare/.watchmanconfig b/examples/bare/.watchmanconfig new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/examples/bare/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/examples/bare/android/build.gradle b/examples/bare/android/build.gradle new file mode 100644 index 00000000..d38012b1 --- /dev/null +++ b/examples/bare/android/build.gradle @@ -0,0 +1,48 @@ +buildscript { + apply(from: { + def searchDir = rootDir.toPath() + do { + def p = searchDir.resolve("node_modules/react-native-test-app/android/dependencies.gradle") + if (p.toFile().exists()) { + return p.toRealPath().toString() + } + } while (searchDir = searchDir.getParent()) + throw new GradleException("Could not find `react-native-test-app`"); + }()) + + repositories { + mavenCentral() + google() + } + + dependencies { + getReactNativeDependencies().each { dependency -> + classpath(dependency) + } + } +} + +ext { + // For CI builds + useExoplayerIMA = System.getenv("RNV_SAMPLE_ENABLE_ADS") ?: false +} + +allprojects { + repositories { + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url({ + def searchDir = rootDir.toPath() + do { + def p = searchDir.resolve("node_modules/react-native/android") + if (p.toFile().exists()) { + return p.toRealPath().toString() + } + } while (searchDir = searchDir.getParent()) + throw new GradleException("Could not find `react-native`"); + }()) + } + mavenCentral() + google() + } +} diff --git a/examples/basic/android/gradle.properties b/examples/bare/android/gradle.properties similarity index 50% rename from examples/basic/android/gradle.properties rename to examples/bare/android/gradle.properties index 0e9b37d4..a713e83e 100644 --- a/examples/basic/android/gradle.properties +++ b/examples/bare/android/gradle.properties @@ -7,15 +7,18 @@ # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m +# Specifies the JVM arguments used for the Gradle Daemon. The setting is +# particularly useful for configuring JVM memory settings for build performance. +# This does not affect the JVM settings for the Gradle client VM. +# The default is `-Xmx512m -XX:MaxMetaspaceSize=256m`. +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +# When configured, Gradle will fork up to org.gradle.workers.max JVMs to execute +# projects in parallel. To learn more about parallel task execution, see the +# section on Gradle build performance: +# https://docs.gradle.org/current/userguide/performance.html#parallel_execution. +# Default is `false`. +#org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK @@ -23,6 +26,8 @@ org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true +# Jetifier randomly fails on these libraries +android.jetifier.ignorelist=hermes-android,react-android # Use this property to specify which architecture you want to build. # You can also override it from the CLI using @@ -34,8 +39,15 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 # your application. You should enable this flag either if you want # to write custom TurboModules/Fabric components OR use libraries that # are providing them. -newArchEnabled=false +# Note that this is incompatible with web debugging. +#newArchEnabled=true +#bridgelessEnabled=true -# Use this property to enable or disable the Hermes JS engine. -# If set to false, you will be using JSC instead. -hermesEnabled=true +# Uncomment the line below to build React Native from source. +#react.buildFromSource=true + +# Version of Android NDK to build against. +#ANDROID_NDK_VERSION=26.1.10909125 + +# Version of Kotlin to build against. +#KOTLIN_VERSION=1.8.22 diff --git a/examples/bare/android/gradle/wrapper/gradle-wrapper.jar b/examples/bare/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 BasicExample); +AppRegistry.registerComponent('DRMExample', () => DRMExample); diff --git a/examples/bare/ios/Podfile b/examples/bare/ios/Podfile new file mode 100644 index 00000000..7e80fc0b --- /dev/null +++ b/examples/bare/ios/Podfile @@ -0,0 +1,23 @@ +ws_dir = Pathname.new(__dir__) +ws_dir = ws_dir.parent until + File.exist?("#{ws_dir}/node_modules/react-native-test-app/test_app.rb") || + ws_dir.expand_path.to_s == '/' +require "#{ws_dir}/node_modules/react-native-test-app/test_app.rb" + +workspace 'BareExample.xcworkspace' + +use_test_app! + +# This is used by CI to test different configurations +# If you want to enable it look to README.md +if ENV['RNV_SAMPLE_ENABLE_ADS'] + $RNVideoUseGoogleIMA = true +end +if ENV['RNV_SAMPLE_VIDEO_CACHING'] + $RNVideoUseVideoCaching = true +end + +# Chache dependencies need to have modular headers +if defined?($RNVideoUseVideoCaching) + use_modular_headers! +end \ No newline at end of file diff --git a/examples/FabricExample/ios/Podfile.lock b/examples/bare/ios/Podfile.lock similarity index 82% rename from examples/FabricExample/ios/Podfile.lock rename to examples/bare/ios/Podfile.lock index f32f0f0d..8700236a 100644 --- a/examples/FabricExample/ios/Podfile.lock +++ b/examples/bare/ios/Podfile.lock @@ -2,12 +2,15 @@ PODS: - boost (1.83.0) - DoubleConversion (1.1.6) - FBLazyVector (0.73.2) + - FBReactNativeSpec (0.73.2): + - RCT-Folly (= 2022.05.16.00) + - RCTRequired (= 0.73.2) + - RCTTypeSafety (= 0.73.2) + - React-Core (= 0.73.2) + - React-jsi (= 0.73.2) + - ReactCommon/turbomodule/core (= 0.73.2) - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.73.2): - - hermes-engine/Pre-built (= 0.73.2) - - hermes-engine/Pre-built (0.73.2) - - libevent (2.1.12) - RCT-Folly (2022.05.16.00): - boost - DoubleConversion @@ -24,12 +27,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - RCT-Folly/Futures (2022.05.16.00): - - boost - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - RCTRequired (0.73.2) - RCTTypeSafety (0.73.2): - FBLazyVector (= 0.73.2) @@ -51,30 +48,25 @@ PODS: - React-callinvoker (0.73.2) - React-Codegen (0.73.2): - DoubleConversion + - FBReactNativeSpec - glog - - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-NativeModulesApple - - React-rendererdebug - - React-utils + - React-rncore - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - React-Core (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default (= 0.73.2) - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -84,11 +76,10 @@ PODS: - Yoga - React-Core/CoreModulesHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -98,10 +89,9 @@ PODS: - Yoga - React-Core/Default (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -111,12 +101,11 @@ PODS: - Yoga - React-Core/DevSupport (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default (= 0.73.2) - React-Core/RCTWebSocket (= 0.73.2) - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector (= 0.73.2) @@ -127,11 +116,10 @@ PODS: - Yoga - React-Core/RCTActionSheetHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -141,11 +129,10 @@ PODS: - Yoga - React-Core/RCTAnimationHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -155,11 +142,10 @@ PODS: - Yoga - React-Core/RCTBlobHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -169,11 +155,10 @@ PODS: - Yoga - React-Core/RCTImageHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -183,11 +168,10 @@ PODS: - Yoga - React-Core/RCTLinkingHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -197,11 +181,10 @@ PODS: - Yoga - React-Core/RCTNetworkHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -211,11 +194,10 @@ PODS: - Yoga - React-Core/RCTSettingsHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -225,11 +207,10 @@ PODS: - Yoga - React-Core/RCTTextHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -239,11 +220,10 @@ PODS: - Yoga - React-Core/RCTVibrationHeaders (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -253,11 +233,10 @@ PODS: - Yoga - React-Core/RCTWebSocket (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Core/Default (= 0.73.2) - React-cxxreact - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-perflogger @@ -281,7 +260,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-callinvoker (= 0.73.2) - React-debug (= 0.73.2) @@ -295,7 +273,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -317,6 +294,7 @@ PODS: - React-Fabric/textlayoutmanager (= 0.73.2) - React-Fabric/uimanager (= 0.73.2) - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -328,7 +306,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -336,6 +313,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -347,7 +325,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -355,6 +332,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -366,7 +344,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -374,6 +351,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -385,7 +363,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -393,6 +370,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -404,7 +382,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -423,6 +400,7 @@ PODS: - React-Fabric/components/unimplementedview (= 0.73.2) - React-Fabric/components/view (= 0.73.2) - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -434,7 +412,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -442,6 +419,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -453,7 +431,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -461,6 +438,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -472,7 +450,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -480,6 +457,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -491,7 +469,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -499,6 +476,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -510,7 +488,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -518,6 +495,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -529,7 +507,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -537,6 +514,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -548,7 +526,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -556,6 +533,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -567,7 +545,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -575,6 +552,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -586,7 +564,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -594,6 +571,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -605,7 +583,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -613,6 +590,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -624,7 +602,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -632,6 +609,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -644,7 +622,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -652,6 +629,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -663,7 +641,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -671,6 +648,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -682,7 +660,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -690,6 +667,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -701,7 +679,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -709,6 +686,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -720,7 +698,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -728,6 +705,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -739,7 +717,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -747,6 +724,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -758,7 +736,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -766,6 +743,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -777,7 +755,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -786,6 +763,7 @@ PODS: - React-debug - React-Fabric/uimanager - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -797,7 +775,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired - RCTTypeSafety @@ -805,6 +782,7 @@ PODS: - React-cxxreact - React-debug - React-graphics + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -816,13 +794,13 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - RCTRequired (= 0.73.2) - RCTTypeSafety (= 0.73.2) - React-Fabric - React-graphics - React-ImageManager + - React-jsc - React-jsi - React-jsiexecutor (= 0.73.2) - React-logger @@ -835,18 +813,6 @@ PODS: - RCT-Folly/Fabric (= 2022.05.16.00) - React-Core/Default (= 0.73.2) - React-utils - - React-hermes (0.73.2): - - DoubleConversion - - fmt (~> 6.2.1) - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - RCT-Folly/Futures (= 2022.05.16.00) - - React-cxxreact (= 0.73.2) - - React-jsi - - React-jsiexecutor (= 0.73.2) - - React-jsinspector (= 0.73.2) - - React-perflogger (= 0.73.2) - React-ImageManager (0.73.2): - glog - RCT-Folly/Fabric @@ -856,6 +822,11 @@ PODS: - React-graphics - React-rendererdebug - React-utils + - React-jsc (0.73.2): + - React-jsc/Fabric (= 0.73.2) + - React-jsi (= 0.73.2) + - React-jsc/Fabric (0.73.2): + - React-jsi (= 0.73.2) - React-jserrorhandler (0.73.2): - RCT-Folly/Fabric (= 2022.05.16.00) - React-debug @@ -866,91 +837,37 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-jsiexecutor (0.73.2): - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-cxxreact (= 0.73.2) - React-jsi (= 0.73.2) - React-perflogger (= 0.73.2) - React-jsinspector (0.73.2) - - React-jsitracing (0.73.2): - - React-jsi - React-logger (0.73.2): - glog - React-Mapbuffer (0.73.2): - glog - React-debug - - react-native-video (6.3.0): + - react-native-video (6.6.4): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Codegen - React-Core - - React-debug - - React-Fabric - - React-graphics - - React-ImageManager - - react-native-video/Video (= 6.3.0) - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-video/Fabric (6.3.0): + - react-native-video/Video (= 6.6.4) + - react-native-video/Video (6.6.4): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Codegen - React-Core - - React-debug - - React-Fabric - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-video/Video (6.3.0): - - glog - - hermes-engine - - RCT-Folly (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Codegen - - React-Core - - React-debug - - React-Fabric - - React-graphics - - React-ImageManager - - react-native-video/Fabric - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - React-nativeconfig (0.73.2) - React-NativeModulesApple (0.73.2): - glog - - hermes-engine - React-callinvoker - React-Core - React-cxxreact + - React-jsc - React-jsi - React-runtimeexecutor - ReactCommon/turbomodule/bridging @@ -972,24 +889,15 @@ PODS: - RCTTypeSafety - React-Core - React-CoreModules - - React-debug - - React-Fabric - - React-graphics - - React-hermes + - React-jsc - React-nativeconfig - React-NativeModulesApple - React-RCTFabric - React-RCTImage - React-RCTNetwork - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-RuntimeHermes - React-runtimescheduler - - React-utils - ReactCommon - React-RCTBlob (0.73.2): - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-Codegen - React-Core/RCTBlobHeaders @@ -1000,7 +908,6 @@ PODS: - ReactCommon - React-RCTFabric (0.73.2): - glog - - hermes-engine - RCT-Folly/Fabric (= 2022.05.16.00) - React-Core - React-debug @@ -1008,6 +915,7 @@ PODS: - React-FabricImage - React-graphics - React-ImageManager + - React-jsc - React-jsi - React-nativeconfig - React-RCTImage @@ -1064,49 +972,15 @@ PODS: - RCT-Folly (= 2022.05.16.00) - React-debug - React-rncore (0.73.2) - - React-RuntimeApple (0.73.2): - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-callinvoker - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-utils - - React-RuntimeCore (0.73.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-cxxreact - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-runtimeexecutor - - React-runtimescheduler - React-runtimeexecutor (0.73.2): - React-jsi (= 0.73.2) - - React-RuntimeHermes (0.73.2): - - hermes-engine - - RCT-Folly/Fabric (= 2022.05.16.00) - - React-jsi - - React-jsitracing - - React-nativeconfig - - React-utils - React-runtimescheduler (0.73.2): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-callinvoker - React-cxxreact - React-debug + - React-jsc - React-jsi - React-rendererdebug - React-runtimeexecutor @@ -1122,7 +996,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-callinvoker (= 0.73.2) - React-cxxreact (= 0.73.2) @@ -1135,7 +1008,6 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-callinvoker (= 0.73.2) - React-cxxreact (= 0.73.2) @@ -1146,32 +1018,24 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - React-callinvoker (= 0.73.2) - React-cxxreact (= 0.73.2) - React-jsi (= 0.73.2) - React-logger (= 0.73.2) - React-perflogger (= 0.73.2) - - RNCPicker (2.7.5): + - ReactNativeHost (0.5.0): - glog - - hermes-engine - RCT-Folly (= 2022.05.16.00) - - RCTRequired - - RCTTypeSafety - - React-Codegen - React-Core - - React-debug - - React-Fabric - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging + - React-cxxreact - ReactCommon/turbomodule/core - - Yoga + - ReactTestApp-DevSupport (3.10.14): + - React-Core + - React-jsi + - ReactTestApp-Resources (1.0.0-dev) + - RNCPicker (2.7.5): + - React-Core - SocketRocket (0.6.1) - Yoga (1.14.0) @@ -1179,9 +1043,8 @@ DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - libevent (~> 2.1.12) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -1197,16 +1060,15 @@ DEPENDENCIES: - React-Fabric (from `../node_modules/react-native/ReactCommon`) - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jsc (from `../node_modules/react-native/ReactCommon/jsc`) - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - - react-native-video (from `../../..`) + - react-native-video (from `../node_modules/react-native-video`) - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) @@ -1223,20 +1085,19 @@ DEPENDENCIES: - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - React-rncore (from `../node_modules/react-native/ReactCommon`) - - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "ReactNativeHost (from `../node_modules/@rnx-kit/react-native-host`)" + - ReactTestApp-DevSupport (from `../node_modules/react-native-test-app`) + - ReactTestApp-Resources (from `..`) - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - fmt - - libevent - SocketRocket EXTERNAL SOURCES: @@ -1246,11 +1107,10 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2023-11-17-RNv0.73.0-21043a3fc062be445e56a2c10ecd8be028dd9cc5 RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -1277,10 +1137,10 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-graphics: :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" React-ImageManager: :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jsc: + :path: "../node_modules/react-native/ReactCommon/jsc" React-jserrorhandler: :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: @@ -1289,14 +1149,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" - React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: :path: "../node_modules/react-native/ReactCommon" react-native-video: - :path: "../../.." + :path: "../node_modules/react-native-video" React-nativeconfig: :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: @@ -1329,20 +1187,20 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: :path: "../node_modules/react-native/ReactCommon" - React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" - React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeHost: + :path: "../node_modules/@rnx-kit/react-native-host" + ReactTestApp-DevSupport: + :path: "../node_modules/react-native-test-app" + ReactTestApp-Resources: + :path: ".." RNCPicker: :path: "../node_modules/@react-native-picker/picker" Yoga: @@ -1352,41 +1210,39 @@ SPEC CHECKSUMS: boost: d3f49c53809116a5d38da093a8aa78bf551aed09 DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 FBLazyVector: fbc4957d9aa695250b55d879c1d86f79d7e69ab4 + FBReactNativeSpec: 86de768f89901ef6ed3207cd686362189d64ac88 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 - hermes-engine: b361c9ef5ef3cda53f66e195599b47e1f84ffa35 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0 RCTRequired: 9b1e7e262745fb671e33c51c1078d093bd30e322 RCTTypeSafety: a759e3b086eccf3e2cbf2493d22f28e082f958e6 React: 805f5dd55bbdb92c36b4914c64aaae4c97d358dc React-callinvoker: 6a697867607c990c2c2c085296ee32cfb5e47c01 - React-Codegen: f3cb992539e5c21675f087e536d64b1f2a448655 - React-Core: 49f66fecc7695464e9b7bc7dc7cd9473d2c60584 + React-Codegen: 39377d8c90c3fc0792753c9af53b788abfe5850b + React-Core: 943d6097aaf381b1e7c7e105eecd5a27b51c4e17 React-CoreModules: 710e7c557a1a8180bd1645f5b4bf79f4bd3f5417 - React-cxxreact: 345857b5e4be000c0527df78be3b41a0677a20ce + React-cxxreact: 0f0b3933c36dfe4ed10638a33398533f90ab78d3 React-debug: f1637bce73342b2f6eee4982508fdfb088667a87 - React-Fabric: 4dfcff8f14d8e5a7a60b11b7862dad2a9d99c65b - React-FabricImage: 4a9e9510b7f28bbde6a743b18c0cb941a142e938 + React-Fabric: ba7d74992ed878fdbf91f8b49eb725b310786980 + React-FabricImage: e7457fb89db50cb1b51d0546b5ff002b91026efe React-graphics: dd5af9d8b1b45171fd6933e19fed522f373bcb10 - React-hermes: a52d183a5cf8ccb7020ce3df4275b89d01e6b53e React-ImageManager: c5b7db131eff71443d7f3a8d686fd841d18befd3 + React-jsc: 94234736a90ea29f017f2ee76e5f358a6ba076a9 React-jserrorhandler: 97a6a12e2344c3c4fdd7ba1edefb005215c732f8 - React-jsi: a182068133f80918cd0eec77875abaf943a0b6be - React-jsiexecutor: dacd00ce8a18fc00a0ae6c25e3015a6437e5d2e8 + React-jsi: 0cd661b6ea862c104706311f8265050ee3ecf5e4 + React-jsiexecutor: 94f6026bc4054b413f0ac5e210691c2916d99d1b React-jsinspector: 03644c063fc3621c9a4e8bf263a8150909129618 - React-jsitracing: 7c77101b38fcc8fa7f198de7e1d834350a85af90 React-logger: 66b168e2b2bee57bd8ce9e69f739d805732a5570 React-Mapbuffer: 9ee041e1d7be96da6d76a251f92e72b711c651d6 - react-native-video: 033a57e0fffd1a8fa5cbe8ae3a01b71029032f62 + react-native-video: 60dcbdb52c8291b0a01256d00ac25fde0c18e602 React-nativeconfig: d753fbbc8cecc8ae413d615599ac378bbf6999bb - React-NativeModulesApple: 964f4eeab1b4325e8b6a799cf4444c3fd4eb0a9c + React-NativeModulesApple: 22c25a1baa4b0d0d4845dad2578fc017b0805589 React-perflogger: 29efe63b7ef5fbaaa50ef6eaa92482f98a24b97e React-RCTActionSheet: 69134c62aefd362027b20da01cd5d14ffd39db3f React-RCTAnimation: 3b5a57087c7a5e727855b803d643ac1d445488f5 - React-RCTAppDelegate: cb1a9a8447ddad006f934988016390f4df472e74 - React-RCTBlob: 26ea660f2be1e6de62f2d2ad9a9c7b9bfabb786f - React-RCTFabric: bb6dbbff2f80b9489f8b2f1d2554aa040aa2e3cd + React-RCTAppDelegate: 842870b97f47de7255908ba1ca8786aef877b0b8 + React-RCTBlob: 1fa011b5860c9a70802fab986ad334b458387b7a + React-RCTFabric: c8f86a85501d70c8a77d71f22273e325ffb63fa0 React-RCTImage: 27b27f4663df9e776d0549ed2f3536213e793f1b React-RCTLinking: 962880ce9d0e2ea83fd182953538fc4ed757d4da React-RCTNetwork: 73a756b44d4ad584bae13a5f1484e3ce12accac8 @@ -1394,18 +1250,18 @@ SPEC CHECKSUMS: React-RCTText: 73006e95ca359595c2510c1c0114027c85a6ddd3 React-RCTVibration: 599f427f9cbdd9c4bf38959ca020e8fef0717211 React-rendererdebug: f2946e0a1c3b906e71555a7c4a39aa6a6c0e639b - React-rncore: 6e3139cf51cea08068f008da426821d1deaa24b9 - React-RuntimeApple: 08c29690996ed935e35054965bcfb70ebea67318 - React-RuntimeCore: 5b73f40b46d78a825cf71714e1e5044d389702d6 + React-rncore: 74030de0ffef7b1a3fb77941168624534cc9ae7f React-runtimeexecutor: 2d1f64f58193f00a3ad71d3f89c2bfbfe11cf5a5 - React-RuntimeHermes: 01dcb5a4e9073496f6f981a8648843771e3f6516 - React-runtimescheduler: df8945a656356ff10f58f65a70820478bfcf33ad + React-runtimescheduler: 6517c0cdfae3ea29b599759e069ae97746163248 React-utils: f5bc61e7ea3325c0732ae2d755f4441940163b85 - ReactCommon: 45b5d4f784e869c44a6f5a8fad5b114ca8f78c53 - RNCPicker: 6ce7e81292cec4ddf1a5eeaeec00c31206e9e134 + ReactCommon: a42e89b49d88c3890dfb6fd98a33ac80d555be19 + ReactNativeHost: 1e71e0d4c176f03f4b9073a35197d576ec40cce3 + ReactTestApp-DevSupport: ed439cce949caf074af3ae05051b4bd157ed4019 + ReactTestApp-Resources: 857244f3a23f2b3157b364fa06cf3e8866deff9c + RNCPicker: 3e2c37a8328f368ce14da050cdc8231deb5fc9f9 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Yoga: e64aa65de36c0832d04e8c7bd614396c77a80047 -PODFILE CHECKSUM: cf04724bfafa2ca6f6877a9a65072610a4b6ed7c +PODFILE CHECKSUM: 4f0c2a9ecae3454d8a3aae9fd7fdd7724fa2138a COCOAPODS: 1.15.2 diff --git a/examples/bare/metro.config.js b/examples/bare/metro.config.js new file mode 100644 index 00000000..21afe1ba --- /dev/null +++ b/examples/bare/metro.config.js @@ -0,0 +1,20 @@ +const path = require('path'); +const {makeMetroConfig} = require('@rnx-kit/metro-config'); + +module.exports = makeMetroConfig({ + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, + resolver: { + enableSymlinks: true, + }, + watchFolders: [ + path.join(__dirname, 'node_modules', 'react-native-video'), + path.resolve(__dirname, '../..'), + ], +}); diff --git a/examples/bare/package.json b/examples/bare/package.json new file mode 100644 index 00000000..1be5b1e7 --- /dev/null +++ b/examples/bare/package.json @@ -0,0 +1,52 @@ +{ + "name": "BareExample", + "version": "0.0.1", + "private": true, + "scripts": { + "postinstall": "patch-package", + "android": "react-native run-android", + "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res", + "build:ios": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", + "build:visionos": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.visionos.jsbundle --assets-dest dist", + "build:windows": "npm run mkdist && react-native bundle --entry-file index.js --platform windows --dev true --bundle-output dist/main.windows.bundle --assets-dest dist", + "ios": "react-native run-ios", + "lint": "eslint .", + "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", + "start": "react-native start", + "test": "jest", + "visionos": "react-native run-visionos", + "windows": "react-native run-windows --sln windows/BareExample.sln" + }, + "dependencies": { + "@callstack/react-native-visionos": "^0.73.0", + "@react-native-picker/picker": "2.8.1", + "react": "18.2.0", + "react-native": "0.73.2", + "react-native-video": "link:../..", + "react-native-windows": "^0.73.0" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "@expo/config-plugins": "^8.0.10", + "@react-native/babel-preset": "0.73.19", + "@react-native/eslint-config": "0.73.2", + "@react-native/metro-config": "0.73.3", + "@react-native/typescript-config": "0.73.1", + "@rnx-kit/metro-config": "^2.0.0", + "@types/react": "^18.2.6", + "@types/react-test-renderer": "^18.0.0", + "babel-jest": "^29.6.3", + "eslint": "^8.19.0", + "jest": "^29.6.3", + "patch-package": "^8.0.0", + "prettier": "2.8.8", + "react-native-test-app": "^3.10.14", + "react-test-renderer": "18.2.0", + "typescript": "5.0.4" + }, + "engines": { + "node": ">=18" + } +} diff --git a/examples/bare/patches/@react-native-picker+picker+2.8.1.patch b/examples/bare/patches/@react-native-picker+picker+2.8.1.patch new file mode 100644 index 00000000..ad657e06 --- /dev/null +++ b/examples/bare/patches/@react-native-picker+picker+2.8.1.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/@react-native-picker/picker/RNCPicker.podspec b/node_modules/@react-native-picker/picker/RNCPicker.podspec +index bfdf16c..bdc9c7c 100644 +--- a/node_modules/@react-native-picker/picker/RNCPicker.podspec ++++ b/node_modules/@react-native-picker/picker/RNCPicker.podspec +@@ -12,7 +12,7 @@ Pod::Spec.new do |s| + + s.authors = package['author'] + s.homepage = package['homepage'] +- s.platforms = { :ios => "9.0", :osx => "10.14" } ++ s.platforms = { :ios => "9.0", :osx => "10.14", :visionos => "1.0" } + + s.source = { :git => "https://github.com/react-native-picker/picker.git", :tag => "v#{s.version}" } + +@@ -25,6 +25,7 @@ Pod::Spec.new do |s| + else + s.ios.source_files = "ios/**/*.{h,m,mm}" + s.osx.source_files = "macos/**/*.{h,m,mm}" ++ s.visionos.source_files = "ios/**/*.{h,m,mm}" + end + + s.dependency 'React-Core' diff --git a/examples/bare/react-native.config.js b/examples/bare/react-native.config.js new file mode 100644 index 00000000..9a219f6c --- /dev/null +++ b/examples/bare/react-native.config.js @@ -0,0 +1,23 @@ +const project = (() => { + try { + const { configureProjects } = require("react-native-test-app"); + return configureProjects({ + android: { + sourceDir: "android", + }, + ios: { + sourceDir: "ios", + }, + windows: { + sourceDir: "windows", + solutionFile: "windows/BareExample.sln", + }, + }); + } catch (_) { + return undefined; + } +})(); + +module.exports = { + ...(project ? { project } : undefined), +}; diff --git a/examples/bare/src/BasicExample.tsx b/examples/bare/src/BasicExample.tsx new file mode 100644 index 00000000..98e189de --- /dev/null +++ b/examples/bare/src/BasicExample.tsx @@ -0,0 +1,345 @@ +import React, {type FC, useCallback, useRef, useState, useEffect} from 'react'; + +import {Platform, TouchableOpacity, View, StatusBar} from 'react-native'; + +import Video, { + VideoRef, + SelectedVideoTrackType, + BufferingStrategyType, + SelectedTrackType, + ResizeMode, + type AudioTrack, + type OnAudioTracksData, + type OnLoadData, + type OnProgressData, + type OnTextTracksData, + type OnVideoAspectRatioData, + type TextTrack, + type OnBufferData, + type OnAudioFocusChangedData, + type OnVideoErrorData, + type OnTextTrackDataChangedData, + type OnSeekData, + type OnPlaybackStateChangedData, + type OnPlaybackRateChangeData, + type OnVideoTracksData, + type ReactVideoSource, + type VideoTrack, + type SelectedTrack, + type SelectedVideoTrack, + type EnumValues, + OnBandwidthUpdateData, + ControlsStyles, +} from 'react-native-video'; +import styles from './styles'; +import {type AdditionalSourceInfo} from './types'; +import { + bufferConfig, + isAndroid, + srcList, + textTracksSelectionBy, + audioTracksSelectionBy, +} from './constants'; +import {Overlay, toast, VideoLoader} from './components'; + +const BasicExample = () => { + const [rate, setRate] = useState(1); + const [volume, setVolume] = useState(1); + const [muted, setMuted] = useState(false); + const [resizeMode, setResizeMode] = useState>( + ResizeMode.CONTAIN, + ); + const [duration, setDuration] = useState(0); + const [currentTime, setCurrentTime] = useState(0); + const [_, setVideoSize] = useState({videoWidth: 0, videoHeight: 0}); + const [paused, setPaused] = useState(false); + const [fullscreen, setFullscreen] = useState(true); + const [isLoading, setIsLoading] = useState(false); + const [audioTracks, setAudioTracks] = useState([]); + const [textTracks, setTextTracks] = useState([]); + const [videoTracks, setVideoTracks] = useState([]); + const [selectedAudioTrack, setSelectedAudioTrack] = useState< + SelectedTrack | undefined + >(undefined); + const [selectedTextTrack, setSelectedTextTrack] = useState< + SelectedTrack | undefined + >(undefined); + const [selectedVideoTrack, setSelectedVideoTrack] = + useState({ + type: SelectedVideoTrackType.AUTO, + }); + const [srcListId, setSrcListId] = useState(0); + const [repeat, setRepeat] = useState(false); + const [controls, setControls] = useState(false); + const [useCache, setUseCache] = useState(false); + const [showPoster, setShowPoster] = useState(false); + const [showNotificationControls, setShowNotificationControls] = + useState(false); + const [isSeeking, setIsSeeking] = useState(false); + + const videoRef = useRef(null); + const viewStyle = fullscreen ? styles.fullScreen : styles.halfScreen; + const currentSrc = srcList[srcListId]; + const additional = currentSrc as AdditionalSourceInfo; + + const goToChannel = useCallback((channel: number) => { + setSrcListId(channel); + setDuration(0); + setCurrentTime(0); + setVideoSize({videoWidth: 0, videoHeight: 0}); + setIsLoading(false); + setAudioTracks([]); + setTextTracks([]); + setSelectedAudioTrack(undefined); + setSelectedTextTrack(undefined); + setSelectedVideoTrack({ + type: SelectedVideoTrackType.AUTO, + }); + }, []); + + const channelUp = useCallback(() => { + console.log('channel up'); + goToChannel((srcListId + 1) % srcList.length); + }, [goToChannel, srcListId]); + + const channelDown = useCallback(() => { + console.log('channel down'); + goToChannel((srcListId + srcList.length - 1) % srcList.length); + }, [goToChannel, srcListId]); + + const onAudioTracks = (data: OnAudioTracksData) => { + console.log('onAudioTracks', data); + const selectedTrack = data.audioTracks?.find((x: AudioTrack) => { + return x.selected; + }); + let value; + if (audioTracksSelectionBy === SelectedTrackType.INDEX) { + value = selectedTrack?.index; + } else if (audioTracksSelectionBy === SelectedTrackType.LANGUAGE) { + value = selectedTrack?.language; + } else if (audioTracksSelectionBy === SelectedTrackType.TITLE) { + value = selectedTrack?.title; + } + setAudioTracks(data.audioTracks); + setSelectedAudioTrack({ + type: audioTracksSelectionBy, + value: value, + }); + }; + + const onVideoTracks = (data: OnVideoTracksData) => { + console.log('onVideoTracks', data.videoTracks); + setVideoTracks(data.videoTracks); + }; + + const onTextTracks = (data: OnTextTracksData) => { + const selectedTrack = data.textTracks?.find((x: TextTrack) => { + return x?.selected; + }); + + setTextTracks(data.textTracks); + let value; + if (textTracksSelectionBy === SelectedTrackType.INDEX) { + value = selectedTrack?.index; + } else if (textTracksSelectionBy === SelectedTrackType.LANGUAGE) { + value = selectedTrack?.language; + } else if (textTracksSelectionBy === SelectedTrackType.TITLE) { + value = selectedTrack?.title; + } + setSelectedTextTrack({ + type: textTracksSelectionBy, + value: value, + }); + }; + + const onLoad = (data: OnLoadData) => { + setDuration(data.duration); + onAudioTracks(data); + onTextTracks(data); + onVideoTracks(data); + }; + + const onProgress = (data: OnProgressData) => { + setCurrentTime(data.currentTime); + }; + + const onSeek = (data: OnSeekData) => { + setCurrentTime(data.currentTime); + setIsSeeking(false); + }; + + const onVideoLoadStart = () => { + console.log('onVideoLoadStart'); + setIsLoading(true); + }; + + const onTextTrackDataChanged = (data: OnTextTrackDataChangedData) => { + console.log(`Subtitles: ${JSON.stringify(data, null, 2)}`); + }; + + const onAspectRatio = (data: OnVideoAspectRatioData) => { + console.log('onAspectRadio called ' + JSON.stringify(data)); + setVideoSize({videoWidth: data.width, videoHeight: data.height}); + }; + + const onVideoBuffer = (param: OnBufferData) => { + console.log('onVideoBuffer'); + setIsLoading(param.isBuffering); + }; + + const onReadyForDisplay = () => { + console.log('onReadyForDisplay'); + setIsLoading(false); + }; + + const onAudioBecomingNoisy = () => { + setPaused(true); + }; + + const onAudioFocusChanged = (event: OnAudioFocusChangedData) => { + setPaused(!event.hasAudioFocus); + }; + + const onError = (err: OnVideoErrorData) => { + console.log(JSON.stringify(err)); + toast(true, 'error: ' + JSON.stringify(err)); + }; + + const onEnd = () => { + if (!repeat) { + channelUp(); + } + }; + + const onPlaybackRateChange = (data: OnPlaybackRateChangeData) => { + console.log('onPlaybackRateChange', data); + }; + + const onPlaybackStateChanged = (data: OnPlaybackStateChangedData) => { + console.log('onPlaybackStateChanged', data); + }; + + const onVideoBandwidthUpdate = (data: OnBandwidthUpdateData) => { + console.log('onVideoBandwidthUpdate', data); + }; + + const onFullScreenExit = () => { + // iOS pauses video on exit from full screen + Platform.OS === 'ios' && setPaused(true); + }; + + const _renderLoader = showPoster ? () => : undefined; + + const _subtitleStyle = {subtitlesFollowVideo: true}; + const _controlsStyles: ControlsStyles = { + hideNavigationBarOnFullScreenMode: true, + hideNotificationBarOnFullScreenMode: true, + liveLabel: 'LIVE', + }; + const _bufferConfig = { + ...bufferConfig, + cacheSizeMB: useCache ? 200 : 0, + }; + + useEffect(() => { + videoRef.current?.setSource(currentSrc); + }, [currentSrc]); + + return ( + + + ); +}; +export default BasicExample; diff --git a/examples/basic/src/VideoPlayer.windows.tsx b/examples/bare/src/BasicExample.windows.tsx similarity index 100% rename from examples/basic/src/VideoPlayer.windows.tsx rename to examples/bare/src/BasicExample.windows.tsx diff --git a/examples/bare/src/DRMExample.tsx b/examples/bare/src/DRMExample.tsx new file mode 100644 index 00000000..24db9385 --- /dev/null +++ b/examples/bare/src/DRMExample.tsx @@ -0,0 +1,231 @@ +import * as React from 'react'; +import { + Text, + View, + StyleSheet, + Platform, + ScrollView, + TextInput, + Alert, + Button, + ActivityIndicator, +} from 'react-native'; +import Video, {DRMType, ReactVideoSourceProperties} from 'react-native-video'; + +type SourceType = ReactVideoSourceProperties | null; + +const DRMExample = () => { + const [loading, setLoading] = React.useState(false); + + const [source, setSource] = React.useState(null); + + const [hls, setHls] = React.useState( + 'https://d5lhbv70lxyop.cloudfront.net/02b91d1c-dcde-4a93-8391-8524f7836a72/assets/5a116d5e-4acb-4461-8bc0-81adf45a8432/videokit-576p-dash-hls-drm/hls/index.m3u8', + ); + const [fairplayLicense, setFairplayLicense] = React.useState( + 'https://videokit-demo-7dr2zvpf.la.drm.cloud/acquire-license/fairplay?BrandGuid=02b91d1c-dcde-4a93-8391-8524f7836a72', + ); + const [fairplayCertificate, setFairplayCertificate] = React.useState( + 'https://videokit-demo-7dr2zvpf.la.drm.cloud/certificate/fairplay?BrandGuid=02b91d1c-dcde-4a93-8391-8524f7836a72', + ); + const [dash, setDash] = React.useState( + 'https://d5lhbv70lxyop.cloudfront.net/02b91d1c-dcde-4a93-8391-8524f7836a72/assets/5a116d5e-4acb-4461-8bc0-81adf45a8432/videokit-576p-dash-hls-drm/dash/index.mpd', + ); + const [widevineLicense, setWidevineLicense] = React.useState( + 'https://videokit-demo-7dr2zvpf.la.drm.cloud/acquire-license/widevine?BrandGuid=02b91d1c-dcde-4a93-8391-8524f7836a72', + ); + + // ------------- DMR Token ------------- + // This token is used to authenticate the user and get the license + // To run example please go to https://someweb.com (TODO: Insert here real website cc Kamil) and complete the form to receive the token + // After you receive the token, please paste it here + const [token, setToken] = React.useState(''); + + const handlePlayStopVideo = () => { + if (source !== null) { + setSource(null); + return; + } + + if (token === '') { + Alert.alert('Error', 'Please enter the token received from the website'); + return; + } + + setLoading(true); + + const newSource: ReactVideoSourceProperties = {}; + + if (Platform.OS === 'ios') { + if (fairplayLicense && fairplayCertificate) { + newSource.uri = hls; + newSource.drm = { + type: DRMType.FAIRPLAY, + licenseServer: fairplayLicense, + certificateUrl: fairplayCertificate, + getLicense: (spcString, contentId, licenseUrl, loadedLicenseUrl) => { + const formData = new FormData(); + formData.append('spc', spcString); + + const resultURL = loadedLicenseUrl.replace('skd://', 'https://'); + + return fetch(`${resultURL}&userToken=${token}`, { + method: 'POST', + headers: { + 'Content-Type': 'multipart/form-data', + Accept: 'application/json', + }, + body: formData, + }) + .then((response) => response.json()) + .then((response) => { + return response.ckc; + }) + .catch((error) => { + console.error('Error', error); + }); + }, + }; + } else { + Alert.alert('Error', 'Please enter Fairplay License and Certificate'); + setLoading(false); + } + } + + if (Platform.OS === 'android') { + if (widevineLicense) { + newSource.drm = { + type: DRMType.WIDEVINE, + licenseServer: widevineLicense, + }; + newSource.uri = dash; + } else { + Alert.alert('Error', 'Please enter Widevine License'); + setLoading(false); + } + } + + setSource(newSource); + }; + + if (Platform.OS !== 'ios' && Platform.OS !== 'android') { + return ( + + DRM is not supported on this platform + + ); + } + + return ( + + DRM Protected Stream Player + + {loading && } + {source && source.uri && ( +