headers = new HashMap<>();
+ ReadableArray propSrcHeadersArray = (src.hasKey(PROP_SRC_HEADERS)) ? src.getArray(PROP_SRC_HEADERS) : null;
+ if (propSrcHeadersArray != null) {
+ if (propSrcHeadersArray.size() > 0) {
+ for (int i = 0; i < propSrcHeadersArray.size(); i++) {
+ ReadableMap current = propSrcHeadersArray.getMap(i);
+ String key = current.hasKey("key") ? current.getString("key") : null;
+ String value = current.hasKey("value") ? current.getString("value") : null;
+ if (key != null && value != null) {
+ headers.put(key, value);
+ }
+ }
+ }
+ }
if (TextUtils.isEmpty(uriString)) {
videoView.clearSrc();
@@ -418,8 +447,15 @@ private boolean startsWithValidScheme(String uriString) {
private @ResizeMode.Mode int convertToIntDef(String resizeModeOrdinalString) {
if (!TextUtils.isEmpty(resizeModeOrdinalString)) {
- int resizeModeOrdinal = Integer.parseInt(resizeModeOrdinalString);
- return ResizeMode.toResizeMode(resizeModeOrdinal);
+ if (resizeModeOrdinalString.equals("none")) {
+ return ResizeMode.toResizeMode(ResizeMode.RESIZE_MODE_FIT);
+ } else if (resizeModeOrdinalString.equals("contain")) {
+ return ResizeMode.toResizeMode(ResizeMode.RESIZE_MODE_FIT);
+ } else if (resizeModeOrdinalString.equals("cover")) {
+ return ResizeMode.toResizeMode(ResizeMode.RESIZE_MODE_CENTER_CROP);
+ } else if (resizeModeOrdinalString.equals("stretch")) {
+ return ResizeMode.toResizeMode(ResizeMode.RESIZE_MODE_FILL);
+ }
}
return ResizeMode.RESIZE_MODE_FIT;
}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java b/android/src/oldarch/java/com/brentvatne/exoplayer/VideoEventEmitter.java
similarity index 98%
rename from android/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java
rename to android/src/oldarch/java/com/brentvatne/exoplayer/VideoEventEmitter.java
index 24d8eafb07..6c16302d8d 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java
+++ b/android/src/oldarch/java/com/brentvatne/exoplayer/VideoEventEmitter.java
@@ -132,6 +132,7 @@ class VideoEventEmitter {
private static final String EVENT_PROP_CURRENT_TIME = "currentTime";
private static final String EVENT_PROP_CURRENT_PLAYBACK_TIME = "currentPlaybackTime";
private static final String EVENT_PROP_SEEK_TIME = "seekTime";
+ private static final String EVENT_PROP_FINISHED = "finished";
private static final String EVENT_PROP_NATURAL_SIZE = "naturalSize";
private static final String EVENT_PROP_TRACK_ID = "trackId";
private static final String EVENT_PROP_WIDTH = "width";
@@ -242,7 +243,7 @@ public void load(double duration, double currentPosition, int videoWidth, int vi
private void load(double duration, double currentPosition, int videoWidth, int videoHeight,
- WritableArray audioTracks, WritableArray textTracks, WritableArray videoTracks, String trackId) {
+ WritableArray audioTracks, WritableArray textTracks, WritableArray videoTracks, String trackId) {
WritableMap event = Arguments.createMap();
event.putDouble(EVENT_PROP_DURATION, duration / 1000D);
event.putDouble(EVENT_PROP_CURRENT_TIME, currentPosition / 1000D);
@@ -302,12 +303,13 @@ void bandwidthReport(double bitRateEstimate, int height, int width, String id) {
event.putInt(EVENT_PROP_HEIGHT, height);
event.putString(EVENT_PROP_TRACK_ID, id);
receiveEvent(EVENT_BANDWIDTH, event);
- }
+ }
- void seek(long currentPosition, long seekTime) {
+ void seek(long currentPosition, long seekTime, boolean finished) {
WritableMap event = Arguments.createMap();
event.putDouble(EVENT_PROP_CURRENT_TIME, currentPosition / 1000D);
event.putDouble(EVENT_PROP_SEEK_TIME, seekTime / 1000D);
+ event.putBoolean(EVENT_PROP_FINISHED, finished);
receiveEvent(EVENT_SEEK, event);
}
@@ -386,7 +388,7 @@ void timedMetadata(Metadata metadata) {
WritableArray metadataArray = Arguments.createArray();
for (int i = 0; i < metadata.length(); i++) {
-
+
Metadata.Entry entry = metadata.get(i);
if (entry instanceof Id3Frame) {
@@ -407,16 +409,16 @@ void timedMetadata(Metadata metadata) {
map.putString("value", value);
metadataArray.pushMap(map);
-
+
} else if (entry instanceof EventMessage) {
-
+
EventMessage eventMessage = (EventMessage) entry;
-
+
WritableMap map = Arguments.createMap();
map.putString("identifier", eventMessage.schemeIdUri);
map.putString("value", eventMessage.value);
metadataArray.pushMap(map);
-
+
}
}
@@ -445,4 +447,4 @@ void receiveAdEvent(String event) {
private void receiveEvent(@VideoEvents String type, WritableMap event) {
eventEmitter.receiveEvent(viewId, type, event);
}
-}
+}
\ No newline at end of file
diff --git a/examples/FabricExample/.buckconfig b/examples/FabricExample/.buckconfig
new file mode 100644
index 0000000000..934256cb29
--- /dev/null
+++ b/examples/FabricExample/.buckconfig
@@ -0,0 +1,6 @@
+
+[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
new file mode 100644
index 0000000000..848943bb52
--- /dev/null
+++ b/examples/FabricExample/.bundle/config
@@ -0,0 +1,2 @@
+BUNDLE_PATH: "vendor/bundle"
+BUNDLE_FORCE_RUBY_PLATFORM: 1
diff --git a/examples/FabricExample/.eslintrc.js b/examples/FabricExample/.eslintrc.js
new file mode 100644
index 0000000000..dcf0be0865
--- /dev/null
+++ b/examples/FabricExample/.eslintrc.js
@@ -0,0 +1,16 @@
+module.exports = {
+ root: true,
+ extends: '@react-native-community',
+ 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
new file mode 100644
index 0000000000..2423126f72
--- /dev/null
+++ b/examples/FabricExample/.gitignore
@@ -0,0 +1,64 @@
+# 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/
diff --git a/examples/FabricExample/.prettierrc.js b/examples/FabricExample/.prettierrc.js
new file mode 100644
index 0000000000..2b540746a7
--- /dev/null
+++ b/examples/FabricExample/.prettierrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+ arrowParens: 'avoid',
+ bracketSameLine: true,
+ bracketSpacing: false,
+ singleQuote: true,
+ trailingComma: 'all',
+};
diff --git a/examples/FabricExample/.ruby-version b/examples/FabricExample/.ruby-version
new file mode 100644
index 0000000000..a603bb50a2
--- /dev/null
+++ b/examples/FabricExample/.ruby-version
@@ -0,0 +1 @@
+2.7.5
diff --git a/examples/FabricExample/.watchmanconfig b/examples/FabricExample/.watchmanconfig
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/examples/FabricExample/.watchmanconfig
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/examples/FabricExample/App.tsx b/examples/FabricExample/App.tsx
new file mode 100644
index 0000000000..2a3575dc2c
--- /dev/null
+++ b/examples/FabricExample/App.tsx
@@ -0,0 +1,19 @@
+/**
+ * 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
new file mode 100644
index 0000000000..5efda89f45
--- /dev/null
+++ b/examples/FabricExample/Gemfile
@@ -0,0 +1,6 @@
+source 'https://rubygems.org'
+
+# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
+ruby '2.7.5'
+
+gem 'cocoapods', '~> 1.11', '>= 1.11.2'
diff --git a/examples/FabricExample/Gemfile.lock b/examples/FabricExample/Gemfile.lock
new file mode 100644
index 0000000000..be0b95a462
--- /dev/null
+++ b/examples/FabricExample/Gemfile.lock
@@ -0,0 +1,98 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.6)
+ rexml
+ activesupport (7.0.4.3)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ addressable (2.8.4)
+ public_suffix (>= 2.0.2, < 6.0)
+ algoliasearch (1.27.5)
+ httpclient (~> 2.8, >= 2.8.3)
+ json (>= 1.5.1)
+ atomos (0.1.3)
+ claide (1.1.0)
+ cocoapods (1.12.0)
+ addressable (~> 2.8)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.12.0)
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
+ cocoapods-downloader (>= 1.6.0, < 2.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.21.0, < 2.0)
+ cocoapods-core (1.12.0)
+ 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 (1.6.3)
+ 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.15.5)
+ 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.6.3)
+ minitest (5.18.0)
+ molinillo (0.8.0)
+ nanaimo (0.3.0)
+ nap (1.1.0)
+ netrc (0.11.0)
+ public_suffix (4.0.7)
+ rexml (3.2.5)
+ ruby-macho (2.5.1)
+ typhoeus (1.4.0)
+ ethon (>= 0.9.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ xcodeproj (1.22.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)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ cocoapods (~> 1.11, >= 1.11.2)
+
+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
new file mode 100644
index 0000000000..178476699b
--- /dev/null
+++ b/examples/FabricExample/__tests__/App-test.tsx
@@ -0,0 +1,14 @@
+/**
+ * @format
+ */
+
+import 'react-native';
+import React from 'react';
+import App from '../App';
+
+// 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/_node-version b/examples/FabricExample/_node-version
new file mode 100644
index 0000000000..b6a7d89c68
--- /dev/null
+++ b/examples/FabricExample/_node-version
@@ -0,0 +1 @@
+16
diff --git a/examples/FabricExample/android/app/_BUCK b/examples/FabricExample/android/app/_BUCK
new file mode 100644
index 0000000000..6f629726b2
--- /dev/null
+++ b/examples/FabricExample/android/app/_BUCK
@@ -0,0 +1,55 @@
+# 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
new file mode 100644
index 0000000000..1266df3d88
--- /dev/null
+++ b/examples/FabricExample/android/app/build.gradle
@@ -0,0 +1,170 @@
+apply plugin: "com.android.application"
+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 create four separate APKs instead of one,
+ * one for each native architecture. This is useful if you don't
+ * use App Bundles (https://developer.android.com/guide/app-bundle/)
+ * and want to have separate APKs to upload to the Play Store.
+ */
+def enableSeparateBuildPerCPUArchitecture = false
+
+/**
+ * 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:+'
+
+/**
+ * Private function to get the list of Native Architectures you want to build.
+ * This reads the value from reactNativeArchitectures in your gradle.properties
+ * file and works together with the --active-arch-only flag of react-native run-android.
+ */
+def reactNativeArchitectures() {
+ def value = project.getProperties().get("reactNativeArchitectures")
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
+}
+
+android {
+ ndkVersion rootProject.ext.ndkVersion
+
+ compileSdkVersion 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"
+ }
+
+ splits {
+ abi {
+ reset()
+ enable enableSeparateBuildPerCPUArchitecture
+ universalApk false // If true, also generate a universal APK
+ include (*reactNativeArchitectures())
+ }
+ }
+ 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"
+ }
+ }
+
+ // applicationVariants are e.g. debug, release
+ applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ // For each separate APK per architecture, set a unique version code as described here:
+ // https://developer.android.com/studio/build/configure-apk-splits.html
+ // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
+ def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
+ def abi = output.getFilter(OutputFile.ABI)
+ if (abi != null) { // null for the universal-debug, universal-release variants
+ output.versionCodeOverride =
+ defaultConfig.versionCode * 1000 + versionCodes.get(abi)
+ }
+
+ }
+ }
+}
+
+dependencies {
+ // The version of react-native is set by the React Native Gradle Plugin
+ implementation("com.facebook.react:react-android")
+
+ implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
+
+ debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
+ debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
+ exclude group:'com.squareup.okhttp3', module:'okhttp'
+ }
+
+ debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
+ 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
new file mode 100644
index 0000000000..fff270f8d1
--- /dev/null
+++ b/examples/FabricExample/android/app/build_defs.bzl
@@ -0,0 +1,19 @@
+"""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/debug.keystore b/examples/FabricExample/android/app/debug.keystore
new file mode 100644
index 0000000000..364e105ed3
Binary files /dev/null and b/examples/FabricExample/android/app/debug.keystore differ
diff --git a/examples/FabricExample/android/app/proguard-rules.pro b/examples/FabricExample/android/app/proguard-rules.pro
new file mode 100644
index 0000000000..11b025724a
--- /dev/null
+++ b/examples/FabricExample/android/app/proguard-rules.pro
@@ -0,0 +1,10 @@
+# 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/debug/AndroidManifest.xml b/examples/FabricExample/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000000..4b185bc159
--- /dev/null
+++ b/examples/FabricExample/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/android/app/src/debug/java/net/video/fabricexample/ReactNativeFlipper.java b/examples/FabricExample/android/app/src/debug/java/net/video/fabricexample/ReactNativeFlipper.java
new file mode 100644
index 0000000000..426e7d70c9
--- /dev/null
+++ b/examples/FabricExample/android/app/src/debug/java/net/video/fabricexample/ReactNativeFlipper.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the LICENSE file in the root
+ * directory of this source tree.
+ */
+package net.video.fabricexample;
+
+import android.content.Context;
+import com.facebook.flipper.android.AndroidFlipperClient;
+import com.facebook.flipper.android.utils.FlipperUtils;
+import com.facebook.flipper.core.FlipperClient;
+import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
+import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
+import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
+import com.facebook.flipper.plugins.inspector.DescriptorMapping;
+import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
+import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
+import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
+import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
+import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
+import com.facebook.react.ReactInstanceEventListener;
+import com.facebook.react.ReactInstanceManager;
+import com.facebook.react.bridge.ReactContext;
+import com.facebook.react.modules.network.NetworkingModule;
+import okhttp3.OkHttpClient;
+
+public class ReactNativeFlipper {
+ public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
+ if (FlipperUtils.shouldEnableFlipper(context)) {
+ final FlipperClient client = AndroidFlipperClient.getInstance(context);
+
+ client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
+ client.addPlugin(new ReactFlipperPlugin());
+ client.addPlugin(new DatabasesFlipperPlugin(context));
+ client.addPlugin(new SharedPreferencesFlipperPlugin(context));
+ client.addPlugin(CrashReporterPlugin.getInstance());
+
+ NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
+ NetworkingModule.setCustomClientBuilder(
+ new NetworkingModule.CustomClientBuilder() {
+ @Override
+ public void apply(OkHttpClient.Builder builder) {
+ builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
+ }
+ });
+ client.addPlugin(networkFlipperPlugin);
+ client.start();
+
+ // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
+ // Hence we run if after all native modules have been initialized
+ ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
+ if (reactContext == null) {
+ reactInstanceManager.addReactInstanceEventListener(
+ new ReactInstanceEventListener() {
+ @Override
+ public void onReactContextInitialized(ReactContext reactContext) {
+ reactInstanceManager.removeReactInstanceEventListener(this);
+ reactContext.runOnNativeModulesQueueThread(
+ new Runnable() {
+ @Override
+ public void run() {
+ client.addPlugin(new FrescoFlipperPlugin());
+ }
+ });
+ }
+ });
+ } else {
+ client.addPlugin(new FrescoFlipperPlugin());
+ }
+ }
+ }
+}
diff --git a/examples/FabricExample/android/app/src/main/AndroidManifest.xml b/examples/FabricExample/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..91cd85a6d1
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.java b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.java
new file mode 100644
index 0000000000..ee26067a11
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainActivity.java
@@ -0,0 +1,57 @@
+package net.video.fabricexample;
+
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+
+import com.facebook.react.ReactActivity;
+import com.facebook.react.ReactActivityDelegate;
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
+import com.facebook.react.defaults.DefaultReactActivityDelegate;
+
+public class MainActivity extends ReactActivity {
+
+ private static final boolean TEST_TRANSLUCENT_STATUS_BAR = true;
+ private static final boolean TEST_TRANSLUCENT_NAVBAR = true;
+
+ /**
+ * Returns the name of the main component registered from JavaScript. This is used to schedule
+ * rendering of the component.
+ */
+ @Override
+ protected String getMainComponentName() {
+ return "FabricExample";
+ }
+
+ /**
+ * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link
+ * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React
+ * (aka React 18) with two boolean flags.
+ */
+ @Override
+ protected ReactActivityDelegate createReactActivityDelegate() {
+ return new DefaultReactActivityDelegate(
+ this,
+ getMainComponentName(),
+ // If you opted-in for the New Architecture, we enable the Fabric Renderer.
+ DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled
+ // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18).
+ DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled
+ );
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (TEST_TRANSLUCENT_STATUS_BAR) {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+ }
+ if (TEST_TRANSLUCENT_NAVBAR) {
+ getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.java b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.java
new file mode 100644
index 0000000000..b2d41535fe
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/java/net/video/fabricexample/MainApplication.java
@@ -0,0 +1,62 @@
+package net.video.fabricexample;
+
+import android.app.Application;
+import com.facebook.react.PackageList;
+import com.facebook.react.ReactApplication;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
+import com.facebook.react.defaults.DefaultReactNativeHost;
+import com.facebook.soloader.SoLoader;
+import java.util.List;
+
+public class MainApplication extends Application implements ReactApplication {
+
+ private final ReactNativeHost mReactNativeHost =
+ new DefaultReactNativeHost(this) {
+ @Override
+ public boolean getUseDeveloperSupport() {
+ return BuildConfig.DEBUG;
+ }
+
+ @Override
+ protected List getPackages() {
+ @SuppressWarnings("UnnecessaryLocalVariable")
+ List packages = new PackageList(this).getPackages();
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // packages.add(new MyReactNativePackage());
+ return packages;
+ }
+
+ @Override
+ protected String getJSMainModuleName() {
+ return "index";
+ }
+
+ @Override
+ protected boolean isNewArchEnabled() {
+ return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
+ }
+
+ @Override
+ protected Boolean isHermesEnabled() {
+ return BuildConfig.IS_HERMES_ENABLED;
+ }
+ };
+
+ @Override
+ public ReactNativeHost getReactNativeHost() {
+ return mReactNativeHost;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ SoLoader.init(this, /* native exopackage */ false);
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ // If you opted-in for the New Architecture, we load the native entry point for this app.
+ DefaultNewArchitectureEntryPoint.load();
+ }
+ ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
+ }
+}
diff --git a/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt b/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt
new file mode 100644
index 0000000000..119269e647
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/CMakeLists.txt
@@ -0,0 +1,7 @@
+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
new file mode 100644
index 0000000000..26162dd872
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp
@@ -0,0 +1,32 @@
+#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
new file mode 100644
index 0000000000..b38ccf53fd
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h
@@ -0,0 +1,16 @@
+#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
new file mode 100644
index 0000000000..5fd688c509
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp
@@ -0,0 +1,45 @@
+#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
new file mode 100644
index 0000000000..b2b85e6427
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h
@@ -0,0 +1,38 @@
+#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
new file mode 100644
index 0000000000..54f598a486
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp
@@ -0,0 +1,65 @@
+#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
new file mode 100644
index 0000000000..011a34869e
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h
@@ -0,0 +1,32 @@
+#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
new file mode 100644
index 0000000000..c569b6e865
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/jni/OnLoad.cpp
@@ -0,0 +1,11 @@
+#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
new file mode 100644
index 0000000000..f35d996202
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..a2f5908281
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..1b52399808
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ff10afd6e1
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..115a4c768a
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dcd3cd8083
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..459ca609d3
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8ca12fe024
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..8e19b410a1
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b824ebdd48
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..4c19a13c23
Binary files /dev/null and b/examples/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/examples/FabricExample/android/app/src/main/res/values/strings.xml b/examples/FabricExample/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..30038583e9
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ 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
new file mode 100644
index 0000000000..7ba83a2ad5
--- /dev/null
+++ b/examples/FabricExample/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/examples/FabricExample/android/build.gradle b/examples/FabricExample/android/build.gradle
new file mode 100644
index 0000000000..c30aa72af7
--- /dev/null
+++ b/examples/FabricExample/android/build.gradle
@@ -0,0 +1,49 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext {
+ buildToolsVersion = "31.0.0"
+ kotlinVersion = "1.6.20"
+ minSdkVersion = 21
+ compileSdkVersion = 31
+ targetSdkVersion = 31
+
+ // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
+ ndkVersion = "23.1.7779620"
+ }
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath("com.android.tools.build:gradle:7.3.0")
+ classpath("com.facebook.react:react-native-gradle-plugin")
+ classpath("de.undercouch:gradle-download-task:5.0.1")
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
+ classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlinVersion"
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ maven {
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ url("$rootDir/../node_modules/react-native/android")
+ }
+ maven {
+ // Android JSC is installed from npm
+ url("$rootDir/../node_modules/jsc-android/dist")
+ }
+ mavenCentral {
+ // We don't want to fetch react-native from Maven Central as there are
+ // older versions over there.
+ content {
+ excludeGroup "com.facebook.react"
+ }
+ }
+ google()
+ maven { url 'https://www.jitpack.io' }
+ }
+}
diff --git a/examples/FabricExample/android/gradle.properties b/examples/FabricExample/android/gradle.properties
new file mode 100644
index 0000000000..32810cc15a
--- /dev/null
+++ b/examples/FabricExample/android/gradle.properties
@@ -0,0 +1,42 @@
+# 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
+
+# Version of flipper SDK to use with React Native
+FLIPPER_VERSION=0.125.0
+
+# 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
new file mode 100644
index 0000000000..41d9927a4d
Binary files /dev/null and b/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.properties b/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..8fad3f5a98
--- /dev/null
+++ b/examples/FabricExample/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/examples/FabricExample/android/gradlew b/examples/FabricExample/android/gradlew
new file mode 100755
index 0000000000..1b6c787337
--- /dev/null
+++ b/examples/FabricExample/android/gradlew
@@ -0,0 +1,234 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/examples/FabricExample/android/gradlew.bat b/examples/FabricExample/android/gradlew.bat
new file mode 100644
index 0000000000..ac1b06f938
--- /dev/null
+++ b/examples/FabricExample/android/gradlew.bat
@@ -0,0 +1,89 @@
+@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
new file mode 100644
index 0000000000..e3f34c3fd8
--- /dev/null
+++ b/examples/FabricExample/android/settings.gradle
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000000..957883ae20
--- /dev/null
+++ b/examples/FabricExample/app.json
@@ -0,0 +1,4 @@
+{
+ "name": "FabricExample",
+ "displayName": "FabricExample"
+}
\ No newline at end of file
diff --git a/examples/FabricExample/babel.config.js b/examples/FabricExample/babel.config.js
new file mode 100644
index 0000000000..51c969cf73
--- /dev/null
+++ b/examples/FabricExample/babel.config.js
@@ -0,0 +1,17 @@
+const path = require('path');
+const pak = require('../../package.json');
+
+module.exports = {
+ presets: ['module:metro-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
new file mode 100644
index 0000000000..a850d031de
--- /dev/null
+++ b/examples/FabricExample/index.js
@@ -0,0 +1,9 @@
+/**
+ * @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
new file mode 100644
index 0000000000..7a06998065
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj
@@ -0,0 +1,703 @@
+// !$*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 = 12.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 = 12.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++17";
+ 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)",
+ );
+ 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 = 12.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_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-DFOLLY_NO_CONFIG",
+ "-DFOLLY_MOBILE=1",
+ "-DFOLLY_USE_LIBCPP=1",
+ );
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
+ 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_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 = 12.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_CPLUSPLUSFLAGS = (
+ "$(OTHER_CFLAGS)",
+ "-DFOLLY_NO_CONFIG",
+ "-DFOLLY_MOBILE=1",
+ "-DFOLLY_USE_LIBCPP=1",
+ );
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ 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
new file mode 100644
index 0000000000..bc4aae2202
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata b/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..3e9ae53e5e
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.h b/examples/FabricExample/ios/FabricExample/AppDelegate.h
new file mode 100644
index 0000000000..ef1de86a2a
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/AppDelegate.h
@@ -0,0 +1,8 @@
+#import
+#import
+
+@interface AppDelegate : UIResponder
+
+@property (nonatomic, strong) UIWindow *window;
+
+@end
diff --git a/examples/FabricExample/ios/FabricExample/AppDelegate.mm b/examples/FabricExample/ios/FabricExample/AppDelegate.mm
new file mode 100644
index 0000000000..42eee33f92
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/AppDelegate.mm
@@ -0,0 +1,133 @@
+#import "AppDelegate.h"
+
+#import
+#import
+#import
+
+#import
+
+#if RCT_NEW_ARCH_ENABLED
+#import
+#import
+#import
+#import
+#import
+#import
+
+#import
+
+static NSString *const kRNConcurrentRoot = @"concurrentRoot";
+
+@interface AppDelegate () {
+ RCTTurboModuleManager *_turboModuleManager;
+ RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
+ std::shared_ptr _reactNativeConfig;
+ facebook::react::ContextContainer::Shared _contextContainer;
+}
+@end
+#endif
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ RCTAppSetupPrepareApp(application, true);
+
+ RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
+
+#if RCT_NEW_ARCH_ENABLED
+ _contextContainer = std::make_shared();
+ _reactNativeConfig = std::make_shared();
+ _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
+ _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
+ bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
+#endif
+
+ NSDictionary *initProps = [self prepareInitialProps];
+ UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"FabricExample", initProps, true);
+
+ if (@available(iOS 13.0, *)) {
+ rootView.backgroundColor = [UIColor systemBackgroundColor];
+ } else {
+ rootView.backgroundColor = [UIColor whiteColor];
+ }
+
+ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+ UIViewController *rootViewController = [UIViewController new];
+ rootViewController.view = rootView;
+ self.window.rootViewController = rootViewController;
+ [self.window makeKeyAndVisible];
+ return YES;
+}
+
+/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
+///
+/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
+/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
+/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`.
+- (BOOL)concurrentRootEnabled
+{
+ // Switch this bool to turn on and off the concurrent root
+ return true;
+}
+
+- (NSDictionary *)prepareInitialProps
+{
+ NSMutableDictionary *initProps = [NSMutableDictionary new];
+
+#ifdef RCT_NEW_ARCH_ENABLED
+ initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
+#endif
+
+ return initProps;
+}
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+#if DEBUG
+ return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
+#else
+ return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+
+#if RCT_NEW_ARCH_ENABLED
+
+#pragma mark - RCTCxxBridgeDelegate
+
+- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge
+{
+ _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
+ delegate:self
+ jsInvoker:bridge.jsCallInvoker];
+ return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
+}
+
+#pragma mark RCTTurboModuleManagerDelegate
+
+- (Class)getModuleClassFromName:(const char *)name
+{
+ return RCTCoreModulesClassProvider(name);
+}
+
+- (std::shared_ptr)getTurboModule:(const std::string &)name
+ jsInvoker:(std::shared_ptr)jsInvoker
+{
+ return nullptr;
+}
+
+- (std::shared_ptr)getTurboModule:(const std::string &)name
+ initParams:
+ (const facebook::react::ObjCTurboModule::InitParams &)params
+{
+ return nullptr;
+}
+
+- (id)getModuleInstanceFromClass:(Class)moduleClass
+{
+ return RCTAppSetupDefaultModuleFromClass(moduleClass);
+}
+
+#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
new file mode 100644
index 0000000000..81213230de
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,53 @@
+{
+ "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
new file mode 100644
index 0000000000..2d92bd53fd
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/FabricExample/ios/FabricExample/Info.plist b/examples/FabricExample/ios/FabricExample/Info.plist
new file mode 100644
index 0000000000..860ea180cb
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ 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
+
+ NSExceptionDomains
+
+ localhost
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+
+
+
+ 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
new file mode 100644
index 0000000000..c4f28caff1
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/LaunchScreen.storyboard
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/FabricExample/ios/FabricExample/main.m b/examples/FabricExample/ios/FabricExample/main.m
new file mode 100644
index 0000000000..d645c7246c
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExample/main.m
@@ -0,0 +1,10 @@
+#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
new file mode 100644
index 0000000000..f023368a4e
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExampleTests/FabricExampleTests.m
@@ -0,0 +1,66 @@
+#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
new file mode 100644
index 0000000000..ba72822e87
--- /dev/null
+++ b/examples/FabricExample/ios/FabricExampleTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ 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
new file mode 100644
index 0000000000..6d6651fb26
--- /dev/null
+++ b/examples/FabricExample/ios/Podfile
@@ -0,0 +1,43 @@
+require_relative '../node_modules/react-native/scripts/react_native_pods'
+require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
+
+platform :ios, '12.4'
+install! 'cocoapods', :deterministic_uuids => false
+
+target 'FabricExample' do
+ config = use_native_modules!
+
+ # Flags change depending on the env values.
+ flags = get_default_flags()
+
+ use_react_native!(
+ :path => config[:reactNativePath],
+ # Hermes is now enabled by default. Disable by setting this flag to false.
+ # Upcoming versions of React Native may rely on get_default_flags(), but
+ # we make it explicit here to aid in the React Native upgrade process.
+ :hermes_enabled => true,
+ :fabric_enabled => flags[:fabric_enabled],
+ # 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,
+ # Set `mac_catalyst_enabled` to `true` in order to apply patches
+ # necessary for Mac Catalyst builds
+ :mac_catalyst_enabled => false
+ )
+ __apply_Xcode_12_5_M1_post_install_workaround(installer)
+ end
+end
diff --git a/examples/FabricExample/ios/Podfile.lock b/examples/FabricExample/ios/Podfile.lock
new file mode 100644
index 0000000000..56d9e21ba7
--- /dev/null
+++ b/examples/FabricExample/ios/Podfile.lock
@@ -0,0 +1,1013 @@
+PODS:
+ - boost (1.76.0)
+ - CocoaAsyncSocket (7.6.5)
+ - DoubleConversion (1.1.6)
+ - FBLazyVector (0.71.7)
+ - FBReactNativeSpec (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Core (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - Flipper (0.125.0):
+ - Flipper-Folly (~> 2.6)
+ - Flipper-RSocket (~> 1.4)
+ - Flipper-Boost-iOSX (1.76.0.1.11)
+ - Flipper-DoubleConversion (3.2.0.1)
+ - Flipper-Fmt (7.1.7)
+ - Flipper-Folly (2.6.10):
+ - Flipper-Boost-iOSX
+ - Flipper-DoubleConversion
+ - Flipper-Fmt (= 7.1.7)
+ - Flipper-Glog
+ - libevent (~> 2.1.12)
+ - OpenSSL-Universal (= 1.1.1100)
+ - Flipper-Glog (0.5.0.5)
+ - Flipper-PeerTalk (0.0.4)
+ - Flipper-RSocket (1.4.3):
+ - Flipper-Folly (~> 2.6)
+ - FlipperKit (0.125.0):
+ - FlipperKit/Core (= 0.125.0)
+ - FlipperKit/Core (0.125.0):
+ - Flipper (~> 0.125.0)
+ - FlipperKit/CppBridge
+ - FlipperKit/FBCxxFollyDynamicConvert
+ - FlipperKit/FBDefines
+ - FlipperKit/FKPortForwarding
+ - SocketRocket (~> 0.6.0)
+ - FlipperKit/CppBridge (0.125.0):
+ - Flipper (~> 0.125.0)
+ - FlipperKit/FBCxxFollyDynamicConvert (0.125.0):
+ - Flipper-Folly (~> 2.6)
+ - FlipperKit/FBDefines (0.125.0)
+ - FlipperKit/FKPortForwarding (0.125.0):
+ - CocoaAsyncSocket (~> 7.6)
+ - Flipper-PeerTalk (~> 0.0.4)
+ - FlipperKit/FlipperKitHighlightOverlay (0.125.0)
+ - FlipperKit/FlipperKitLayoutHelpers (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutTextSearchable
+ - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutHelpers
+ - YogaKit (~> 1.18)
+ - FlipperKit/FlipperKitLayoutPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutHelpers
+ - FlipperKit/FlipperKitLayoutIOSDescriptors
+ - FlipperKit/FlipperKitLayoutTextSearchable
+ - YogaKit (~> 1.18)
+ - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0)
+ - FlipperKit/FlipperKitNetworkPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitReactPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/SKIOSNetworkPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitNetworkPlugin
+ - fmt (6.2.1)
+ - glog (0.3.5)
+ - hermes-engine (0.71.7):
+ - hermes-engine/Pre-built (= 0.71.7)
+ - hermes-engine/Pre-built (0.71.7)
+ - libevent (2.1.12)
+ - OpenSSL-Universal (1.1.1100)
+ - PromisesObjC (2.2.0)
+ - PromisesSwift (2.2.0):
+ - PromisesObjC (= 2.2.0)
+ - RCT-Folly (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Default (= 2021.07.22.00)
+ - RCT-Folly/Default (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Fabric (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Futures (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - libevent
+ - RCTRequired (0.71.7)
+ - RCTTypeSafety (0.71.7):
+ - FBLazyVector (= 0.71.7)
+ - RCTRequired (= 0.71.7)
+ - React-Core (= 0.71.7)
+ - React (0.71.7):
+ - React-Core (= 0.71.7)
+ - React-Core/DevSupport (= 0.71.7)
+ - React-Core/RCTWebSocket (= 0.71.7)
+ - React-RCTActionSheet (= 0.71.7)
+ - React-RCTAnimation (= 0.71.7)
+ - React-RCTBlob (= 0.71.7)
+ - React-RCTImage (= 0.71.7)
+ - React-RCTLinking (= 0.71.7)
+ - React-RCTNetwork (= 0.71.7)
+ - React-RCTSettings (= 0.71.7)
+ - React-RCTText (= 0.71.7)
+ - React-RCTVibration (= 0.71.7)
+ - React-callinvoker (0.71.7)
+ - React-Codegen (0.71.7):
+ - FBReactNativeSpec
+ - hermes-engine
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-rncore
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - React-Core (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.7)
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/CoreModulesHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/Default (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/DevSupport (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.7)
+ - React-Core/RCTWebSocket (= 0.71.7)
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-jsinspector (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTActionSheetHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTAnimationHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTBlobHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTImageHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTLinkingHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTNetworkHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTSettingsHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTTextHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTVibrationHeaders (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-Core/RCTWebSocket (0.71.7):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.7)
+ - React-cxxreact (= 0.71.7)
+ - React-hermes
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - Yoga
+ - React-CoreModules (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Codegen (= 0.71.7)
+ - React-Core/CoreModulesHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-RCTBlob
+ - React-RCTImage (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-cxxreact (0.71.7):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsinspector (= 0.71.7)
+ - React-logger (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - React-runtimeexecutor (= 0.71.7)
+ - React-Fabric (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Fabric/animations (= 0.71.7)
+ - React-Fabric/attributedstring (= 0.71.7)
+ - React-Fabric/butter (= 0.71.7)
+ - React-Fabric/componentregistry (= 0.71.7)
+ - React-Fabric/componentregistrynative (= 0.71.7)
+ - React-Fabric/components (= 0.71.7)
+ - React-Fabric/config (= 0.71.7)
+ - React-Fabric/core (= 0.71.7)
+ - React-Fabric/debug_core (= 0.71.7)
+ - React-Fabric/debug_renderer (= 0.71.7)
+ - React-Fabric/imagemanager (= 0.71.7)
+ - React-Fabric/leakchecker (= 0.71.7)
+ - React-Fabric/mapbuffer (= 0.71.7)
+ - React-Fabric/mounting (= 0.71.7)
+ - React-Fabric/runtimescheduler (= 0.71.7)
+ - React-Fabric/scheduler (= 0.71.7)
+ - React-Fabric/telemetry (= 0.71.7)
+ - React-Fabric/templateprocessor (= 0.71.7)
+ - React-Fabric/textlayoutmanager (= 0.71.7)
+ - React-Fabric/uimanager (= 0.71.7)
+ - React-Fabric/utils (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/animations (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/attributedstring (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/butter (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/componentregistry (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/componentregistrynative (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Fabric/components/activityindicator (= 0.71.7)
+ - React-Fabric/components/image (= 0.71.7)
+ - React-Fabric/components/inputaccessory (= 0.71.7)
+ - React-Fabric/components/legacyviewmanagerinterop (= 0.71.7)
+ - React-Fabric/components/modal (= 0.71.7)
+ - React-Fabric/components/root (= 0.71.7)
+ - React-Fabric/components/safeareaview (= 0.71.7)
+ - React-Fabric/components/scrollview (= 0.71.7)
+ - React-Fabric/components/slider (= 0.71.7)
+ - React-Fabric/components/text (= 0.71.7)
+ - React-Fabric/components/textinput (= 0.71.7)
+ - React-Fabric/components/unimplementedview (= 0.71.7)
+ - React-Fabric/components/view (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/activityindicator (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/image (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/inputaccessory (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/legacyviewmanagerinterop (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/modal (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/root (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/safeareaview (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/scrollview (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/slider (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/text (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/textinput (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/unimplementedview (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/components/view (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - Yoga
+ - React-Fabric/config (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/core (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/debug_core (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/debug_renderer (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/imagemanager (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - React-RCTImage (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/leakchecker (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/mapbuffer (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/mounting (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/runtimescheduler (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/scheduler (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/telemetry (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/templateprocessor (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/textlayoutmanager (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Fabric/uimanager
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/uimanager (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-Fabric/utils (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - RCTRequired (= 0.71.7)
+ - RCTTypeSafety (= 0.71.7)
+ - React-graphics (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-jsiexecutor (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-graphics (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.7)
+ - React-hermes (0.71.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - RCT-Folly/Futures (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.7)
+ - React-jsi
+ - React-jsiexecutor (= 0.71.7)
+ - React-jsinspector (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - React-jsi (0.71.7):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsiexecutor (0.71.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - React-jsinspector (0.71.7)
+ - React-logger (0.71.7):
+ - glog
+ - react-native-video (7.0.0-alpha.11):
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Codegen
+ - React-Core
+ - react-native-video/Video (= 7.0.0-alpha.11)
+ - React-RCTFabric
+ - ReactCommon/turbomodule/core
+ - react-native-video/Fabric (7.0.0-alpha.11):
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Codegen
+ - React-Core
+ - React-RCTFabric
+ - ReactCommon/turbomodule/core
+ - react-native-video/Video (7.0.0-alpha.11):
+ - PromisesSwift
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Codegen
+ - React-Core
+ - react-native-video/Fabric
+ - React-RCTFabric
+ - ReactCommon/turbomodule/core
+ - React-perflogger (0.71.7)
+ - React-RCTActionSheet (0.71.7):
+ - React-Core/RCTActionSheetHeaders (= 0.71.7)
+ - React-RCTAnimation (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTAnimationHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTAppDelegate (0.71.7):
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-graphics
+ - React-RCTFabric
+ - ReactCommon/turbomodule/core
+ - React-RCTBlob (0.71.7):
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTBlobHeaders (= 0.71.7)
+ - React-Core/RCTWebSocket (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-RCTNetwork (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTFabric (0.71.7):
+ - RCT-Folly/Fabric (= 2021.07.22.00)
+ - React-Core (= 0.71.7)
+ - React-Fabric (= 0.71.7)
+ - React-RCTImage (= 0.71.7)
+ - React-RCTImage (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTImageHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-RCTNetwork (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTLinking (0.71.7):
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTLinkingHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTNetwork (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTNetworkHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTSettings (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.7)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTSettingsHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-RCTText (0.71.7):
+ - React-Core/RCTTextHeaders (= 0.71.7)
+ - React-RCTVibration (0.71.7):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.71.7)
+ - React-Core/RCTVibrationHeaders (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/core (= 0.71.7)
+ - React-rncore (0.71.7)
+ - React-runtimeexecutor (0.71.7):
+ - React-jsi (= 0.71.7)
+ - ReactCommon/turbomodule/bridging (0.71.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.7)
+ - React-Core (= 0.71.7)
+ - React-cxxreact (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-logger (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - ReactCommon/turbomodule/core (0.71.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.7)
+ - React-Core (= 0.71.7)
+ - React-cxxreact (= 0.71.7)
+ - React-jsi (= 0.71.7)
+ - React-logger (= 0.71.7)
+ - React-perflogger (= 0.71.7)
+ - SocketRocket (0.6.0)
+ - Yoga (1.14.0)
+ - YogaKit (1.18.1):
+ - Yoga (~> 1.14)
+
+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`)
+ - Flipper (= 0.125.0)
+ - Flipper-Boost-iOSX (= 1.76.0.1.11)
+ - Flipper-DoubleConversion (= 3.2.0.1)
+ - Flipper-Fmt (= 7.1.7)
+ - Flipper-Folly (= 2.6.10)
+ - Flipper-Glog (= 0.5.0.5)
+ - Flipper-PeerTalk (= 0.0.4)
+ - Flipper-RSocket (= 1.4.3)
+ - FlipperKit (= 0.125.0)
+ - FlipperKit/Core (= 0.125.0)
+ - FlipperKit/CppBridge (= 0.125.0)
+ - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0)
+ - FlipperKit/FBDefines (= 0.125.0)
+ - FlipperKit/FKPortForwarding (= 0.125.0)
+ - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0)
+ - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0)
+ - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitReactPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0)
+ - FlipperKit/SKIOSNetworkPlugin (= 0.125.0)
+ - 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)
+ - OpenSSL-Universal (= 1.1.1100)
+ - 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`)
+ - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
+ - React (from `../node_modules/react-native/`)
+ - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Codegen (from `build/generated/ios`)
+ - React-Core (from `../node_modules/react-native/`)
+ - React-Core/DevSupport (from `../node_modules/react-native/`)
+ - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
+ - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
+ - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
+ - React-Fabric (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-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`)
+ - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
+ - react-native-video (from `../../..`)
+ - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
+ - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
+ - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
+ - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
+ - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
+ - React-RCTFabric (from `../node_modules/react-native/React`)
+ - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
+ - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
+ - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
+ - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
+ - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
+ - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
+ - React-rncore (from `../node_modules/react-native/ReactCommon`)
+ - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
+ - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
+
+SPEC REPOS:
+ trunk:
+ - CocoaAsyncSocket
+ - Flipper
+ - Flipper-Boost-iOSX
+ - Flipper-DoubleConversion
+ - Flipper-Fmt
+ - Flipper-Folly
+ - Flipper-Glog
+ - Flipper-PeerTalk
+ - Flipper-RSocket
+ - FlipperKit
+ - fmt
+ - libevent
+ - OpenSSL-Universal
+ - PromisesObjC
+ - PromisesSwift
+ - SocketRocket
+ - YogaKit
+
+EXTERNAL SOURCES:
+ boost:
+ :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
+ DoubleConversion:
+ :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"
+ RCT-Folly:
+ :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
+ RCTRequired:
+ :path: "../node_modules/react-native/Libraries/RCTRequired"
+ RCTTypeSafety:
+ :path: "../node_modules/react-native/Libraries/TypeSafety"
+ React:
+ :path: "../node_modules/react-native/"
+ React-callinvoker:
+ :path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Codegen:
+ :path: build/generated/ios
+ React-Core:
+ :path: "../node_modules/react-native/"
+ React-CoreModules:
+ :path: "../node_modules/react-native/React/CoreModules"
+ React-cxxreact:
+ :path: "../node_modules/react-native/ReactCommon/cxxreact"
+ React-Fabric:
+ :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-jsi:
+ :path: "../node_modules/react-native/ReactCommon/jsi"
+ React-jsiexecutor:
+ :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
+ React-jsinspector:
+ :path: "../node_modules/react-native/ReactCommon/jsinspector"
+ React-logger:
+ :path: "../node_modules/react-native/ReactCommon/logger"
+ react-native-video:
+ :path: "../../.."
+ React-perflogger:
+ :path: "../node_modules/react-native/ReactCommon/reactperflogger"
+ React-RCTActionSheet:
+ :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
+ React-RCTAnimation:
+ :path: "../node_modules/react-native/Libraries/NativeAnimation"
+ React-RCTAppDelegate:
+ :path: "../node_modules/react-native/Libraries/AppDelegate"
+ React-RCTBlob:
+ :path: "../node_modules/react-native/Libraries/Blob"
+ React-RCTFabric:
+ :path: "../node_modules/react-native/React"
+ React-RCTImage:
+ :path: "../node_modules/react-native/Libraries/Image"
+ React-RCTLinking:
+ :path: "../node_modules/react-native/Libraries/LinkingIOS"
+ React-RCTNetwork:
+ :path: "../node_modules/react-native/Libraries/Network"
+ React-RCTSettings:
+ :path: "../node_modules/react-native/Libraries/Settings"
+ React-RCTText:
+ :path: "../node_modules/react-native/Libraries/Text"
+ React-RCTVibration:
+ :path: "../node_modules/react-native/Libraries/Vibration"
+ React-rncore:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-runtimeexecutor:
+ :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
+ ReactCommon:
+ :path: "../node_modules/react-native/ReactCommon"
+ Yoga:
+ :path: "../node_modules/react-native/ReactCommon/yoga"
+
+SPEC CHECKSUMS:
+ boost: 57d2868c099736d80fcd648bf211b4431e51a558
+ CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
+ DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
+ FBLazyVector: a89a0525bc7ca174675045c2b492b5280d5a2470
+ FBReactNativeSpec: 3978f6ab2d9917e8a7bf91411f03091a7ce1bef7
+ Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0
+ Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
+ Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30
+ Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b
+ Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3
+ Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446
+ Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
+ Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
+ FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86
+ fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
+ glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
+ hermes-engine: 4438d2b8bf8bebaba1b1ac0451160bab59e491f8
+ libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
+ OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
+ PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
+ PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
+ RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
+ RCTRequired: 5a4a30ac20c86eeadd6844a9328f78d4168cf9b2
+ RCTTypeSafety: 279fc5861a89f0f37db3a585f27f971485b4b734
+ React: 88307a9be3bd0e71a6822271cf28b84a587fb97f
+ React-callinvoker: 35fb980c454104ebe82f0afb9826830089248e08
+ React-Codegen: 5870fe93f28a64af7d78a7e79b5e94b61d7f996d
+ React-Core: 385cb6fa78762c6409ff39faeb0dd9ad664b6e84
+ React-CoreModules: c2b7db313b04d9b71954ffd55d0c2e46bc40e9fb
+ React-cxxreact: 845fefb889132e5d004ff818f7a599e32c52e7d6
+ React-Fabric: 9c9bc6f7459594b24d7288d1388e91b1b109b22d
+ React-graphics: a7e870a0b7394a1310f8ec90d17fa26652b294c4
+ React-hermes: 86135f35e1dd2dfccfb97afe96d0c06f6a3970c4
+ React-jsi: 39c116aa6c3d6f3d9874eff6998a670b47882a28
+ React-jsiexecutor: eaa5f71eb8f6861cf0e57f1a0f52aeb020d9e18e
+ React-jsinspector: 9885f6f94d231b95a739ef7bb50536fb87ce7539
+ React-logger: 3f8ebad1be1bf3299d1ab6d7f971802d7395c7ef
+ react-native-video: ae93a76caaf2f1f7f8d477aa2d431ac9b7101d2f
+ React-perflogger: 2d505bbe298e3b7bacdd9e542b15535be07220f6
+ React-RCTActionSheet: 0e96e4560bd733c9b37efbf68f5b1a47615892fb
+ React-RCTAnimation: fd138e26f120371c87e406745a27535e2c8a04ef
+ React-RCTAppDelegate: fe3201d79f34c68dd1ef2b18a8bd4ab92d8853a3
+ React-RCTBlob: 38a7185f06a0ce8153a023e63b406a28d67b955d
+ React-RCTFabric: 0beb3c1828e88c853b262636d5739920e70c0c22
+ React-RCTImage: 92b0966e7c1cadda889e961c474397ad5180e194
+ React-RCTLinking: b80f8d0c6e94c54294b0048def51f57eaa9a27af
+ React-RCTNetwork: 491b0c65ac22edbd6695d12d084b4943103b009b
+ React-RCTSettings: 97af3e8abe0023349ec015910df3bda1a0380117
+ React-RCTText: 33c85753bd714d527d2ae538dc56ec24c6783d84
+ React-RCTVibration: 08f132cad9896458776f37c112e71d60aef1c6ae
+ React-rncore: f60e5973fbf1682cc57380ea9b0fe81280e5033b
+ React-runtimeexecutor: c5c89f8f543842dd864b63ded1b0bbb9c9445328
+ ReactCommon: dbfbe2f7f3c5ce4ce44f43f2fd0d5950d1eb67c5
+ SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
+ Yoga: d56980c8914db0b51692f55533409e844b66133c
+ YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
+
+PODFILE CHECKSUM: 70e65545648f51beaebc6d3e45f6b8fff010307a
+
+COCOAPODS: 1.12.0
diff --git a/examples/FabricExample/ios/_xcode.env b/examples/FabricExample/ios/_xcode.env
new file mode 100644
index 0000000000..3d5782c715
--- /dev/null
+++ b/examples/FabricExample/ios/_xcode.env
@@ -0,0 +1,11 @@
+# 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/metro.config.js b/examples/FabricExample/metro.config.js
new file mode 100644
index 0000000000..46475fb308
--- /dev/null
+++ b/examples/FabricExample/metro.config.js
@@ -0,0 +1,40 @@
+const path = require('path');
+const escape = require('escape-string-regexp');
+const exclusionList = require('metro-config/src/defaults/exclusionList');
+const pak = require('../../package.json');
+
+const root = path.resolve(__dirname, '../../');
+
+const modules = Object.keys({
+ ...pak.peerDependencies,
+});
+
+module.exports = {
+ 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,
+ },
+ }),
+ },
+};
diff --git a/examples/FabricExample/package.json b/examples/FabricExample/package.json
new file mode 100644
index 0000000000..bf71121a48
--- /dev/null
+++ b/examples/FabricExample/package.json
@@ -0,0 +1,47 @@
+{
+ "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"
+ },
+ "dependencies": {
+ "axios": "^1.4.0",
+ "react": "18.1.0",
+ "react-native": "^0.71.6"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.9",
+ "@babel/runtime": "^7.12.5",
+ "@react-native-community/eslint-config": "^2.0.0",
+ "@tsconfig/react-native": "^2.0.2",
+ "@types/jest": "^26.0.23",
+ "@types/react": "^18.0.21",
+ "@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": "^26.6.3",
+ "babel-plugin-module-resolver": "^5.0.0",
+ "eslint": "^7.32.0",
+ "jest": "^26.6.3",
+ "metro-react-native-babel-preset": "0.72.3",
+ "react-test-renderer": "18.1.0",
+ "typescript": "^4.8.3"
+ },
+ "jest": {
+ "preset": "react-native",
+ "moduleFileExtensions": [
+ "ts",
+ "tsx",
+ "js",
+ "jsx",
+ "json",
+ "node"
+ ]
+ }
+}
diff --git a/examples/FabricExample/react-native.config.js b/examples/FabricExample/react-native.config.js
new file mode 100644
index 0000000000..48ddfba3b8
--- /dev/null
+++ b/examples/FabricExample/react-native.config.js
@@ -0,0 +1,10 @@
+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
new file mode 100644
index 0000000000..5ec1bc304f
--- /dev/null
+++ b/examples/FabricExample/src/VideoPlayer.tsx
@@ -0,0 +1,538 @@
+'use strict';
+import React, {Component, createRef} from 'react';
+
+import {
+ Alert,
+ GestureResponderEvent,
+ Platform,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View,
+} from 'react-native';
+
+import Video, {FilterType, VideoRef} from 'react-native-video';
+
+const filterTypes = [
+ FilterType.NONE,
+ FilterType.INVERT,
+ FilterType.MONOCHROME,
+ FilterType.POSTERIZE,
+ FilterType.FALSE,
+ FilterType.MAXIMUMCOMPONENT,
+ FilterType.MINIMUMCOMPONENT,
+ FilterType.CHROME,
+ FilterType.FADE,
+ FilterType.INSTANT,
+ FilterType.MONO,
+ FilterType.NOIR,
+ FilterType.PROCESS,
+ FilterType.TONAL,
+ FilterType.TRANSFER,
+ FilterType.SEPIA,
+];
+
+class VideoPlayer extends Component {
+ controlRef: React.RefObject;
+ videoRef: React.RefObject;
+ constructor(props: any) {
+ super(props);
+ this.onLoad = this.onLoad.bind(this);
+ this.onProgress = this.onProgress.bind(this);
+ this.onBuffer = this.onBuffer.bind(this);
+ this.onTouchControl = this.onTouchControl.bind(this);
+ this.controlRef = createRef();
+ this.videoRef = createRef();
+ }
+ state = {
+ rate: 1,
+ volume: 1,
+ muted: false,
+ resizeMode: 'contain',
+ duration: 0.0,
+ currentTime: 0.0,
+ controls: false,
+ paused: true,
+ skin: 'custom',
+ ignoreSilentSwitch: null,
+ mixWithOthers: null,
+ isBuffering: false,
+ filter: FilterType.NONE,
+ filterEnabled: true,
+ };
+
+ onLoad(data: any) {
+ console.log('On load fired!');
+ console.log(data.duration);
+ this.setState({duration: data.duration});
+ }
+
+ onProgress(data: any) {
+ this.setState({currentTime: data.currentTime});
+ }
+
+ onBuffer({isBuffering}: {isBuffering: boolean}) {
+ this.setState({isBuffering});
+ }
+
+ onTouchControl(e: GestureResponderEvent) {
+ if (!this.controlRef.current || !this.videoRef.current) return;
+ const videoCommands = this.videoRef.current;
+ const touchX = e.nativeEvent.pageX;
+ const duration = this.state.duration;
+
+ this.controlRef.current.measureInWindow((x, y, width, height) => {
+ const relativeX = touchX - x;
+ const nextTime = (relativeX / width) * duration;
+ videoCommands.seek(nextTime);
+ });
+ }
+
+ getCurrentTimePercentage() {
+ if (this.state.currentTime > 0 && this.state.duration !== 0) {
+ return this.state.currentTime / this.state.duration;
+ } else {
+ return 0;
+ }
+ }
+
+ setFilter(step: number) {
+ let index = filterTypes.indexOf(this.state.filter) + step;
+
+ if (index === filterTypes.length) {
+ index = 0;
+ } else if (index === -1) {
+ index = filterTypes.length - 1;
+ }
+
+ this.setState({
+ filter: filterTypes[index],
+ });
+ }
+
+ renderSkinControl(skin) {
+ const isSelected = this.state.skin == skin;
+ const selectControls = skin == 'native' || skin == 'embed';
+ return (
+ {
+ this.setState({
+ controls: selectControls,
+ skin: skin,
+ });
+ }}>
+
+ {skin}
+
+
+ );
+ }
+
+ renderRateControl(rate: number) {
+ const isSelected = this.state.rate == rate;
+
+ return (
+ {
+ this.setState({rate: rate});
+ }}>
+
+ {rate}x
+
+
+ );
+ }
+
+ renderResizeModeControl(resizeMode: string) {
+ const isSelected = this.state.resizeMode == resizeMode;
+
+ return (
+ {
+ this.setState({resizeMode: resizeMode});
+ }}>
+
+ {resizeMode}
+
+
+ );
+ }
+
+ renderVolumeControl(volume: number) {
+ const isSelected = this.state.volume == volume;
+
+ return (
+ {
+ this.setState({volume: volume});
+ }}>
+
+ {volume * 100}%
+
+
+ );
+ }
+
+ renderIgnoreSilentSwitchControl(ignoreSilentSwitch: string) {
+ const isSelected = this.state.ignoreSilentSwitch == ignoreSilentSwitch;
+
+ return (
+ {
+ this.setState({ignoreSilentSwitch: ignoreSilentSwitch});
+ }}>
+
+ {ignoreSilentSwitch}
+
+
+ );
+ }
+
+ renderMixWithOthersControl(mixWithOthers: string) {
+ const isSelected = this.state.mixWithOthers == mixWithOthers;
+
+ return (
+ {
+ this.setState({mixWithOthers: mixWithOthers});
+ }}>
+
+ {mixWithOthers}
+
+
+ );
+ }
+
+ renderCustomSkin() {
+ const flexCompleted = this.getCurrentTimePercentage() * 100;
+ const flexRemaining = (1 - this.getCurrentTimePercentage()) * 100;
+
+ return (
+
+ {
+ this.setState({paused: !this.state.paused});
+ }}>
+
+
+
+
+
+ {this.renderSkinControl('custom')}
+ {this.renderSkinControl('native')}
+ {this.renderSkinControl('embed')}
+
+ {this.state.filterEnabled ? (
+
+ {
+ this.setFilter(-1);
+ }}>
+ Previous Filter
+
+ {
+ this.setFilter(1);
+ }}>
+ Next Filter
+
+
+ ) : null}
+
+
+
+ {this.renderRateControl(0.5)}
+ {this.renderRateControl(1.0)}
+ {this.renderRateControl(2.0)}
+
+
+
+ {this.renderVolumeControl(0.5)}
+ {this.renderVolumeControl(1)}
+ {this.renderVolumeControl(1.5)}
+
+
+
+ {this.renderResizeModeControl('cover')}
+ {this.renderResizeModeControl('contain')}
+ {this.renderResizeModeControl('stretch')}
+
+
+
+ {Platform.OS === 'ios' ? (
+ <>
+
+ {this.renderIgnoreSilentSwitchControl('ignore')}
+ {this.renderIgnoreSilentSwitchControl('obey')}
+
+
+ {this.renderMixWithOthersControl('mix')}
+ {this.renderMixWithOthersControl('duck')}
+
+ >
+ ) : null}
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ renderNativeSkin() {
+ const videoStyle =
+ this.state.skin == 'embed'
+ ? styles.nativeVideoControls
+ : styles.fullScreen;
+ return (
+
+
+
+
+
+
+ {this.renderSkinControl('custom')}
+ {this.renderSkinControl('native')}
+ {this.renderSkinControl('embed')}
+
+ {this.state.filterEnabled ? (
+
+ {
+ this.setFilter(-1);
+ }}>
+ Previous Filter
+
+ {
+ this.setFilter(1);
+ }}>
+ Next Filter
+
+
+ ) : null}
+
+
+
+ {this.renderRateControl(0.5)}
+ {this.renderRateControl(1.0)}
+ {this.renderRateControl(2.0)}
+
+
+
+ {this.renderVolumeControl(0.5)}
+ {this.renderVolumeControl(1)}
+ {this.renderVolumeControl(1.5)}
+
+
+
+ {this.renderResizeModeControl('cover')}
+ {this.renderResizeModeControl('contain')}
+ {this.renderResizeModeControl('stretch')}
+
+
+
+ {Platform.OS === 'ios' ? (
+ <>
+
+ {this.renderIgnoreSilentSwitchControl('ignore')}
+ {this.renderIgnoreSilentSwitchControl('obey')}
+
+
+ {this.renderMixWithOthersControl('mix')}
+ {this.renderMixWithOthersControl('duck')}
+
+ >
+ ) : null}
+
+
+
+ );
+ }
+
+ render() {
+ return this.state.controls
+ ? this.renderNativeSkin()
+ : this.renderCustomSkin();
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: 'black',
+ },
+ fullScreen: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ bottom: 0,
+ right: 0,
+ },
+ controls: {
+ backgroundColor: 'transparent',
+ borderRadius: 5,
+ position: 'absolute',
+ bottom: 44,
+ left: 4,
+ right: 4,
+ },
+ progress: {
+ flex: 1,
+ flexDirection: 'row',
+ borderRadius: 3,
+ overflow: 'hidden',
+ },
+ innerProgressCompleted: {
+ height: 20,
+ backgroundColor: '#cccccc',
+ },
+ innerProgressRemaining: {
+ height: 20,
+ backgroundColor: '#2C2C2C',
+ },
+ generalControls: {
+ flex: 1,
+ flexDirection: 'row',
+ overflow: 'hidden',
+ paddingBottom: 10,
+ },
+ skinControl: {
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+ rateControl: {
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+ volumeControl: {
+ flex: 1,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+ resizeModeControl: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ ignoreSilentSwitchControl: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ mixWithOthersControl: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ controlOption: {
+ alignSelf: 'center',
+ fontSize: 11,
+ color: 'white',
+ paddingLeft: 2,
+ paddingRight: 2,
+ lineHeight: 12,
+ },
+ nativeVideoControls: {
+ top: 184,
+ height: 300,
+ },
+ trackingControls: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+export default VideoPlayer;
diff --git a/examples/FabricExample/src/broadchurch.mp4 b/examples/FabricExample/src/broadchurch.mp4
new file mode 100644
index 0000000000..7a7a49495d
Binary files /dev/null and b/examples/FabricExample/src/broadchurch.mp4 differ
diff --git a/examples/FabricExample/tsconfig.json b/examples/FabricExample/tsconfig.json
new file mode 100644
index 0000000000..8d8813b5a0
--- /dev/null
+++ b/examples/FabricExample/tsconfig.json
@@ -0,0 +1,12 @@
+// prettier-ignore
+{
+ "extends": "@tsconfig/react-native/tsconfig.json", /* Recommended React Native TSConfig base */
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
+ "paths": {
+ "react-native-video": ["../../src/index.ts"]
+ },
+ /* Completeness */
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ }
+}
diff --git a/examples/basic/Gemfile.lock b/examples/basic/Gemfile.lock
new file mode 100644
index 0000000000..90d5e213e8
--- /dev/null
+++ b/examples/basic/Gemfile.lock
@@ -0,0 +1,100 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.6)
+ rexml
+ activesupport (6.1.7.2)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ zeitwerk (~> 2.3)
+ addressable (2.8.3)
+ public_suffix (>= 2.0.2, < 6.0)
+ algoliasearch (1.27.5)
+ httpclient (~> 2.8, >= 2.8.3)
+ json (>= 1.5.1)
+ atomos (0.1.3)
+ claide (1.1.0)
+ cocoapods (1.12.0)
+ addressable (~> 2.8)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.12.0)
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
+ cocoapods-downloader (>= 1.6.0, < 2.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.21.0, < 2.0)
+ cocoapods-core (1.12.0)
+ 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 (1.6.3)
+ 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.0)
+ escape (0.0.4)
+ ethon (0.16.0)
+ ffi (>= 1.15.0)
+ ffi (1.15.5)
+ 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.6.3)
+ minitest (5.13.0)
+ molinillo (0.8.0)
+ nanaimo (0.3.0)
+ nap (1.1.0)
+ netrc (0.11.0)
+ public_suffix (4.0.7)
+ rexml (3.2.5)
+ ruby-macho (2.5.1)
+ typhoeus (1.4.0)
+ ethon (>= 0.9.0)
+ tzinfo (2.0.5)
+ concurrent-ruby (~> 1.0)
+ xcodeproj (1.22.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.6)
+
+PLATFORMS
+ arm64-darwin-22
+
+DEPENDENCIES
+ cocoapods (~> 1.11, >= 1.11.2)
+
+RUBY VERSION
+ ruby 2.7.5p203
+
+BUNDLED WITH
+ 2.4.5
diff --git a/examples/basic/babel.config.js b/examples/basic/babel.config.js
index c5b2615385..17d2937152 100644
--- a/examples/basic/babel.config.js
+++ b/examples/basic/babel.config.js
@@ -1,14 +1,17 @@
+const path = require('path');
+const pak = require('../../package.json');
+
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
[
'module-resolver',
{
- extensions: ['.js', '.tsx', '.ts'],
+ extensions: ['.tsx', '.ts', '.js', '.json'],
root: ['./src'],
-
alias: {
src: './src',
+ [pak.name]: path.join(__dirname, '../../', pak.source),
},
},
],
diff --git a/examples/basic/ios/Podfile.lock b/examples/basic/ios/Podfile.lock
new file mode 100644
index 0000000000..52bbd1869e
--- /dev/null
+++ b/examples/basic/ios/Podfile.lock
@@ -0,0 +1,601 @@
+PODS:
+ - boost (1.76.0)
+ - CocoaAsyncSocket (7.6.5)
+ - DoubleConversion (1.1.6)
+ - FBLazyVector (0.70.6)
+ - FBReactNativeSpec (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.70.6)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Core (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - Flipper (0.125.0):
+ - Flipper-Folly (~> 2.6)
+ - Flipper-RSocket (~> 1.4)
+ - Flipper-Boost-iOSX (1.76.0.1.11)
+ - Flipper-DoubleConversion (3.2.0.1)
+ - Flipper-Fmt (7.1.7)
+ - Flipper-Folly (2.6.10):
+ - Flipper-Boost-iOSX
+ - Flipper-DoubleConversion
+ - Flipper-Fmt (= 7.1.7)
+ - Flipper-Glog
+ - libevent (~> 2.1.12)
+ - OpenSSL-Universal (= 1.1.1100)
+ - Flipper-Glog (0.5.0.5)
+ - Flipper-PeerTalk (0.0.4)
+ - Flipper-RSocket (1.4.3):
+ - Flipper-Folly (~> 2.6)
+ - FlipperKit (0.125.0):
+ - FlipperKit/Core (= 0.125.0)
+ - FlipperKit/Core (0.125.0):
+ - Flipper (~> 0.125.0)
+ - FlipperKit/CppBridge
+ - FlipperKit/FBCxxFollyDynamicConvert
+ - FlipperKit/FBDefines
+ - FlipperKit/FKPortForwarding
+ - SocketRocket (~> 0.6.0)
+ - FlipperKit/CppBridge (0.125.0):
+ - Flipper (~> 0.125.0)
+ - FlipperKit/FBCxxFollyDynamicConvert (0.125.0):
+ - Flipper-Folly (~> 2.6)
+ - FlipperKit/FBDefines (0.125.0)
+ - FlipperKit/FKPortForwarding (0.125.0):
+ - CocoaAsyncSocket (~> 7.6)
+ - Flipper-PeerTalk (~> 0.0.4)
+ - FlipperKit/FlipperKitHighlightOverlay (0.125.0)
+ - FlipperKit/FlipperKitLayoutHelpers (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutTextSearchable
+ - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutHelpers
+ - YogaKit (~> 1.18)
+ - FlipperKit/FlipperKitLayoutPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitHighlightOverlay
+ - FlipperKit/FlipperKitLayoutHelpers
+ - FlipperKit/FlipperKitLayoutIOSDescriptors
+ - FlipperKit/FlipperKitLayoutTextSearchable
+ - YogaKit (~> 1.18)
+ - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0)
+ - FlipperKit/FlipperKitNetworkPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitReactPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/SKIOSNetworkPlugin (0.125.0):
+ - FlipperKit/Core
+ - FlipperKit/FlipperKitNetworkPlugin
+ - fmt (6.2.1)
+ - glog (0.3.5)
+ - hermes-engine (0.70.6)
+ - libevent (2.1.12)
+ - OpenSSL-Universal (1.1.1100)
+ - PromisesObjC (2.2.0)
+ - PromisesSwift (2.2.0):
+ - PromisesObjC (= 2.2.0)
+ - RCT-Folly (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Default (= 2021.07.22.00)
+ - RCT-Folly/Default (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Futures (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - libevent
+ - RCTRequired (0.70.6)
+ - RCTTypeSafety (0.70.6):
+ - FBLazyVector (= 0.70.6)
+ - RCTRequired (= 0.70.6)
+ - React-Core (= 0.70.6)
+ - React (0.70.6):
+ - React-Core (= 0.70.6)
+ - React-Core/DevSupport (= 0.70.6)
+ - React-Core/RCTWebSocket (= 0.70.6)
+ - React-RCTActionSheet (= 0.70.6)
+ - React-RCTAnimation (= 0.70.6)
+ - React-RCTBlob (= 0.70.6)
+ - React-RCTImage (= 0.70.6)
+ - React-RCTLinking (= 0.70.6)
+ - React-RCTNetwork (= 0.70.6)
+ - React-RCTSettings (= 0.70.6)
+ - React-RCTText (= 0.70.6)
+ - React-RCTVibration (= 0.70.6)
+ - React-bridging (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsi (= 0.70.6)
+ - React-callinvoker (0.70.6)
+ - React-Codegen (0.70.6):
+ - FBReactNativeSpec (= 0.70.6)
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.70.6)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Core (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-Core (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.6)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/CoreModulesHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/Default (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/DevSupport (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.6)
+ - React-Core/RCTWebSocket (= 0.70.6)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-jsinspector (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTActionSheetHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTAnimationHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTBlobHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTImageHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTLinkingHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTNetworkHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTSettingsHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTTextHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTVibrationHeaders (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-Core/RCTWebSocket (0.70.6):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.70.6)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - Yoga
+ - React-CoreModules (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Codegen (= 0.70.6)
+ - React-Core/CoreModulesHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-RCTImage (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-cxxreact (0.70.6):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsinspector (= 0.70.6)
+ - React-logger (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - React-runtimeexecutor (= 0.70.6)
+ - React-hermes (0.70.6):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - RCT-Folly/Futures (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-jsiexecutor (= 0.70.6)
+ - React-jsinspector (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - React-jsi (0.70.6):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsi/Default (= 0.70.6)
+ - React-jsi/Default (0.70.6):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsiexecutor (0.70.6):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - React-jsinspector (0.70.6)
+ - React-logger (0.70.6):
+ - glog
+ - react-native-video (7.0.0-alpha.5):
+ - React-Core
+ - react-native-video/Video (= 7.0.0-alpha.5)
+ - react-native-video/Video (7.0.0-alpha.5):
+ - PromisesSwift
+ - React-Core
+ - React-perflogger (0.70.6)
+ - React-RCTActionSheet (0.70.6):
+ - React-Core/RCTActionSheetHeaders (= 0.70.6)
+ - React-RCTAnimation (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTAnimationHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTBlob (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTBlobHeaders (= 0.70.6)
+ - React-Core/RCTWebSocket (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-RCTNetwork (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTImage (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTImageHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-RCTNetwork (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTLinking (0.70.6):
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTLinkingHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTNetwork (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTNetworkHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTSettings (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.70.6)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTSettingsHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-RCTText (0.70.6):
+ - React-Core/RCTTextHeaders (= 0.70.6)
+ - React-RCTVibration (0.70.6):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.70.6)
+ - React-Core/RCTVibrationHeaders (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (= 0.70.6)
+ - React-runtimeexecutor (0.70.6):
+ - React-jsi (= 0.70.6)
+ - ReactCommon/turbomodule/core (0.70.6):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-bridging (= 0.70.6)
+ - React-callinvoker (= 0.70.6)
+ - React-Core (= 0.70.6)
+ - React-cxxreact (= 0.70.6)
+ - React-jsi (= 0.70.6)
+ - React-logger (= 0.70.6)
+ - React-perflogger (= 0.70.6)
+ - RNCPicker (1.16.8):
+ - React-Core
+ - SocketRocket (0.6.0)
+ - Yoga (1.14.0)
+ - YogaKit (1.18.1):
+ - Yoga (~> 1.14)
+
+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`)
+ - Flipper (= 0.125.0)
+ - Flipper-Boost-iOSX (= 1.76.0.1.11)
+ - Flipper-DoubleConversion (= 3.2.0.1)
+ - Flipper-Fmt (= 7.1.7)
+ - Flipper-Folly (= 2.6.10)
+ - Flipper-Glog (= 0.5.0.5)
+ - Flipper-PeerTalk (= 0.0.4)
+ - Flipper-RSocket (= 1.4.3)
+ - FlipperKit (= 0.125.0)
+ - FlipperKit/Core (= 0.125.0)
+ - FlipperKit/CppBridge (= 0.125.0)
+ - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0)
+ - FlipperKit/FBDefines (= 0.125.0)
+ - FlipperKit/FKPortForwarding (= 0.125.0)
+ - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0)
+ - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0)
+ - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitReactPlugin (= 0.125.0)
+ - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0)
+ - FlipperKit/SKIOSNetworkPlugin (= 0.125.0)
+ - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
+ - hermes-engine (from `../node_modules/react-native/sdks/hermes/hermes-engine.podspec`)
+ - libevent (~> 2.1.12)
+ - OpenSSL-Universal (= 1.1.1100)
+ - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
+ - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
+ - React (from `../node_modules/react-native/`)
+ - React-bridging (from `../node_modules/react-native/ReactCommon`)
+ - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Codegen (from `build/generated/ios`)
+ - React-Core (from `../node_modules/react-native/`)
+ - React-Core/DevSupport (from `../node_modules/react-native/`)
+ - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
+ - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
+ - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
+ - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
+ - 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`)
+ - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
+ - react-native-video (from `../../..`)
+ - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
+ - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
+ - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
+ - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
+ - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
+ - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
+ - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
+ - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
+ - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
+ - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
+ - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
+ - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - "RNCPicker (from `../node_modules/@react-native-picker/picker`)"
+ - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
+
+SPEC REPOS:
+ trunk:
+ - CocoaAsyncSocket
+ - Flipper
+ - Flipper-Boost-iOSX
+ - Flipper-DoubleConversion
+ - Flipper-Fmt
+ - Flipper-Folly
+ - Flipper-Glog
+ - Flipper-PeerTalk
+ - Flipper-RSocket
+ - FlipperKit
+ - fmt
+ - libevent
+ - OpenSSL-Universal
+ - PromisesObjC
+ - PromisesSwift
+ - SocketRocket
+ - YogaKit
+
+EXTERNAL SOURCES:
+ boost:
+ :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
+ DoubleConversion:
+ :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/hermes-engine.podspec"
+ RCT-Folly:
+ :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
+ RCTRequired:
+ :path: "../node_modules/react-native/Libraries/RCTRequired"
+ RCTTypeSafety:
+ :path: "../node_modules/react-native/Libraries/TypeSafety"
+ React:
+ :path: "../node_modules/react-native/"
+ React-bridging:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-callinvoker:
+ :path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Codegen:
+ :path: build/generated/ios
+ React-Core:
+ :path: "../node_modules/react-native/"
+ React-CoreModules:
+ :path: "../node_modules/react-native/React/CoreModules"
+ React-cxxreact:
+ :path: "../node_modules/react-native/ReactCommon/cxxreact"
+ React-hermes:
+ :path: "../node_modules/react-native/ReactCommon/hermes"
+ React-jsi:
+ :path: "../node_modules/react-native/ReactCommon/jsi"
+ React-jsiexecutor:
+ :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
+ React-jsinspector:
+ :path: "../node_modules/react-native/ReactCommon/jsinspector"
+ React-logger:
+ :path: "../node_modules/react-native/ReactCommon/logger"
+ react-native-video:
+ :path: "../../.."
+ React-perflogger:
+ :path: "../node_modules/react-native/ReactCommon/reactperflogger"
+ React-RCTActionSheet:
+ :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
+ React-RCTAnimation:
+ :path: "../node_modules/react-native/Libraries/NativeAnimation"
+ React-RCTBlob:
+ :path: "../node_modules/react-native/Libraries/Blob"
+ React-RCTImage:
+ :path: "../node_modules/react-native/Libraries/Image"
+ React-RCTLinking:
+ :path: "../node_modules/react-native/Libraries/LinkingIOS"
+ React-RCTNetwork:
+ :path: "../node_modules/react-native/Libraries/Network"
+ React-RCTSettings:
+ :path: "../node_modules/react-native/Libraries/Settings"
+ React-RCTText:
+ :path: "../node_modules/react-native/Libraries/Text"
+ React-RCTVibration:
+ :path: "../node_modules/react-native/Libraries/Vibration"
+ React-runtimeexecutor:
+ :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
+ ReactCommon:
+ :path: "../node_modules/react-native/ReactCommon"
+ RNCPicker:
+ :path: "../node_modules/@react-native-picker/picker"
+ Yoga:
+ :path: "../node_modules/react-native/ReactCommon/yoga"
+
+SPEC CHECKSUMS:
+ boost: a7c83b31436843459a1961bfd74b96033dc77234
+ CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
+ DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
+ FBLazyVector: 48289402952f4f7a4e235de70a9a590aa0b79ef4
+ FBReactNativeSpec: dd1186fd05255e3457baa2f4ca65e94c2cd1e3ac
+ Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0
+ Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
+ Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30
+ Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b
+ Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3
+ Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446
+ Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
+ Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
+ FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86
+ fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
+ glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
+ hermes-engine: 2af7b7a59128f250adfd86f15aa1d5a2ecd39995
+ libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
+ OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
+ PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
+ PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
+ RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
+ RCTRequired: e1866f61af7049eb3d8e08e8b133abd38bc1ca7a
+ RCTTypeSafety: 27c2ac1b00609a432ced1ae701247593f07f901e
+ React: bb3e06418d2cc48a84f9666a576c7b38e89cd7db
+ React-bridging: 572502ec59c9de30309afdc4932e278214288913
+ React-callinvoker: 6b708b79c69f3359d42f1abb4663f620dbd4dadf
+ React-Codegen: 74e1cd7cee692a8b983c18df3274b5e749de07c8
+ React-Core: b587d0a624f9611b0e032505f3d6f25e8daa2bee
+ React-CoreModules: c6ff48b985e7aa622e82ca51c2c353c7803eb04e
+ React-cxxreact: ade3d9e63c599afdead3c35f8a8bd12b3da6730b
+ React-hermes: ed09ae33512bbb8d31b2411778f3af1a2eb681a1
+ React-jsi: 5a3952e0c6d57460ad9ee2c905025b4c28f71087
+ React-jsiexecutor: b4a65947391c658450151275aa406f2b8263178f
+ React-jsinspector: 60769e5a0a6d4b32294a2456077f59d0266f9a8b
+ React-logger: 1623c216abaa88974afce404dc8f479406bbc3a0
+ react-native-video: cc60ba7d2d232af13f416ec0e0a8f722de6f2f1f
+ React-perflogger: 8c79399b0500a30ee8152d0f9f11beae7fc36595
+ React-RCTActionSheet: 7316773acabb374642b926c19aef1c115df5c466
+ React-RCTAnimation: 5341e288375451297057391227f691d9b2326c3d
+ React-RCTBlob: b0615fc2daf2b5684ade8fadcab659f16f6f0efa
+ React-RCTImage: 6487b9600f268ecedcaa86114d97954d31ad4750
+ React-RCTLinking: c8018ae9ebfefcec3839d690d4725f8d15e4e4b3
+ React-RCTNetwork: 8aa63578741e0fe1205c28d7d4b40dbfdabce8a8
+ React-RCTSettings: d00c15ad369cd62242a4dfcc6f277912b4a84ed3
+ React-RCTText: f532e5ca52681ecaecea452b3ad7a5b630f50d75
+ React-RCTVibration: c75ceef7aa60a33b2d5731ebe5800ddde40cefc4
+ React-runtimeexecutor: 15437b576139df27635400de0599d9844f1ab817
+ ReactCommon: 349be31adeecffc7986a0de875d7fb0dcf4e251c
+ RNCPicker: 0991c56da7815c0cf946d6f63cf920b25296e5f6
+ SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
+ Yoga: 99caf8d5ab45e9d637ee6e0174ec16fbbb01bcfc
+ YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
+
+PODFILE CHECKSUM: 00947c6516c41a956e96bcf92e4f9fa213f5b8d3
+
+COCOAPODS: 1.12.0
diff --git a/examples/basic/ios/videoplayer.xcodeproj/project.pbxproj b/examples/basic/ios/videoplayer.xcodeproj/project.pbxproj
index 57c5b1b7d4..e70b7d51c2 100644
--- a/examples/basic/ios/videoplayer.xcodeproj/project.pbxproj
+++ b/examples/basic/ios/videoplayer.xcodeproj/project.pbxproj
@@ -562,7 +562,7 @@
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
- "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -596,6 +596,7 @@
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
);
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
};
name = Debug;
@@ -633,7 +634,7 @@
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -659,6 +660,7 @@
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
);
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
diff --git a/examples/basic/ios/videoplayer.xcworkspace/contents.xcworkspacedata b/examples/basic/ios/videoplayer.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000..9da8ab0de8
--- /dev/null
+++ b/examples/basic/ios/videoplayer.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples/basic/metro.config.js b/examples/basic/metro.config.js
index fa377047dd..900747829e 100644
--- a/examples/basic/metro.config.js
+++ b/examples/basic/metro.config.js
@@ -1,24 +1,41 @@
-/**
- * Metro configuration for React Native
- * https://github.com/facebook/react-native
- *
- * @format
- */
const path = require('path');
-const blacklist = require('metro-config/src/defaults/exclusionList');
+const escape = require('escape-string-regexp');
+const exclusionList = require('metro-config/src/defaults/exclusionList');
+const pak = require('../../package.json');
+
+const root = path.resolve(__dirname, '../../');
+
+const modules = Object.keys({
+ ...pak.peerDependencies,
+});
module.exports = {
+ 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: blacklist([
- // This stops "react-native run-windows" from causing the metro server to crash if its already running
- new RegExp(
- `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`,
- ),
- // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip
- /.*\.ProjectImports\.zip/,
- /(.*\/react-native-video\/node_modules\/.*)$/,
- ]),
+ blacklistRE: exclusionList(
+ modules.map(
+ (m) =>
+ new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`)
+ ).concat(
+ [
+ new RegExp(
+ `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`
+ ),
+ /.*\.ProjectImports\.zip/,
+ ]
+ )
+ ),
+
+ extraNodeModules: modules.reduce((acc, name) => {
+ acc[name] = path.join(__dirname, 'node_modules', name);
+ return acc;
+ }, {}),
},
+
transformer: {
getTransformOptions: async () => ({
transform: {
diff --git a/examples/basic/package.json b/examples/basic/package.json
index 07e1e890af..4524d2a288 100644
--- a/examples/basic/package.json
+++ b/examples/basic/package.json
@@ -14,7 +14,6 @@
"@react-native-picker/picker": "^1.9.11",
"react": "18.1.0",
"react-native": "0.70.6",
- "react-native-video": "../..",
"react-native-windows": "0.63.41"
},
"devDependencies": {
diff --git a/examples/basic/react-native.config.js b/examples/basic/react-native.config.js
new file mode 100644
index 0000000000..48ddfba3b8
--- /dev/null
+++ b/examples/basic/react-native.config.js
@@ -0,0 +1,10 @@
+const path = require('path');
+const pak = require('../../package.json');
+
+module.exports = {
+ dependencies: {
+ [pak.name]: {
+ root: path.join(__dirname, '../../'),
+ },
+ },
+};
diff --git a/examples/basic/src/VideoPlayer.ios.tsx b/examples/basic/src/VideoPlayer.ios.tsx
index 740251047a..08a72220a2 100644
--- a/examples/basic/src/VideoPlayer.ios.tsx
+++ b/examples/basic/src/VideoPlayer.ios.tsx
@@ -1,7 +1,5 @@
'use strict';
-import React, {
- Component
-} from 'react';
+import React, {Component} from 'react';
import {
Alert,
@@ -12,25 +10,25 @@ import {
View,
} from 'react-native';
-import Video,{FilterType} from 'react-native-video';
+import Video, {FilterType} from 'react-native-video';
const filterTypes = [
- FilterType.NONE,
- FilterType.INVERT,
- FilterType.MONOCHROME,
- FilterType.POSTERIZE,
- FilterType.FALSE,
- FilterType.MAXIMUMCOMPONENT,
- FilterType.MINIMUMCOMPONENT,
- FilterType.CHROME,
- FilterType.FADE,
- FilterType.INSTANT,
- FilterType.MONO,
- FilterType.NOIR,
- FilterType.PROCESS,
- FilterType.TONAL,
- FilterType.TRANSFER,
- FilterType.SEPIA
+ FilterType.NONE,
+ FilterType.INVERT,
+ FilterType.MONOCHROME,
+ FilterType.POSTERIZE,
+ FilterType.FALSE,
+ FilterType.MAXIMUMCOMPONENT,
+ FilterType.MINIMUMCOMPONENT,
+ FilterType.CHROME,
+ FilterType.FADE,
+ FilterType.INSTANT,
+ FilterType.MONO,
+ FilterType.NOIR,
+ FilterType.PROCESS,
+ FilterType.TONAL,
+ FilterType.TRANSFER,
+ FilterType.SEPIA,
];
class VideoPlayer extends Component {
@@ -54,7 +52,7 @@ class VideoPlayer extends Component {
mixWithOthers: null,
isBuffering: false,
filter: FilterType.NONE,
- filterEnabled: true
+ filterEnabled: true,
};
onLoad(data: any) {
@@ -66,8 +64,8 @@ class VideoPlayer extends Component {
this.setState({currentTime: data.currentTime});
}
- onBuffer({ isBuffering }: { isBuffering: boolean }) {
- this.setState({ isBuffering });
+ onBuffer({isBuffering}: {isBuffering: boolean}) {
+ this.setState({isBuffering});
}
getCurrentTimePercentage() {
@@ -88,19 +86,28 @@ class VideoPlayer extends Component {
}
this.setState({
- filter: filterTypes[index]
- })
+ filter: filterTypes[index],
+ });
}
renderSkinControl(skin) {
const isSelected = this.state.skin == skin;
const selectControls = skin == 'native' || skin == 'embed';
return (
- { this.setState({
- controls: selectControls,
- skin: skin
- }) }}>
-
+ {
+ this.setState({
+ controls: selectControls,
+ skin: skin,
+ });
+ }}
+ >
+
{skin}
@@ -108,63 +115,108 @@ class VideoPlayer extends Component {
}
renderRateControl(rate: number) {
- const isSelected = (this.state.rate == rate);
+ const isSelected = this.state.rate == rate;
return (
- { this.setState({rate: rate}) }}>
-
+ {
+ this.setState({rate: rate});
+ }}
+ >
+
{rate}x
- )
+ );
}
renderResizeModeControl(resizeMode: string) {
- const isSelected = (this.state.resizeMode == resizeMode);
+ const isSelected = this.state.resizeMode == resizeMode;
return (
- { this.setState({resizeMode: resizeMode}) }}>
-
+ {
+ this.setState({resizeMode: resizeMode});
+ }}
+ >
+
{resizeMode}
- )
+ );
}
renderVolumeControl(volume: number) {
- const isSelected = (this.state.volume == volume);
+ const isSelected = this.state.volume == volume;
return (
- { this.setState({volume: volume}) }}>
-
+ {
+ this.setState({volume: volume});
+ }}
+ >
+
{volume * 100}%
- )
+ );
}
renderIgnoreSilentSwitchControl(ignoreSilentSwitch: string) {
- const isSelected = (this.state.ignoreSilentSwitch == ignoreSilentSwitch);
+ const isSelected = this.state.ignoreSilentSwitch == ignoreSilentSwitch;
return (
- { this.setState({ignoreSilentSwitch: ignoreSilentSwitch}) }}>
-
+ {
+ this.setState({ignoreSilentSwitch: ignoreSilentSwitch});
+ }}
+ >
+
{ignoreSilentSwitch}
- )
+ );
}
renderMixWithOthersControl(mixWithOthers: string) {
- const isSelected = (this.state.mixWithOthers == mixWithOthers);
+ const isSelected = this.state.mixWithOthers == mixWithOthers;
return (
- { this.setState({mixWithOthers: mixWithOthers}) }}>
-
+ {
+ this.setState({mixWithOthers: mixWithOthers});
+ }}
+ >
+
{mixWithOthers}
- )
+ );
}
renderCustomSkin() {
@@ -173,7 +225,12 @@ class VideoPlayer extends Component {
return (
- {this.setState({paused: !this.state.paused})}}>
+ {
+ this.setState({paused: !this.state.paused});
+ }}
+ >
- {
- (this.state.filterEnabled) ?
-
- {
- this.setFilter(-1)
- }}>
- Previous Filter
-
- {
- this.setFilter(1)
- }}>
- Next Filter
-
- : null
- }
+ {this.state.filterEnabled ? (
+
+ {
+ this.setFilter(-1);
+ }}
+ >
+ Previous Filter
+
+ {
+ this.setFilter(1);
+ }}
+ >
+ Next Filter
+
+
+ ) : null}
@@ -237,25 +299,28 @@ class VideoPlayer extends Component {
- {
- (Platform.OS === 'ios') ?
- <>
-
- {this.renderIgnoreSilentSwitchControl('ignore')}
- {this.renderIgnoreSilentSwitchControl('obey')}
-
-
- {this.renderMixWithOthersControl('mix')}
- {this.renderMixWithOthersControl('duck')}
-
- > : null
- }
+ {Platform.OS === 'ios' ? (
+ <>
+
+ {this.renderIgnoreSilentSwitchControl('ignore')}
+ {this.renderIgnoreSilentSwitchControl('obey')}
+
+
+ {this.renderMixWithOthersControl('mix')}
+ {this.renderMixWithOthersControl('duck')}
+
+ >
+ ) : null}
-
-
+
+
@@ -264,7 +329,10 @@ class VideoPlayer extends Component {
}
renderNativeSkin() {
- const videoStyle = this.state.skin == 'embed' ? styles.nativeVideoControls : styles.fullScreen;
+ const videoStyle =
+ this.state.skin == 'embed'
+ ? styles.nativeVideoControls
+ : styles.fullScreen;
return (
@@ -281,7 +349,9 @@ class VideoPlayer extends Component {
onLoad={this.onLoad}
onBuffer={this.onBuffer}
onProgress={this.onProgress}
- onEnd={() => { Alert.alert('Done!') }}
+ onEnd={() => {
+ Alert.alert('Done!');
+ }}
repeat={true}
controls={this.state.controls}
filter={this.state.filter}
@@ -295,21 +365,24 @@ class VideoPlayer extends Component {
{this.renderSkinControl('native')}
{this.renderSkinControl('embed')}
- {
- (this.state.filterEnabled) ?
-
- {
- this.setFilter(-1)
- }}>
- Previous Filter
-
- {
- this.setFilter(1)
- }}>
- Next Filter
-
- : null
- }
+ {this.state.filterEnabled ? (
+
+ {
+ this.setFilter(-1);
+ }}
+ >
+ Previous Filter
+
+ {
+ this.setFilter(1);
+ }}
+ >
+ Next Filter
+
+
+ ) : null}
@@ -331,28 +404,28 @@ class VideoPlayer extends Component {
- {
- (Platform.OS === 'ios') ?
- <>
-
- {this.renderIgnoreSilentSwitchControl('ignore')}
- {this.renderIgnoreSilentSwitchControl('obey')}
-
-
- {this.renderMixWithOthersControl('mix')}
- {this.renderMixWithOthersControl('duck')}
-
- > : null
- }
+ {Platform.OS === 'ios' ? (
+ <>
+
+ {this.renderIgnoreSilentSwitchControl('ignore')}
+ {this.renderIgnoreSilentSwitchControl('obey')}
+
+
+ {this.renderMixWithOthersControl('mix')}
+ {this.renderMixWithOthersControl('duck')}
+
+ >
+ ) : null}
-
);
}
render() {
- return this.state.controls ? this.renderNativeSkin() : this.renderCustomSkin();
+ return this.state.controls
+ ? this.renderNativeSkin()
+ : this.renderCustomSkin();
}
}
@@ -371,7 +444,7 @@ const styles = StyleSheet.create({
right: 0,
},
controls: {
- backgroundColor: "transparent",
+ backgroundColor: 'transparent',
borderRadius: 5,
position: 'absolute',
bottom: 44,
@@ -417,24 +490,24 @@ const styles = StyleSheet.create({
flex: 1,
flexDirection: 'row',
alignItems: 'center',
- justifyContent: 'center'
+ justifyContent: 'center',
},
ignoreSilentSwitchControl: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
- justifyContent: 'center'
+ justifyContent: 'center',
},
mixWithOthersControl: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
- justifyContent: 'center'
+ justifyContent: 'center',
},
controlOption: {
alignSelf: 'center',
fontSize: 11,
- color: "white",
+ color: 'white',
paddingLeft: 2,
paddingRight: 2,
lineHeight: 12,
@@ -450,4 +523,4 @@ const styles = StyleSheet.create({
justifyContent: 'center',
},
});
-export default VideoPlayer
\ No newline at end of file
+export default VideoPlayer;
diff --git a/examples/basic/tsconfig.json b/examples/basic/tsconfig.json
index a415e49cc6..99ef1dafe1 100644
--- a/examples/basic/tsconfig.json
+++ b/examples/basic/tsconfig.json
@@ -9,7 +9,10 @@
"moduleResolution": "node",
"noEmit": true,
"strict": true,
- "target": "esnext"
+ "target": "esnext",
+ "paths": {
+ "react-native-video": ["../../src/index.ts"]
+ }
},
"exclude": [
"node_modules",
diff --git a/examples/basic/yarn.lock b/examples/basic/yarn.lock
index b382280213..a6d3fd171c 100644
--- a/examples/basic/yarn.lock
+++ b/examples/basic/yarn.lock
@@ -1292,11 +1292,6 @@
resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e"
integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==
-"@react-native/normalize-color@*":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91"
- integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==
-
"@react-native/normalize-color@2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567"
@@ -2664,15 +2659,6 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-deprecated-react-native-prop-types@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz#c10c6ee75ff2b6de94bb127f142b814e6e08d9ab"
- integrity sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA==
- dependencies:
- "@react-native/normalize-color" "*"
- invariant "*"
- prop-types "*"
-
destroy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
@@ -3803,7 +3789,7 @@ interpret@^1.0.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
-invariant@*, invariant@^2.2.4:
+invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -4718,11 +4704,6 @@ jsonfile@^4.0.0:
array-includes "^3.1.5"
object.assign "^4.1.3"
-keymirror@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35"
- integrity sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==
-
kind-of@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
@@ -5923,7 +5904,7 @@ prompts@^2.0.1, prompts@^2.4.0:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@*, prop-types@^15.7.2, prop-types@^15.8.1:
+prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -6011,13 +5992,6 @@ react-native-gradle-plugin@^0.70.3:
resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz#cbcf0619cbfbddaa9128701aa2d7b4145f9c4fc8"
integrity sha512-oOanj84fJEXUg9FoEAQomA8ISG+DVIrTZ3qF7m69VQUJyOGYyDZmPqKcjvRku4KXlEH6hWO9i4ACLzNBh8gC0A==
-react-native-video@../..:
- version "6.0.0-alpha.4"
- dependencies:
- deprecated-react-native-prop-types "^2.2.0"
- keymirror "^0.1.1"
- prop-types "^15.7.2"
-
react-native-windows@0.63.41:
version "0.63.41"
resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.63.41.tgz#96f59bc24749b6c167cb4f35fd74b66f78f4a4bb"
diff --git a/ios/Fabric/Video/RCTVideo.h b/ios/Fabric/Video/RCTVideo.h
new file mode 100644
index 0000000000..5e9561c2cf
--- /dev/null
+++ b/ios/Fabric/Video/RCTVideo.h
@@ -0,0 +1,110 @@
+#import
+#import "AVKit/AVKit.h"
+#import "UIView+FindUIViewController.h"
+#import "RCTVideoPlayerViewController.h"
+#import "RCTVideoPlayerViewControllerDelegate.h"
+#import
+#import
+
+#if __has_include()
+#import
+#import
+#import
+#endif
+
+# pragma mark - video event delegate
+
+@protocol RCTVideoEventDelegate
+- (void)onVideoProgressWithCurrentTime:(NSNumber *)currentTime
+ playableDuration:(NSNumber *)playableDuration
+ seekableDuration:(NSNumber *)seekableDuration;
+- (void)onVideoLoadWithCurrentTime:(NSNumber *)currentTime duration:(NSNumber *)duration naturalSize:(NSDictionary *)naturalSize;
+- (void)onVideoLoadStartWithIsNetwork:(BOOL)isNetwork type:(NSString *)type uri:(NSString *)uri;
+- (void)onVideoBufferWithIsBuffering:(BOOL)isBuffering;
+- (void)onVideoErrorWithError:(NSDictionary *)error;
+- (void)onGetLicenseWithLicenseUrl:(NSString *)licenseUrl contentId:(NSString*)contentId spcBase64:(NSString *)spcBase64;
+- (void)onVideoSeekWithCurrentTime:(NSNumber *)currentTime seekTime:(NSNumber *)seekTime finished:(BOOL)finished;
+- (void)onVideoEnd;
+- (void)onTimedMetadata;
+- (void)onVideoAudioBecomingNoisy;
+- (void)onVideoFullscreenPlayerWillPresent;
+- (void)onVideoFullscreenPlayerDidPresent;
+- (void)onVideoFullscreenPlayerWillDismiss;
+- (void)onVideoFullscreenPlayerDidDismiss;
+- (void)onReadyForDisplay;
+- (void)onRestoreUserInterfaceForPictureInPictureStop;
+- (void)onPictureInPictureStatusChangedWithIsActive:(BOOL)isActive;
+- (void)onPlaybackRateChangeWithPlaybackRate:(NSNumber *)playbackRate;
+- (void)onVideoExternalPlaybackChangeWithIsExternalPlaybackActive:(BOOL)isExternalPlaybackActive;
+- (void)onReceiveAdEventWithEvent:(NSString *)event;
+
+@end
+
+#if __has_include()
+@interface RCTVideo : UIView
+#elif TARGET_OS_TV
+@interface RCTVideo : UIView
+#else
+@interface RCTVideo : UIView
+#endif
+
+@property (nonatomic, weak) id _Nullable eventDelegate;
+
+typedef NS_ENUM(NSInteger, RCTVideoError) {
+ RCTVideoErrorFromJSPart,
+ RCTVideoErrorLicenseRequestNotOk,
+ RCTVideoErrorNoDataFromLicenseRequest,
+ RCTVideoErrorNoSPC,
+ RCTVideoErrorNoDataRequest,
+ RCTVideoErrorNoCertificateData,
+ RCTVideoErrorNoCertificateURL,
+ RCTVideoErrorNoFairplayDRM,
+ RCTVideoErrorNoDRMData
+};
+
+- (instancetype)initWithFrame:(CGRect)frame;
+
+- (AVPlayerViewController*)createPlayerViewController:(AVPlayer*)player withPlayerItem:(AVPlayerItem*)playerItem;
+
+# pragma mark - props
+
+- (void)setSrc:(NSDictionary *)source;
+- (void)setDrm:(NSDictionary *)drm;
+- (void)setResizeMode:(NSString *)resizeMode;
+- (void)setPaused:(BOOL)paused;
+- (void)setAdTagUrl:(NSString *)adTagUrl;
+- (void)setMaxBitRate:(float)maxBitRate;
+- (void)setRepeat:(BOOL)repeat;
+- (void)setAutomaticallyWaitsToMinimizeStalling:(BOOL)waits;
+- (void)setAllowsExternalPlayback:(BOOL)allowsExternalPlayback;
+- (void)setTextTracks:(NSArray *)textTracks;
+- (void)setSelectedTextTrack:(NSDictionary *)selectedTextTrack;
+- (void)setSelectedAudioTrack:(NSDictionary *)selectedAudioTrack;
+- (void)setMuted:(BOOL)muted;
+- (void)setControls:(BOOL)controls;
+- (void)setVolume:(float)volume;
+- (void)setPlayInBackground:(BOOL)playInBackground;
+- (void)setPreventsDisplaySleepDuringVideoPlayback:(BOOL)preventsDisplaySleepDuringVideoPlayback;
+- (void)setPreferredForwardBufferDuration:(float)preferredForwardBufferDuration;
+- (void)setPlayWhenInactive:(BOOL)playWhenInactive;
+- (void)setPictureInPicture:(BOOL)pictureInPicture;
+- (void)setIgnoreSilentSwitch:(NSString *)ignoreSilentSwitch;
+- (void)setMixWithOthers:(NSString *)mixWithOthers;
+- (void)setRate:(float)rate;
+- (void)setFullscreen:(BOOL)fullscreen;
+- (void)setFullscreenAutorotate:(BOOL)autorotate;
+- (void)setFullscreenOrientation:(NSString *)orientation;
+- (void)setFilter:(NSString *)filter;
+- (void)setFilterEnabled:(BOOL)filterEnabled;
+- (void)setProgressUpdateInterval:(float)progressUpdateInterval;
+- (void)setRestoreUserInterfaceForPIPStopCompletionHandler:(BOOL)restore;
+- (void)setLocalSourceEncryptionKeyScheme:(NSString *)keyScheme;
+
+
+# pragma mark - extern methods
+- (void)save:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
+- (void)setLicenseResult:(NSString * )license;
+- (BOOL)setLicenseResultError:(NSString * )error;
+- (void)seek:(NSDictionary *)info;
+
+@end
diff --git a/ios/Fabric/Video/RCTVideoPlayerViewController.h b/ios/Fabric/Video/RCTVideoPlayerViewController.h
new file mode 100644
index 0000000000..ed9ebdde09
--- /dev/null
+++ b/ios/Fabric/Video/RCTVideoPlayerViewController.h
@@ -0,0 +1,20 @@
+//
+// RCTVideoPlayerViewController.h
+// RCTVideo
+//
+// Created by Stanisław Chmiela on 31.03.2016.
+// Copyright © 2016 Facebook. All rights reserved.
+//
+
+#import
+#import "RCTVideo.h"
+#import "RCTVideoPlayerViewControllerDelegate.h"
+
+@interface RCTVideoPlayerViewController : AVPlayerViewController
+@property (nonatomic, weak) id rctDelegate;
+
+// Optional paramters
+@property (nonatomic, weak) NSString* preferredOrientation;
+@property (nonatomic) BOOL autorotate;
+
+@end
diff --git a/ios/Fabric/Video/RCTVideoPlayerViewControllerDelegate.h b/ios/Fabric/Video/RCTVideoPlayerViewControllerDelegate.h
new file mode 100644
index 0000000000..e84b3f525a
--- /dev/null
+++ b/ios/Fabric/Video/RCTVideoPlayerViewControllerDelegate.h
@@ -0,0 +1,7 @@
+#import
+#import "AVKit/AVKit.h"
+
+@protocol RCTVideoPlayerViewControllerDelegate
+- (void)videoPlayerViewControllerWillDismiss:(AVPlayerViewController *)playerViewController;
+- (void)videoPlayerViewControllerDidDismiss:(AVPlayerViewController *)playerViewController;
+@end
diff --git a/ios/Fabric/Video/RNCVideoComponentView.h b/ios/Fabric/Video/RNCVideoComponentView.h
new file mode 100644
index 0000000000..3e61cde7f7
--- /dev/null
+++ b/ios/Fabric/Video/RNCVideoComponentView.h
@@ -0,0 +1,18 @@
+// This guard prevent this file to be compiled in the old architecture.
+#ifdef RCT_NEW_ARCH_ENABLED
+#import
+#import
+#import "RCTVideo.h"
+
+#ifndef RNCVideoComponentView_h
+#define RNCVideoComponentView_h
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RNCVideoComponentView : RCTViewComponentView
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif /* RNCVideoComponentView_h */
+#endif /* RCT_NEW_ARCH_ENABLED */
diff --git a/ios/Fabric/Video/RNCVideoComponentView.mm b/ios/Fabric/Video/RNCVideoComponentView.mm
new file mode 100644
index 0000000000..55581abfc7
--- /dev/null
+++ b/ios/Fabric/Video/RNCVideoComponentView.mm
@@ -0,0 +1,471 @@
+#ifdef RCT_NEW_ARCH_ENABLED
+#import "RNCVideoComponentView.h"
+
+#import
+#import
+#import
+#import
+
+#import
+
+#import "RCTFabricComponentsPlugins.h"
+#import "RCTVideo.h"
+#import "RNCVideoStructComparer.h"
+#import "RNCVideoFabricConversions.h"
+
+using namespace facebook::react;
+
+@interface RNCVideoComponentView ()
+
+@end
+
+@implementation RNCVideoComponentView {
+ RCTVideo * _view;
+}
+
++ (ComponentDescriptorProvider)componentDescriptorProvider
+{
+ return concreteComponentDescriptorProvider();
+}
+
+# pragma mark - initWithFrame
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ if (self = [super initWithFrame:frame]) {
+ static const auto defaultProps = std::make_shared();
+ _props = defaultProps;
+
+ _view = [[RCTVideo alloc] initWithFrame: frame];
+ _view.eventDelegate = self;
+
+ self.contentView = _view;
+ }
+
+ return self;
+}
+
+# pragma mark - Life cycle
+
+- (void)prepareForRecycle {
+ [super prepareForRecycle];
+ static const auto defaultProps = std::make_shared();
+ _props = defaultProps;
+
+ _view = [[RCTVideo alloc] initWithFrame: self.bounds];
+ _view.eventDelegate = self;
+
+ self.contentView = _view;
+}
+
+# pragma mark - updateProps
+
+- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
+{
+ const auto &oldViewProps = *std::static_pointer_cast(_props);
+ const auto &newViewProps = *std::static_pointer_cast(props);
+
+ if (!isSrcStructEqual(oldViewProps.src, newViewProps.src)) {
+ NSDictionary *source = srcDictFromCppStruct(newViewProps.src);
+ [_view setSrc:source];
+ }
+
+ if (!isDrmStructEqual(oldViewProps.drm, newViewProps.drm)) {
+ NSDictionary *drm = drmDictFromCppStruct(newViewProps.drm);
+ [_view setDrm:drm];
+ }
+
+ if (oldViewProps.resizeMode != newViewProps.resizeMode) {
+ [_view setResizeMode:RCTNSStringFromStringNilIfEmpty(toString(newViewProps.resizeMode))];
+ }
+
+ if (oldViewProps.paused != newViewProps.paused) {
+ [_view setPaused:newViewProps.paused];
+ }
+
+ if (oldViewProps.adTagUrl != newViewProps.adTagUrl) {
+ [_view setAdTagUrl:RCTNSStringFromStringNilIfEmpty(newViewProps.adTagUrl)];
+ }
+
+ if (oldViewProps.maxBitRate != newViewProps.maxBitRate) {
+ [_view setMaxBitRate:newViewProps.maxBitRate];
+ }
+
+ if (oldViewProps.repeat != newViewProps.repeat) {
+ [_view setRepeat:newViewProps.repeat];
+ }
+
+ if (oldViewProps.automaticallyWaitsToMinimizeStalling != newViewProps.automaticallyWaitsToMinimizeStalling) {
+ [_view setAutomaticallyWaitsToMinimizeStalling:newViewProps.automaticallyWaitsToMinimizeStalling];
+ }
+
+ if (oldViewProps.allowsExternalPlayback != newViewProps.allowsExternalPlayback) {
+ [_view setAllowsExternalPlayback:newViewProps.allowsExternalPlayback];
+ }
+
+ if (!isTextTracksVectorEqual(oldViewProps.textTracks, newViewProps.textTracks)) {
+ [_view setTextTracks:textTracksArrayFromCppVector(newViewProps.textTracks)];
+ }
+
+ if (!isSelectedTextTrackStructEqual(oldViewProps.selectedTextTrack, newViewProps.selectedTextTrack)) {
+ [_view setSelectedTextTrack:selectedTextTrackDictFromCppStruct(newViewProps.selectedTextTrack)];
+ }
+
+ if (!isSelectedAudioTrackStructEqual(oldViewProps.selectedAudioTrack, newViewProps.selectedAudioTrack)) {
+ [_view setSelectedAudioTrack:selectedAudioTrackDictFromCppStruct(newViewProps.selectedAudioTrack)];
+ }
+
+ if (oldViewProps.muted != newViewProps.muted) {
+ [_view setMuted:newViewProps.muted];
+ }
+
+ if (oldViewProps.controls != newViewProps.controls) {
+ [_view setControls:newViewProps.controls];
+ }
+
+ if (oldViewProps.volume != newViewProps.volume) {
+ [_view setVolume:newViewProps.volume];
+ }
+
+ if (oldViewProps.playInBackground != newViewProps.playInBackground) {
+ [_view setPlayInBackground:newViewProps.playInBackground];
+ }
+
+ if (oldViewProps.preventsDisplaySleepDuringVideoPlayback != newViewProps.preventsDisplaySleepDuringVideoPlayback) {
+ [_view setPreventsDisplaySleepDuringVideoPlayback:newViewProps.preventsDisplaySleepDuringVideoPlayback];
+ }
+
+ if (oldViewProps.preferredForwardBufferDuration != newViewProps.preferredForwardBufferDuration) {
+ [_view setPreferredForwardBufferDuration:newViewProps.preferredForwardBufferDuration];
+ }
+
+ if (oldViewProps.playWhenInactive != newViewProps.playWhenInactive) {
+ [_view setPlayWhenInactive:newViewProps.playWhenInactive];
+ }
+
+ if (oldViewProps.pictureInPicture != newViewProps.pictureInPicture) {
+ [_view setPictureInPicture:newViewProps.pictureInPicture];
+ }
+
+ if (oldViewProps.ignoreSilentSwitch != newViewProps.ignoreSilentSwitch) {
+ [_view setIgnoreSilentSwitch:RCTNSStringFromStringNilIfEmpty(toString(newViewProps.ignoreSilentSwitch))];
+ }
+
+ if (oldViewProps.mixWithOthers != newViewProps.mixWithOthers) {
+ [_view setMixWithOthers:RCTNSStringFromStringNilIfEmpty(toString(newViewProps.mixWithOthers))];
+ }
+
+ if (oldViewProps.rate != newViewProps.rate) {
+ [_view setRate:newViewProps.rate];
+ }
+
+ if (oldViewProps.fullscreen != newViewProps.fullscreen) {
+ [_view setFullscreen:newViewProps.fullscreen];
+ }
+
+ if (oldViewProps.fullscreenAutorotate != newViewProps.fullscreenAutorotate) {
+ [_view setFullscreenAutorotate:newViewProps.fullscreenAutorotate];
+ }
+
+ if (oldViewProps.fullscreenOrientation != newViewProps.fullscreenOrientation) {
+ [_view setFullscreenOrientation:RCTNSStringFromStringNilIfEmpty(toString(newViewProps.fullscreenOrientation))];
+ }
+
+ if (oldViewProps.filter != newViewProps.filter) {
+ NSString *filter = RCTNSStringFromStringNilIfEmpty(toString(newViewProps.filter));
+ if (filter != nil && ![filter isEqualToString:@"None"]) {
+ [_view setFilter:filter];
+ }
+ }
+
+ if (oldViewProps.filterEnabled != newViewProps.filterEnabled) {
+ [_view setFilterEnabled:newViewProps.filterEnabled];
+ }
+
+ if (oldViewProps.progressUpdateInterval != newViewProps.progressUpdateInterval) {
+ [_view setProgressUpdateInterval:newViewProps.progressUpdateInterval];
+ }
+
+ if (oldViewProps.restoreUserInterfaceForPIPStopCompletionHandler != newViewProps.restoreUserInterfaceForPIPStopCompletionHandler) {
+ [_view setRestoreUserInterfaceForPIPStopCompletionHandler:newViewProps.restoreUserInterfaceForPIPStopCompletionHandler];
+ }
+
+ if (oldViewProps.localSourceEncryptionKeyScheme != newViewProps.localSourceEncryptionKeyScheme) {
+ [_view setLocalSourceEncryptionKeyScheme:RCTNSStringFromStringNilIfEmpty(newViewProps.localSourceEncryptionKeyScheme)];
+ }
+
+ [super updateProps:props oldProps:oldProps];
+}
+
+# pragma mark - methods
+
+- (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args {
+ RCTRNCVideoHandleCommand(self, commandName, args);
+}
+
+- (void)seek:(float)time tolerance:(float)tolerance {
+ NSMutableDictionary *info = @{
+ @"time": @(time),
+ @"tolerance": @(tolerance),
+ };
+
+ [_view seek:info];
+}
+
+- (void)setLicenseResult:(NSString *)result {
+ [_view setLicenseResult:result];
+}
+
+- (void)setLicenseResultError:(NSString *)error {
+ [_view setLicenseResultError:error];
+}
+
+# pragma mark - event
+
+- (void)onVideoProgressWithCurrentTime:(NSNumber *)currentTime playableDuration:(NSNumber *)playableDuration seekableDuration:(NSNumber *)seekableDuration
+{
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoProgress event = {
+ .currentTime = [currentTime floatValue],
+ .playableDuration = [playableDuration floatValue],
+ .seekableDuration = [seekableDuration floatValue]
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoProgress(event);
+}
+
+- (void)onVideoLoadWithCurrentTime:(NSNumber *)currentTime duration:(NSNumber *)duration naturalSize:(NSDictionary *)naturalSize {
+
+ if(!_eventEmitter) {
+ return;
+ }
+
+ NSNumber *width = naturalSize[@"width"] ?: @(0.0);
+ NSNumber *height = naturalSize[@"height"] ?: @(0.0);
+
+ RNCVideoEventEmitter::OnVideoLoadNaturalSize naturalSizeValue = {
+ .width = [width floatValue],
+ .height = [height floatValue],
+ .orientation = RCTStringFromNSString(naturalSize[@"orientation"])
+ };
+
+ RNCVideoEventEmitter::OnVideoLoad event = {
+ .currentTime = [currentTime floatValue],
+ .duration = [duration floatValue],
+ .naturalSize = naturalSizeValue
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoLoad(event);
+}
+
+- (void)onVideoLoadStartWithIsNetwork:(BOOL)isNetwork type:(NSString *)type uri:(NSString *)uri {
+
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoLoadStart event = {
+ .isNetwork = isNetwork,
+ .type = RCTStringFromNSString(type),
+ .uri = RCTStringFromNSString(uri)
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoLoadStart(event);
+}
+
+- (void)onVideoBufferWithIsBuffering:(BOOL)isBuffering {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnVideoBuffer event = {
+ .isBuffering = isBuffering
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoBuffer(event);
+}
+
+- (void)onVideoErrorWithError:(NSDictionary *)error {
+ if(!_eventEmitter) {
+ return;
+ }
+ NSData *errorJson = [NSJSONSerialization dataWithJSONObject:error options:NSJSONWritingPrettyPrinted error:nil];
+ NSString *jsonString = [[NSString alloc] initWithData:errorJson encoding:NSUTF8StringEncoding];
+
+ RNCVideoEventEmitter::OnVideoError event = {
+ .error = RCTStringFromNSString(jsonString),
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoError(event);
+}
+
+- (void)onGetLicenseWithLicenseUrl:(NSString *)licenseUrl contentId:(NSString*)contentId spcBase64:(NSString *)spcBase64 {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnGetLicense event = {
+ .licenseUrl = RCTStringFromNSString(licenseUrl),
+ .contentId = RCTStringFromNSString(contentId),
+ .spcBase64 = RCTStringFromNSString(spcBase64),
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onGetLicense(event);
+}
+
+- (void)onVideoSeekWithCurrentTime:(NSNumber *)currentTime seekTime:(NSNumber *)seekTime finished:(BOOL)finished {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoSeek event = {
+ .currentTime = [currentTime floatValue],
+ .seekTime = [seekTime floatValue],
+ .finished = finished
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoSeek(event);
+}
+
+- (void)onVideoEnd {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoEnd event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoEnd(event);
+}
+
+- (void)onTimedMetadata {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnTimedMetadata event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onTimedMetadata(event);
+}
+
+- (void)onVideoAudioBecomingNoisy {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoAudioBecomingNoisy event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoAudioBecomingNoisy(event);
+}
+
+- (void)onVideoFullscreenPlayerWillPresent {
+ if(!_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoFullscreenPlayerWillPresent event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoFullscreenPlayerWillPresent(event);
+}
+
+- (void)onVideoFullscreenPlayerDidPresent {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnVideoFullscreenPlayerDidPresent event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoFullscreenPlayerDidPresent(event);
+}
+
+- (void)onVideoFullscreenPlayerWillDismiss {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnVideoFullscreenPlayerWillDismiss event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoFullscreenPlayerWillDismiss(event);
+}
+
+- (void)onVideoFullscreenPlayerDidDismiss {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnVideoFullscreenPlayerDidDismiss event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoFullscreenPlayerDidDismiss(event);
+}
+
+- (void)onReadyForDisplay {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnReadyForDisplay event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onReadyForDisplay(event);
+}
+
+- (void)onRestoreUserInterfaceForPictureInPictureStop {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnRestoreUserInterfaceForPictureInPictureStop event = {};
+
+ std::dynamic_pointer_cast(_eventEmitter)->onRestoreUserInterfaceForPictureInPictureStop(event);
+}
+
+- (void)onPictureInPictureStatusChangedWithIsActive:(BOOL)isActive {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnPictureInPictureStatusChanged event = {
+ .isActive = isActive
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onPictureInPictureStatusChanged(event);
+}
+
+- (void)onPlaybackRateChangeWithPlaybackRate:(NSNumber *)playbackRate {
+ if(!_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnPlaybackRateChange event = {
+ .playbackRate = [playbackRate floatValue]
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onPlaybackRateChange(event);
+}
+
+- (void)onVideoExternalPlaybackChangeWithIsExternalPlaybackActive:(BOOL)isExternalPlaybackActive {
+ if(_eventEmitter) {
+ return;
+ }
+
+ RNCVideoEventEmitter::OnVideoExternalPlaybackChange event = {
+ .isExternalPlaybackActive = isExternalPlaybackActive
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onVideoExternalPlaybackChange(event);
+
+}
+
+- (void)onReceiveAdEventWithEvent:(NSString *)event {
+ if(_eventEmitter) {
+ return;
+ }
+ RNCVideoEventEmitter::OnReceiveAdEvent eventParam = {
+ .event = RCTStringFromNSString(event)
+ };
+
+ std::dynamic_pointer_cast(_eventEmitter)->onReceiveAdEvent(eventParam);
+}
+
+# pragma mark - RNCVideoCls
+
+Class RNCVideoCls(void)
+{
+ return RNCVideoComponentView.class;
+}
+
+@end
+#endif
diff --git a/ios/Fabric/Video/RNCVideoFabricConversions.h b/ios/Fabric/Video/RNCVideoFabricConversions.h
new file mode 100644
index 0000000000..63997eb2b4
--- /dev/null
+++ b/ios/Fabric/Video/RNCVideoFabricConversions.h
@@ -0,0 +1,106 @@
+#ifdef RCT_NEW_ARCH_ENABLED
+#import
+#import
+
+using namespace facebook::react;
+
+inline NSDictionary *srcDictFromCppStruct(const RNCVideoSrcStruct &src) {
+ NSString * uri = RCTNSStringFromStringNilIfEmpty(src.uri) ?: @"";
+ NSString * type = RCTNSStringFromStringNilIfEmpty(src.type) ?: @"";
+
+ return @{
+ @"uri": uri,
+ @"isNetwork": @(src.isNetwork),
+ @"isAsset": @(src.isAsset),
+ @"shouldCache": @(src.shouldCache),
+ @"type": type,
+ @"startTime": @(src.startTime),
+ @"endTime": @(src.endTime)
+ };
+}
+
+inline NSArray *drmHeadersFromCppVector(const std::vector &vector) {
+ NSMutableArray *drmHeaders = [NSMutableArray arrayWithCapacity:vector.size()];
+
+ for (const RNCVideoDrmHeadersStruct &header : vector) {
+ NSString *key = RCTNSStringFromString(header.key);
+ NSString *value = RCTNSStringFromString(header.value);
+
+ [drmHeaders addObject:@{
+ @"key": key,
+ @"value": value
+ }];
+ }
+
+ return drmHeaders;
+}
+
+inline NSDictionary *drmDictFromCppStruct(const RNCVideoDrmStruct &drm) {
+ NSArray *headers = drmHeadersFromCppVector(drm.headers);
+
+ return @{
+ @"drmType": RCTNSStringFromStringNilIfEmpty(toString(drm.drmType)) ?: @"",
+ @"headers": headers,
+ @"licenseServer": RCTNSStringFromStringNilIfEmpty(drm.licenseServer) ?: @"",
+ @"contentId": RCTNSStringFromStringNilIfEmpty(drm.contentId) ?: @"",
+ @"certificateUrl": RCTNSStringFromStringNilIfEmpty(drm.certificateUrl) ?: @"",
+ @"base64Certificate": @(drm.base64Certificate),
+ @"useExternalGetLicense": @(drm.useExternalGetLicense),
+ };
+}
+
+inline NSArray *textTracksArrayFromCppVector(const std::vector &vector) {
+ NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()];
+
+ for (const RNCVideoTextTracksStruct &textTrack : vector) {
+ NSDictionary *dict = @{
+ @"title": RCTNSStringFromStringNilIfEmpty(textTrack.title) ?: @"",
+ @"language": RCTNSStringFromStringNilIfEmpty(textTrack.language) ?: @"",
+ @"type": RCTNSStringFromStringNilIfEmpty(textTrack.type) ?: @"",
+ @"uri": RCTNSStringFromStringNilIfEmpty(textTrack.uri) ?: @"",
+ };
+
+ [array addObject:dict];
+ }
+ return array;
+}
+
+inline NSDictionary *selectedTextTrackDictFromCppStruct(const RNCVideoSelectedTextTrackStruct &textTrack) {
+ NSString *type = RCTNSStringFromString(toString(textTrack.selectedTextType));
+
+ if ([type isEqualToString:@"title"] || [type isEqualToString:@"language"]) {
+ return @{
+ @"selectedTextType": type,
+ @"value": RCTNSStringFromStringNilIfEmpty(textTrack.value) ?: @"",
+ };
+ } else if ([type isEqualToString:@"index"]) {
+ return @{
+ @"selectedTextType": type,
+ @"value": @(textTrack.index)
+ };
+ }
+ return @{
+ @"selectedTextType": type,
+ };
+}
+
+inline NSDictionary *selectedAudioTrackDictFromCppStruct(const RNCVideoSelectedAudioTrackStruct &audioTrack) {
+ NSString *type = RCTNSStringFromString(toString(audioTrack.selectedAudioType));
+
+ if ([type isEqualToString:@"title"] || [type isEqualToString:@"language"]) {
+ return @{
+ @"selectedAudioType": type,
+ @"value": RCTNSStringFromStringNilIfEmpty(audioTrack.value) ?: @"",
+ };
+ } else if ([type isEqualToString:@"index"]) {
+ return @{
+ @"selectedAudioType": type,
+ @"value": @(audioTrack.index)
+ };
+ }
+ return @{
+ @"selectedAudioType": type,
+ };
+}
+
+#endif
diff --git a/ios/Fabric/Video/RNCVideoStructComparer.h b/ios/Fabric/Video/RNCVideoStructComparer.h
new file mode 100644
index 0000000000..32ced727b4
--- /dev/null
+++ b/ios/Fabric/Video/RNCVideoStructComparer.h
@@ -0,0 +1,110 @@
+#ifdef RCT_NEW_ARCH_ENABLED
+#import
+
+using namespace facebook::react;
+
+inline bool isSrcHeadersEqual(const std::vector &prev, const std::vector &next) {
+ if (prev.size() != next.size()) return false;
+
+ auto comparator = [](const RNCVideoSrcRequestHeadersStruct &a, const RNCVideoSrcRequestHeadersStruct &b) {
+ return a.key < b.key;
+ };
+
+ std::vector header1 = prev;
+ std::vector header2 = next;
+
+ std::sort(header1.begin(), header1.end(), comparator);
+ std::sort(header2.begin(), header2.end(), comparator);
+
+ for (size_t i = 0; i < header1.size(); i++) {
+ if (header1[i].key != header2[i].key || header1[i].value != header2[i].value) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+inline bool isDrmHeadersEqual(const std::vector &prev, const std::vector &next) {
+ if (prev.size() != next.size()) return false;
+
+ auto comparator = [](const RNCVideoDrmHeadersStruct &a, const RNCVideoDrmHeadersStruct &b) {
+ return a.key < b.key;
+ };
+
+ std::vector header1 = prev;
+ std::vector header2 = next;
+
+ std::sort(header1.begin(), header1.end(), comparator);
+ std::sort(header2.begin(), header2.end(), comparator);
+
+ for (size_t i = 0; i < header1.size(); i++) {
+ if (header1[i].key != header2[i].key || header1[i].value != header2[i].value) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+inline bool isSrcStructEqual(const RNCVideoSrcStruct &prev, const RNCVideoSrcStruct &next) {
+ bool isEqualHeaders = isSrcHeadersEqual(prev.requestHeaders, next.requestHeaders);
+
+ return prev.uri == next.uri && prev.isNetwork == next.isNetwork && prev.isAsset == next.isAsset && prev.shouldCache == next.shouldCache && prev.type == next.type && isEqualHeaders;
+}
+
+inline bool isDrmStructEqual(const RNCVideoDrmStruct &prev, const RNCVideoDrmStruct &next) {
+ bool isEqualHeaders = isDrmHeadersEqual(prev.headers, next.headers);
+
+ return toString(prev.drmType) == toString(next.drmType) && prev.licenseServer == next.licenseServer && prev.contentId == next.contentId && prev.certificateUrl == next.certificateUrl && prev.base64Certificate == next.base64Certificate && prev.useExternalGetLicense == next.useExternalGetLicense && isEqualHeaders;
+}
+
+inline bool isTextTracksVectorEqual(const std::vector &prev, const std::vector &next) {
+ if (prev.size() != next.size())
+ {
+ return false;
+ }
+
+ auto comparator = [](const RNCVideoTextTracksStruct &a, const RNCVideoTextTracksStruct &b) {
+ if (a.title != b.title) {
+ return a.title < b.title;
+ }
+ if (a.language != b.language) {
+ return a.language < b.language;
+ }
+ if (a.type != b.type) {
+ return a.type < b.type;
+ }
+ return a.uri < b.uri;
+ };
+
+ std::vector sortedPrevTracks = prev;
+ std::sort(sortedPrevTracks.begin(), sortedPrevTracks.end(), comparator);
+ std::vector sortedNextTracks = next;
+ std::sort(sortedNextTracks.begin(), sortedNextTracks.end(), comparator);
+
+ for (int i = 0; i < sortedPrevTracks.size(); i++) {
+ const RNCVideoTextTracksStruct& prevTrack = sortedPrevTracks[i];
+ const RNCVideoTextTracksStruct& nextTrack = sortedNextTracks[i];
+
+ if (prevTrack.title != nextTrack.title ||
+ prevTrack.language != nextTrack.language ||
+ prevTrack.type != nextTrack.type ||
+ prevTrack.uri != nextTrack.uri) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+inline bool isSelectedTextTrackStructEqual(const RNCVideoSelectedTextTrackStruct &prev, const RNCVideoSelectedTextTrackStruct &next) {
+ return prev.selectedTextType == next.selectedTextType && prev.value == next.value && prev.index == next.index;
+}
+
+inline bool isSelectedAudioTrackStructEqual(const RNCVideoSelectedAudioTrackStruct &prev, const RNCVideoSelectedAudioTrackStruct &next) {
+ return prev.selectedAudioType == next.selectedAudioType && prev.value == next.value && prev.index == next.index;
+}
+
+
+#endif
diff --git a/ios/Fabric/Video/UIView+FindUIViewController.h b/ios/Fabric/Video/UIView+FindUIViewController.h
new file mode 100644
index 0000000000..09214261fa
--- /dev/null
+++ b/ios/Fabric/Video/UIView+FindUIViewController.h
@@ -0,0 +1,15 @@
+//
+// UIView+FindUIViewController.h
+// RCTVideo
+//
+// Created by Stanisław Chmiela on 31.03.2016.
+// Copyright © 2016 Facebook. All rights reserved.
+//
+// Source: http://stackoverflow.com/a/3732812/1123156
+
+#import
+
+@interface UIView (FindUIViewController)
+- (UIViewController *) firstAvailableUIViewController;
+- (id) traverseResponderChainForUIViewController;
+@end
diff --git a/ios/RCTVideo.xcodeproj/project.pbxproj b/ios/RCTVideo.xcodeproj/project.pbxproj
index 1665197d03..ff2cc2088a 100644
--- a/ios/RCTVideo.xcodeproj/project.pbxproj
+++ b/ios/RCTVideo.xcodeproj/project.pbxproj
@@ -7,12 +7,14 @@
objects = {
/* Begin PBXBuildFile section */
- 0177D39A27170A7A00F5BE18 /* RCTVideoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39227170A7A00F5BE18 /* RCTVideoManager.swift */; };
+ 0177D39A27170A7A00F5BE18 /* ReactVideoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39227170A7A00F5BE18 /* ReactVideoManager.swift */; };
0177D39B27170A7A00F5BE18 /* UIView+FindUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39327170A7A00F5BE18 /* UIView+FindUIViewController.swift */; };
0177D39C27170A7A00F5BE18 /* RCTVideoPlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39427170A7A00F5BE18 /* RCTVideoPlayerViewController.swift */; };
0177D39D27170A7A00F5BE18 /* RCTVideoPlayerViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39627170A7A00F5BE18 /* RCTVideoPlayerViewControllerDelegate.swift */; };
- 0177D39E27170A7A00F5BE18 /* RCTVideoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39727170A7A00F5BE18 /* RCTVideoManager.m */; };
+ 0177D39E27170A7A00F5BE18 /* ReactVideoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39727170A7A00F5BE18 /* ReactVideoManager.m */; };
0177D39F27170A7A00F5BE18 /* RCTVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0177D39927170A7A00F5BE18 /* RCTVideo.swift */; };
+ DA65904F2A109820009286F9 /* RNCVideoComponentView.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA65904A2A109820009286F9 /* RNCVideoComponentView.mm */; };
+ DA6590502A109820009286F9 /* RNCVideoComponentView.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA65904A2A109820009286F9 /* RNCVideoComponentView.mm */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -40,15 +42,23 @@
01450CB5271D5738005D8F6B /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTVideo.a; sourceTree = BUILT_PRODUCTS_DIR; };
01489050272001A100E69940 /* DataStructures */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DataStructures; path = Video/DataStructures; sourceTree = ""; };
01489051272001A100E69940 /* Features */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Features; path = Video/Features; sourceTree = ""; };
- 0177D39227170A7A00F5BE18 /* RCTVideoManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RCTVideoManager.swift; path = Video/RCTVideoManager.swift; sourceTree = ""; };
+ 0177D39227170A7A00F5BE18 /* ReactVideoManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReactVideoManager.swift; path = Video/ReactVideoManager.swift; sourceTree = ""; };
0177D39327170A7A00F5BE18 /* UIView+FindUIViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+FindUIViewController.swift"; path = "Video/UIView+FindUIViewController.swift"; sourceTree = ""; };
0177D39427170A7A00F5BE18 /* RCTVideoPlayerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RCTVideoPlayerViewController.swift; path = Video/RCTVideoPlayerViewController.swift; sourceTree = ""; };
0177D39527170A7A00F5BE18 /* RCTSwiftLog */ = {isa = PBXFileReference; lastKnownFileType = folder; name = RCTSwiftLog; path = Video/RCTSwiftLog; sourceTree = ""; };
0177D39627170A7A00F5BE18 /* RCTVideoPlayerViewControllerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RCTVideoPlayerViewControllerDelegate.swift; path = Video/RCTVideoPlayerViewControllerDelegate.swift; sourceTree = ""; };
- 0177D39727170A7A00F5BE18 /* RCTVideoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTVideoManager.m; path = Video/RCTVideoManager.m; sourceTree = ""; };
+ 0177D39727170A7A00F5BE18 /* ReactVideoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ReactVideoManager.m; path = Video/ReactVideoManager.m; sourceTree = ""; };
0177D39827170A7A00F5BE18 /* RCTVideo-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "RCTVideo-Bridging-Header.h"; path = "Video/RCTVideo-Bridging-Header.h"; sourceTree = ""; };
0177D39927170A7A00F5BE18 /* RCTVideo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RCTVideo.swift; path = Video/RCTVideo.swift; sourceTree = ""; };
134814201AA4EA6300B7C361 /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTVideo.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ DA6590472A109820009286F9 /* RCTVideoPlayerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTVideoPlayerViewController.h; sourceTree = ""; };
+ DA6590482A109820009286F9 /* RNCVideoFabricConversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNCVideoFabricConversions.h; sourceTree = ""; };
+ DA6590492A109820009286F9 /* RNCVideoStructComparer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNCVideoStructComparer.h; sourceTree = ""; };
+ DA65904A2A109820009286F9 /* RNCVideoComponentView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RNCVideoComponentView.mm; sourceTree = ""; };
+ DA65904B2A109820009286F9 /* RCTVideo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTVideo.h; sourceTree = ""; };
+ DA65904C2A109820009286F9 /* RNCVideoComponentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNCVideoComponentView.h; sourceTree = ""; };
+ DA65904D2A109820009286F9 /* RCTVideoPlayerViewControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTVideoPlayerViewControllerDelegate.h; sourceTree = ""; };
+ DA65904E2A109820009286F9 /* UIView+FindUIViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+FindUIViewController.h"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -87,12 +97,13 @@
58B511D21A9E6C8500147676 = {
isa = PBXGroup;
children = (
+ DA6590452A109820009286F9 /* Fabric */,
01489050272001A100E69940 /* DataStructures */,
01489051272001A100E69940 /* Features */,
0177D39527170A7A00F5BE18 /* RCTSwiftLog */,
0177D39927170A7A00F5BE18 /* RCTVideo.swift */,
- 0177D39727170A7A00F5BE18 /* RCTVideoManager.m */,
- 0177D39227170A7A00F5BE18 /* RCTVideoManager.swift */,
+ 0177D39727170A7A00F5BE18 /* ReactVideoManager.m */,
+ 0177D39227170A7A00F5BE18 /* ReactVideoManager.swift */,
0177D39427170A7A00F5BE18 /* RCTVideoPlayerViewController.swift */,
0177D39627170A7A00F5BE18 /* RCTVideoPlayerViewControllerDelegate.swift */,
0177D39327170A7A00F5BE18 /* UIView+FindUIViewController.swift */,
@@ -103,6 +114,29 @@
);
sourceTree = "";
};
+ DA6590452A109820009286F9 /* Fabric */ = {
+ isa = PBXGroup;
+ children = (
+ DA6590462A109820009286F9 /* Video */,
+ );
+ path = Fabric;
+ sourceTree = "";
+ };
+ DA6590462A109820009286F9 /* Video */ = {
+ isa = PBXGroup;
+ children = (
+ DA6590472A109820009286F9 /* RCTVideoPlayerViewController.h */,
+ DA6590482A109820009286F9 /* RNCVideoFabricConversions.h */,
+ DA6590492A109820009286F9 /* RNCVideoStructComparer.h */,
+ DA65904A2A109820009286F9 /* RNCVideoComponentView.mm */,
+ DA65904B2A109820009286F9 /* RCTVideo.h */,
+ DA65904C2A109820009286F9 /* RNCVideoComponentView.h */,
+ DA65904D2A109820009286F9 /* RCTVideoPlayerViewControllerDelegate.h */,
+ DA65904E2A109820009286F9 /* UIView+FindUIViewController.h */,
+ );
+ path = Video;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -155,7 +189,7 @@
};
641E28431F0EEC8500443AF6 = {
CreatedOnToolsVersion = 8.3.3;
- LastSwiftMigration = 1300;
+ LastSwiftMigration = 1400;
ProvisioningStyle = Automatic;
};
};
@@ -185,11 +219,12 @@
buildActionMask = 2147483647;
files = (
0177D39D27170A7A00F5BE18 /* RCTVideoPlayerViewControllerDelegate.swift in Sources */,
+ DA65904F2A109820009286F9 /* RNCVideoComponentView.mm in Sources */,
0177D39C27170A7A00F5BE18 /* RCTVideoPlayerViewController.swift in Sources */,
0177D39B27170A7A00F5BE18 /* UIView+FindUIViewController.swift in Sources */,
0177D39F27170A7A00F5BE18 /* RCTVideo.swift in Sources */,
- 0177D39E27170A7A00F5BE18 /* RCTVideoManager.m in Sources */,
- 0177D39A27170A7A00F5BE18 /* RCTVideoManager.swift in Sources */,
+ 0177D39E27170A7A00F5BE18 /* ReactVideoManager.m in Sources */,
+ 0177D39A27170A7A00F5BE18 /* ReactVideoManager.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -197,6 +232,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ DA6590502A109820009286F9 /* RNCVideoComponentView.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/ios/Video/DataStructures/DRMParams.swift b/ios/Video/DataStructures/DRMParams.swift
index 64add7e018..5da7a56951 100644
--- a/ios/Video/DataStructures/DRMParams.swift
+++ b/ios/Video/DataStructures/DRMParams.swift
@@ -5,6 +5,7 @@ struct DRMParams {
let contentId: String?
let certificateUrl: String?
let base64Certificate: Bool?
+ let useExternalGetLicense: Bool?
let json: NSDictionary?
@@ -17,14 +18,31 @@ struct DRMParams {
self.certificateUrl = nil
self.base64Certificate = nil
self.headers = nil
+ self.useExternalGetLicense = nil
return
}
+
+
self.json = json
- self.type = json["type"] as? String
+ self.type = json["drmType"] as? String
self.licenseServer = json["licenseServer"] as? String
self.contentId = json["contentId"] as? String
self.certificateUrl = json["certificateUrl"] as? String
self.base64Certificate = json["base64Certificate"] as? Bool
- self.headers = json["headers"] as? Dictionary
+ self.useExternalGetLicense = json["useExternalGetLicense"] as? Bool
+
+ if let headersArray = json["headers"] as? NSArray {
+ var headersDictionary: [String: Any] = [:]
+ for dict in headersArray {
+ if let dictionary = dict as? NSDictionary,
+ let key = dictionary["key"] as? String,
+ let value = dictionary["value"] {
+ headersDictionary[key] = value
+ }
+ }
+ self.headers = headersDictionary
+ } else {
+ self.headers = nil
+ }
}
}
diff --git a/ios/Video/DataStructures/SelectedTrackCriteria.swift b/ios/Video/DataStructures/SelectedTrackCriteria.swift
index 7d97b8f2e9..f265e72085 100644
--- a/ios/Video/DataStructures/SelectedTrackCriteria.swift
+++ b/ios/Video/DataStructures/SelectedTrackCriteria.swift
@@ -12,7 +12,7 @@ struct SelectedTrackCriteria {
return
}
self.json = json
- self.type = json["type"] as? String ?? ""
+ self.type = json["selectedAudioType"] as? String ?? json["selectedTextType"] as? String ?? ""
self.value = json["value"]
}
}
diff --git a/ios/Video/Features/RCTIMAAdsManager.swift b/ios/Video/Features/RCTIMAAdsManager.swift
index 44aff4be00..1bd4e60a97 100644
--- a/ios/Video/Features/RCTIMAAdsManager.swift
+++ b/ios/Video/Features/RCTIMAAdsManager.swift
@@ -85,10 +85,11 @@ class RCTIMAAdsManager: NSObject, IMAAdsLoaderDelegate, IMAAdsManagerDelegate {
if event.type == IMAAdEventType.LOADED {
adsManager.start()
}
+
+ let type = convertEventToString(event: event.type)
+ _video.eventDelegate?.onReceiveAdEvent(event: event.type)
if _video.onReceiveAdEvent != nil {
- let type = convertEventToString(event: event.type)
-
_video.onReceiveAdEvent?([
"event": type,
"target": _video.reactTag!
diff --git a/ios/Video/Features/RCTPictureInPicture.swift b/ios/Video/Features/RCTPictureInPicture.swift
index 4525df0be9..93d1a1b21a 100644
--- a/ios/Video/Features/RCTPictureInPicture.swift
+++ b/ios/Video/Features/RCTPictureInPicture.swift
@@ -11,19 +11,24 @@ class RCTPictureInPicture: NSObject, AVPictureInPictureControllerDelegate {
private var _restoreUserInterfaceForPIPStopCompletionHandler:((Bool) -> Void)? = nil
private var _pipController:AVPictureInPictureController?
private var _isActive:Bool = false
+ private var _eventDelegate: RCTVideoEventDelegate?
- init(_ onPictureInPictureStatusChanged: @escaping RCTDirectEventBlock, _ onRestoreUserInterfaceForPictureInPictureStop: @escaping RCTDirectEventBlock) {
+ init(_ onPictureInPictureStatusChanged: @escaping RCTDirectEventBlock, _ onRestoreUserInterfaceForPictureInPictureStop: @escaping RCTDirectEventBlock, _ eventDelegate: RCTVideoEventDelegate?) {
_onPictureInPictureStatusChanged = onPictureInPictureStatusChanged
_onRestoreUserInterfaceForPictureInPictureStop = onRestoreUserInterfaceForPictureInPictureStop
+ _eventDelegate = eventDelegate
}
func pictureInPictureControllerDidStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+ _eventDelegate?.onPictureInPictureStatusChanged(isActive: true)
+
guard let _onPictureInPictureStatusChanged = _onPictureInPictureStatusChanged else { return }
_onPictureInPictureStatusChanged([ "isActive": NSNumber(value: true)])
}
func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
+ _eventDelegate?.onPictureInPictureStatusChanged(isActive: false)
guard let _onPictureInPictureStatusChanged = _onPictureInPictureStatusChanged else { return }
_onPictureInPictureStatusChanged([ "isActive": NSNumber(value: false)])
@@ -33,6 +38,8 @@ class RCTPictureInPicture: NSObject, AVPictureInPictureControllerDelegate {
assert(_restoreUserInterfaceForPIPStopCompletionHandler == nil, "restoreUserInterfaceForPIPStopCompletionHandler was not called after picture in picture was exited.")
+ _eventDelegate?.onRestoreUserInterfaceForPictureInPictureStop()
+
guard let _onRestoreUserInterfaceForPictureInPictureStop = _onRestoreUserInterfaceForPictureInPictureStop else { return }
_onRestoreUserInterfaceForPictureInPictureStop([:])
@@ -47,6 +54,7 @@ class RCTPictureInPicture: NSObject, AVPictureInPictureControllerDelegate {
}
func setupPipController(_ playerLayer: AVPlayerLayer?) {
+ NSLog("picture in picture~~")
guard playerLayer != nil && AVPictureInPictureController.isPictureInPictureSupported() && _isActive else { return }
// Create new controller passing reference to the AVPlayerLayer
_pipController = AVPictureInPictureController(playerLayer:playerLayer!)
diff --git a/ios/Video/Features/RCTResourceLoaderDelegate.swift b/ios/Video/Features/RCTResourceLoaderDelegate.swift
index 522285175c..4878ea93e1 100644
--- a/ios/Video/Features/RCTResourceLoaderDelegate.swift
+++ b/ios/Video/Features/RCTResourceLoaderDelegate.swift
@@ -11,6 +11,7 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
private var _reactTag: NSNumber?
private var _onVideoError: RCTDirectEventBlock?
private var _onGetLicense: RCTDirectEventBlock?
+ private weak var _eventDelegate: RCTVideoEventDelegate? = nil
init(
@@ -19,7 +20,8 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
localSourceEncryptionKeyScheme: String?,
onVideoError: RCTDirectEventBlock?,
onGetLicense: RCTDirectEventBlock?,
- reactTag: NSNumber
+ eventDelegate: RCTVideoEventDelegate?,
+ reactTag: NSNumber?
) {
super.init()
let queue = DispatchQueue(label: "assetQueue")
@@ -29,6 +31,7 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
_onGetLicense = onGetLicense
_drm = drm
_localSourceEncryptionKeyScheme = localSourceEncryptionKeyScheme
+ _eventDelegate = eventDelegate
}
deinit {
@@ -68,17 +71,21 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
if let _loadingRequest = _loadingRequest, let error = error {
_loadingRequest.finishLoading(with: error as! NSError)
+ let errorDict = [
+ "code": NSNumber(value: (error as NSError).code),
+ "localizedDescription": error.localizedDescription == nil ? "" : error.localizedDescription,
+ "localizedFailureReason": ((error as NSError).localizedFailureReason == nil ? "" : (error as NSError).localizedFailureReason) ?? "",
+ "localizedRecoverySuggestion": ((error as NSError).localizedRecoverySuggestion == nil ? "" : (error as NSError).localizedRecoverySuggestion) ?? "",
+ "domain": (error as NSError).domain
+ ] as [String : Any]
+
_onVideoError?([
- "error": [
- "code": NSNumber(value: (error as NSError).code),
- "localizedDescription": error.localizedDescription == nil ? "" : error.localizedDescription,
- "localizedFailureReason": ((error as NSError).localizedFailureReason == nil ? "" : (error as NSError).localizedFailureReason) ?? "",
- "localizedRecoverySuggestion": ((error as NSError).localizedRecoverySuggestion == nil ? "" : (error as NSError).localizedRecoverySuggestion) ?? "",
- "domain": (error as NSError).domain
- ],
+ "error": errorDict,
"target": _reactTag
])
+ _eventDelegate?.onVideoError(error: errorDict as NSDictionary)
+
}
return false
}
@@ -125,7 +132,8 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
}
var promise: Promise
- if _onGetLicense != nil {
+ if let useExternalGetLicense = _drm.useExternalGetLicense, useExternalGetLicense {
+
let contentId = _drm.contentId ?? loadingRequest.request.url?.host
promise = RCTVideoDRM.handleWithOnGetLicense(
loadingRequest:loadingRequest,
@@ -138,6 +146,12 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes
"contentId": contentId,
"spcBase64": spcData.base64EncodedString(options: []),
"target": self._reactTag])
+
+ let licenseUrl: NSString = self._drm?.licenseServer as NSString? ?? ""
+ let spcBase64: NSString = spcData.base64EncodedString(options: []) as NSString
+
+
+ self._eventDelegate?.onGetLicense(licenseUrl: licenseUrl, contentId: contentId as! NSString ?? "", spcBase64: spcBase64)
}
} else {
promise = RCTVideoDRM.handleInternalGetLicense(
diff --git a/ios/Video/Features/RCTVideoDRM.swift b/ios/Video/Features/RCTVideoDRM.swift
index d059bbc491..1fbf883f51 100644
--- a/ios/Video/Features/RCTVideoDRM.swift
+++ b/ios/Video/Features/RCTVideoDRM.swift
@@ -139,7 +139,12 @@ struct RCTVideoDRM {
static func handleInternalGetLicense(loadingRequest: AVAssetResourceLoadingRequest, contentId:String?, licenseServer:String?, certificateUrl:String?, base64Certificate:Bool?, headers: [String:Any]?) -> Promise {
let url = loadingRequest.request.url
- guard let contentId = contentId ?? url?.absoluteString.replacingOccurrences(of: "skd://", with:"") else {
+ var contentId = contentId
+ if contentId == nil || contentId?.isEmpty == true {
+ contentId = url?.absoluteString.replacingOccurrences(of: "skd://", with:"")
+ }
+
+ guard let contentId = contentId else {
return Promise(RCTVideoError.invalidContentId as! Error)
}
diff --git a/ios/Video/Features/RCTVideoEventDelegate.swift b/ios/Video/Features/RCTVideoEventDelegate.swift
new file mode 100644
index 0000000000..189b200245
--- /dev/null
+++ b/ios/Video/Features/RCTVideoEventDelegate.swift
@@ -0,0 +1,22 @@
+@objc protocol RCTVideoEventDelegate {
+ func onVideoProgress(currentTime: NSNumber, playableDuration: NSNumber, seekableDuration: NSNumber);
+ func onVideoLoad(currentTime: NSNumber, duration: NSNumber, naturalSize: NSDictionary);
+ func onVideoLoadStart(isNetwork: Bool, type: NSString, uri: NSString);
+ func onVideoBuffer(isBuffering: Bool);
+ func onVideoError(error: NSDictionary);
+ func onGetLicense(licenseUrl: NSString, contentId: NSString, spcBase64: NSString);
+ func onVideoSeek(currentTime: NSNumber, seekTime: NSNumber, finished: Bool);
+ func onVideoEnd();
+ func onTimedMetadata();
+ func onVideoAudioBecomingNoisy();
+ func onVideoFullscreenPlayerWillPresent();
+ func onVideoFullscreenPlayerDidPresent();
+ func onVideoFullscreenPlayerWillDismiss();
+ func onVideoFullscreenPlayerDidDismiss();
+ func onReadyForDisplay();
+ func onRestoreUserInterfaceForPictureInPictureStop();
+ func onPictureInPictureStatusChanged(isActive: Bool);
+ func onPlaybackRateChange(playbackRate: NSNumber);
+ func onVideoExternalPlaybackChange(isExternalPlaybackActive: Bool);
+ func onReceiveAdEvent(event: NSString);
+}
diff --git a/ios/Video/RCTVideo-Bridging-Header.h b/ios/Video/RCTVideo-Bridging-Header.h
index 77815e4e48..32cccf1abd 100644
--- a/ios/Video/RCTVideo-Bridging-Header.h
+++ b/ios/Video/RCTVideo-Bridging-Header.h
@@ -4,4 +4,3 @@
#if __has_include()
#import "RCTVideoCache.h"
#endif
-
diff --git a/ios/Video/RCTVideo.swift b/ios/Video/RCTVideo.swift
index 264b1de30c..1f5440e227 100644
--- a/ios/Video/RCTVideo.swift
+++ b/ios/Video/RCTVideo.swift
@@ -1,3 +1,4 @@
+import UIKit
import AVFoundation
import AVKit
import Foundation
@@ -7,6 +8,7 @@ import GoogleInteractiveMediaAds
import React
import Promises
+@objc(RCTVideo)
class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverHandler {
private var _player:AVPlayer?
@@ -81,7 +83,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
#endif
#if TARGET_OS_IOS
- private let _pip:RCTPictureInPicture = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop)
+ private var _pip:RCTPictureInPicture = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop, self.eventDelegate)
#endif
// Events
@@ -108,15 +110,44 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc var onRestoreUserInterfaceForPictureInPictureStop: RCTDirectEventBlock?
@objc var onGetLicense: RCTDirectEventBlock?
@objc var onReceiveAdEvent: RCTDirectEventBlock?
-
+
+ @objc weak var eventDelegate: RCTVideoEventDelegate? {
+ didSet {
+#if TARGET_OS_IOS
+ _pip = RCTPictureInPicture(self.onPictureInPictureStatusChanged, self.onRestoreUserInterfaceForPictureInPictureStop, self.eventDelegate)
+#endif
+ }
+ }
+
+ @objc
+ override init(frame: CGRect) {
+ super.init(frame: frame)
+ self.initCommon()
+ }
+
+ @objc
init(eventDispatcher:RCTEventDispatcher!) {
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
+ _eventDispatcher = eventDispatcher
+ self.initCommon()
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ self.initCommon()
+ }
+
+ deinit {
+ NotificationCenter.default.removeObserver(self)
+ self.removePlayerLayer()
+ _playerObserver.clearPlayer()
+ }
+
+ func initCommon() {
#if USE_GOOGLE_IMA
_imaAdsManager = RCTIMAAdsManager(video: self)
#endif
- _eventDispatcher = eventDispatcher
-
NotificationCenter.default.addObserver(
self,
selector: #selector(applicationWillResignActive(notification:)),
@@ -150,19 +181,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
#endif
}
- required init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
-#if USE_GOOGLE_IMA
- _imaAdsManager = RCTIMAAdsManager(video: self)
-#endif
- }
-
- deinit {
- NotificationCenter.default.removeObserver(self)
- self.removePlayerLayer()
- _playerObserver.clearPlayer()
- }
-
// MARK: - App lifecycle handlers
@objc func applicationWillResignActive(notification:NSNotification!) {
@@ -194,8 +212,9 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if let userInfo = notification.userInfo {
let reason:AVAudioSession.RouteChangeReason! = userInfo[AVAudioSessionRouteChangeReasonKey] as? AVAudioSession.RouteChangeReason
// let previousRoute:NSNumber! = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? NSNumber
- if reason == .oldDeviceUnavailable, let onVideoAudioBecomingNoisy = onVideoAudioBecomingNoisy {
- onVideoAudioBecomingNoisy(["target": reactTag as Any])
+ if reason == .oldDeviceUnavailable {
+ onVideoAudioBecomingNoisy?(["target": reactTag as Any])
+ eventDelegate?.onVideoAudioBecomingNoisy()
}
}
}
@@ -232,14 +251,19 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_didRequestAds = true
}
#endif
+ let playableDuration: NSNumber! = RCTVideoUtils.calculatePlayableDuration(_player, withSource: _source)
+ let seekableDuration: NSNumber! = RCTVideoUtils.calculateSeekableDuration(_player)
+
onVideoProgress?([
"currentTime": NSNumber(value: Float(currentTimeSecs)),
- "playableDuration": RCTVideoUtils.calculatePlayableDuration(_player, withSource: _source),
+ "playableDuration": playableDuration,
"atValue": NSNumber(value: currentTime?.value ?? .zero),
"currentPlaybackTime": NSNumber(value: NSNumber(value: floor(currentPlaybackTime?.timeIntervalSince1970 ?? 0 * 1000)).int64Value),
"target": reactTag,
- "seekableDuration": RCTVideoUtils.calculateSeekableDuration(_player)
+ "seekableDuration": seekableDuration
])
+
+ self.eventDelegate?.onVideoProgress(currentTime: NSNumber(value: Float(currentTimeSecs)), playableDuration: playableDuration, seekableDuration: seekableDuration)
}
}
@@ -292,6 +316,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
localSourceEncryptionKeyScheme: self._localSourceEncryptionKeyScheme,
onVideoError: self.onVideoError,
onGetLicense: self.onGetLicense,
+ eventDelegate: self.eventDelegate,
reactTag: self.reactTag
)
}
@@ -337,7 +362,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
"drm": self._drm?.json ?? NSNull(),
"target": self.reactTag
])
+ let isNetwork: Bool = self._source?.isNetwork ?? false
+ let type: NSString = self._source?.type as NSString? ?? ""
+ let uri: NSString = self._source?.uri as NSString? ?? ""
+ self.eventDelegate?.onVideoLoadStart(isNetwork: isNetwork, type: type, uri: uri)
}.catch{_ in }
+
self._videoLoadStarted = true
}
}
@@ -376,10 +406,19 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func setResizeMode(_ mode: String?) {
+ var resizeMode: String? = mode
+ if mode == "stretch" {
+ resizeMode = AVLayerVideoGravity.resize.rawValue
+ } else if mode == "cover" {
+ resizeMode = AVLayerVideoGravity.resizeAspectFill.rawValue
+ } else if mode == "contain" {
+ resizeMode = AVLayerVideoGravity.resizeAspect.rawValue
+ }
+
if _controls {
- _playerViewController?.videoGravity = AVLayerVideoGravity(rawValue: mode ?? "")
+ _playerViewController?.videoGravity = AVLayerVideoGravity(rawValue: resizeMode ?? "")
} else {
- _playerLayer?.videoGravity = AVLayerVideoGravity(rawValue: mode ?? "")
+ _playerLayer?.videoGravity = AVLayerVideoGravity(rawValue: resizeMode ?? "")
}
_resizeMode = mode
}
@@ -466,7 +505,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
@objc
- func setSeek(_ info:NSDictionary!) {
+ func seek(_ info:NSDictionary!) {
let seekTime:NSNumber! = info["time"] as! NSNumber
let seekTolerance:NSNumber! = info["tolerance"] as! NSNumber
let item:AVPlayerItem? = _player?.currentItem
@@ -490,9 +529,16 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if !wasPaused {
self.setPaused(false)
}
- self.onVideoSeek?(["currentTime": NSNumber(value: Float(CMTimeGetSeconds(item.currentTime()))),
- "seekTime": seekTime,
- "target": self.reactTag])
+
+ let currentTime: NSNumber = NSNumber(value: Float(CMTimeGetSeconds(item.currentTime())))
+ self.onVideoSeek?(["currentTime": currentTime,
+ "seekTime": seekTime,
+ "finished": finished,
+ "target": self.reactTag])
+
+ self.eventDelegate?.onVideoSeek(currentTime: currentTime, seekTime: seekTime, finished: finished)
+
+
}.catch{_ in }
_pendingSeek = false
@@ -554,7 +600,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_pendingSeekTime = Float(CMTimeGetSeconds(start))
_pendingSeek = true
}
- if (videoEnd != nil) {
+ if (videoEnd != nil && videoEnd! > 0) {
item.forwardPlaybackEndTime = CMTimeMake(value: videoEnd!, timescale: 1000)
}
}
@@ -660,6 +706,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_presentingViewController = viewController
self.onVideoFullscreenPlayerWillPresent?(["target": reactTag as Any])
+
+ self.eventDelegate?.onVideoFullscreenPlayerWillPresent()
if let playerViewController = _playerViewController {
viewController.present(playerViewController, animated:true, completion:{
@@ -668,6 +716,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self._playerViewController?.autorotate = self._fullscreenAutorotate
self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag])
+
+ self.eventDelegate?.onVideoFullscreenPlayerDidPresent()
})
}
@@ -784,9 +834,10 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// MARK: - RCTVideoPlayerViewControllerDelegate
func videoPlayerViewControllerWillDismiss(playerViewController:AVPlayerViewController) {
- if _playerViewController == playerViewController && _fullscreenPlayerPresented, let onVideoFullscreenPlayerWillDismiss = onVideoFullscreenPlayerWillDismiss {
+ if _playerViewController == playerViewController && _fullscreenPlayerPresented {
_playerObserver.removePlayerViewControllerObservers()
- onVideoFullscreenPlayerWillDismiss(["target": reactTag as Any])
+ onVideoFullscreenPlayerWillDismiss?(["target": reactTag as Any])
+ eventDelegate?.onVideoFullscreenPlayerWillDismiss()
}
}
@@ -800,6 +851,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self.applyModifiers()
onVideoFullscreenPlayerDidDismiss?(["target": reactTag as Any])
+ eventDelegate?.onVideoFullscreenPlayerDidDismiss()
}
}
@@ -809,6 +861,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if !_filterEnabled {
return
+ } else if (filterName == nil || filterName == "None") {
+ return
} else if let uri = _source?.uri, uri.contains("m3u8") {
return // filters don't work for HLS... return
} else if _playerItem?.asset == nil {
@@ -897,7 +951,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
// MARK: - Lifecycle
-
+ @objc
override func removeFromSuperview() {
_player?.pause()
_player = nil
@@ -933,10 +987,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
)
}
+ @objc
func setLicenseResult(_ license:String!) {
_resouceLoaderDelegate?.setLicenseResult(license)
}
+ @objc
func setLicenseResultError(_ error:String!) {
_resouceLoaderDelegate?.setLicenseResultError(error)
}
@@ -951,6 +1007,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
onReadyForDisplay?([
"target": reactTag
])
+ eventDelegate?.onReadyForDisplay();
}
// When timeMetadata is read the event onTimedMetadata is triggered
@@ -1021,7 +1078,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
if _pendingSeek {
- setSeek([
+ seek([
"time": NSNumber(value: _pendingSeekTime),
"tolerance": NSNumber(value: 100)
])
@@ -1047,6 +1104,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
"audioTracks": audioTracks,
"textTracks": textTracks,
"target": reactTag as Any])
+
+ self.eventDelegate?.onVideoLoad(currentTime: NSNumber(value: Float(CMTimeGetSeconds(_playerItem.currentTime()))), duration: NSNumber(value: duration), naturalSize: [
+ "width": width != nil ? NSNumber(value: width!) : NSNull(),
+ "height": width != nil ? NSNumber(value: height!) : NSNull(),
+ "orientation": orientation
+ ])
}
_videoLoadStarted = false
_playerObserver.attachPlayerEventListeners()
@@ -1055,22 +1118,29 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
func handlePlaybackFailed() {
guard let _playerItem = _playerItem else { return }
+
+ let errorDict = [
+ "code": NSNumber(value: (_playerItem.error! as NSError).code),
+ "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription,
+ "localizedFailureReason": ((_playerItem.error! as NSError).localizedFailureReason == nil ? "" : (_playerItem.error! as NSError).localizedFailureReason) ?? "",
+ "localizedRecoverySuggestion": ((_playerItem.error! as NSError).localizedRecoverySuggestion == nil ? "" : (_playerItem.error! as NSError).localizedRecoverySuggestion) ?? "",
+ "domain": (_playerItem.error as! NSError).domain
+ ] as [String : Any]
+
onVideoError?(
[
- "error": [
- "code": NSNumber(value: (_playerItem.error! as NSError).code),
- "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription,
- "localizedFailureReason": ((_playerItem.error! as NSError).localizedFailureReason == nil ? "" : (_playerItem.error! as NSError).localizedFailureReason) ?? "",
- "localizedRecoverySuggestion": ((_playerItem.error! as NSError).localizedRecoverySuggestion == nil ? "" : (_playerItem.error! as NSError).localizedRecoverySuggestion) ?? "",
- "domain": (_playerItem.error as! NSError).domain
- ],
+ "error": errorDict,
"target": reactTag
])
+
+ eventDelegate?.onVideoError(error: errorDict as NSDictionary)
}
func handlePlaybackBufferKeyEmpty(playerItem:AVPlayerItem, change:NSKeyValueObservedChange) {
- _playerBufferEmpty = true
- onVideoBuffer?(["isBuffering": true, "target": reactTag as Any])
+ var isEmpty = change.newValue ?? false
+ _playerBufferEmpty = isEmpty
+ onVideoBuffer?(["isBuffering": isEmpty, "target": reactTag as Any])
+ self.eventDelegate?.onVideoBuffer(isBuffering: isEmpty)
}
// Continue playing (or not if paused) after being paused due to hitting an unbuffered zone.
@@ -1078,14 +1148,18 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if (!(_controls || _fullscreenPlayerPresented) || _playerBufferEmpty) && ((_playerItem?.isPlaybackLikelyToKeepUp) != nil) {
setPaused(_paused)
}
- _playerBufferEmpty = false
- onVideoBuffer?(["isBuffering": false, "target": reactTag as Any])
+
+ var isPlaybackLikelyToKeepUp = change.newValue ?? true
+ _playerBufferEmpty = !isPlaybackLikelyToKeepUp
+ onVideoBuffer?(["isBuffering": !isPlaybackLikelyToKeepUp, "target": reactTag as Any])
+ self.eventDelegate?.onVideoBuffer(isBuffering: !isPlaybackLikelyToKeepUp)
}
func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange