mirror of
https://github.com/zoriya/react-native-background-downloader.git
synced 2025-12-06 06:56:10 +00:00
Example Project React Native 0.72.6 Updated
This commit is contained in:
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true,
|
||||||
|
"**/Thumbs.db": true
|
||||||
|
},
|
||||||
|
"hide-files.files": []
|
||||||
|
}
|
||||||
@@ -1,23 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>react-native-background-downloader</name>
|
<name>react-native-background-downloader</name>
|
||||||
<comment>Project react-native-background-downloader created by Buildship.</comment>
|
<comment>Project react-native-background-downloader created by Buildship.</comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
<buildSpec>
|
<buildSpec>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
|
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
|
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
|
<filteredResources>
|
||||||
|
<filter>
|
||||||
|
<id>1699230963354</id>
|
||||||
|
<name></name>
|
||||||
|
<type>30</type>
|
||||||
|
<matcher>
|
||||||
|
<id>org.eclipse.core.resources.regexFilterMatcher</id>
|
||||||
|
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
|
||||||
|
</matcher>
|
||||||
|
</filter>
|
||||||
|
</filteredResources>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
[android]
|
|
||||||
target = Google Inc.:Google APIs:23
|
|
||||||
|
|
||||||
[maven_repositories]
|
|
||||||
central = https://repo1.maven.org/maven2
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
extends: '@react-native-community',
|
extends: '@react-native',
|
||||||
};
|
};
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
[ignore]
|
|
||||||
; We fork some components by platform
|
|
||||||
.*/*[.]android.js
|
|
||||||
|
|
||||||
; Ignore "BUCK" generated dirs
|
|
||||||
<PROJECT_ROOT>/\.buckd/
|
|
||||||
|
|
||||||
; Ignore polyfills
|
|
||||||
node_modules/react-native/Libraries/polyfills/.*
|
|
||||||
|
|
||||||
; Flow doesn't support platforms
|
|
||||||
.*/Libraries/Utilities/LoadingView.js
|
|
||||||
|
|
||||||
.*/node_modules/resolve/test/resolver/malformed_package_json/package\.json$
|
|
||||||
|
|
||||||
[untyped]
|
|
||||||
.*/node_modules/@react-native-community/cli/.*/.*
|
|
||||||
|
|
||||||
[include]
|
|
||||||
|
|
||||||
[libs]
|
|
||||||
node_modules/react-native/interface.js
|
|
||||||
node_modules/react-native/flow/
|
|
||||||
|
|
||||||
[options]
|
|
||||||
emoji=true
|
|
||||||
|
|
||||||
exact_by_default=true
|
|
||||||
|
|
||||||
format.bracket_spacing=false
|
|
||||||
|
|
||||||
module.file_ext=.js
|
|
||||||
module.file_ext=.json
|
|
||||||
module.file_ext=.ios.js
|
|
||||||
|
|
||||||
munge_underscores=true
|
|
||||||
|
|
||||||
module.name_mapper='^react-native/\(.*\)$' -> '<PROJECT_ROOT>/node_modules/react-native/\1'
|
|
||||||
module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '<PROJECT_ROOT>/node_modules/react-native/Libraries/Image/RelativeImageStub'
|
|
||||||
|
|
||||||
suppress_type=$FlowIssue
|
|
||||||
suppress_type=$FlowFixMe
|
|
||||||
suppress_type=$FlowFixMeProps
|
|
||||||
suppress_type=$FlowFixMeState
|
|
||||||
|
|
||||||
[lints]
|
|
||||||
sketchy-null-number=warn
|
|
||||||
sketchy-null-mixed=warn
|
|
||||||
sketchy-number=warn
|
|
||||||
untyped-type-import=warn
|
|
||||||
nonstrict-import=warn
|
|
||||||
deprecated-type=warn
|
|
||||||
unsafe-getters-setters=warn
|
|
||||||
unnecessary-invariant=warn
|
|
||||||
|
|
||||||
[strict]
|
|
||||||
deprecated-type
|
|
||||||
nonstrict-import
|
|
||||||
sketchy-null
|
|
||||||
unclear-type
|
|
||||||
unsafe-getters-setters
|
|
||||||
untyped-import
|
|
||||||
untyped-type-import
|
|
||||||
|
|
||||||
[version]
|
|
||||||
^0.176.3
|
|
||||||
9
example/.gitignore
vendored
9
example/.gitignore
vendored
@@ -37,9 +37,7 @@ node_modules/
|
|||||||
npm-debug.log
|
npm-debug.log
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
|
|
||||||
# BUCK
|
.cxx/
|
||||||
buck-out/
|
|
||||||
\.buckd/
|
|
||||||
*.keystore
|
*.keystore
|
||||||
!debug.keystore
|
!debug.keystore
|
||||||
|
|
||||||
@@ -61,3 +59,8 @@ buck-out/
|
|||||||
# Ruby / CocoaPods
|
# Ruby / CocoaPods
|
||||||
/ios/Pods/
|
/ios/Pods/
|
||||||
/vendor/bundle/
|
/vendor/bundle/
|
||||||
|
|
||||||
|
# Temporary files created by Metro to check the health of the file watcher
|
||||||
|
.metro-health-check*
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
2.7.5
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
|
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
|
||||||
ruby '2.7.5'
|
ruby ">= 2.6.10"
|
||||||
|
gem 'cocoapods', '~> 1.13'
|
||||||
gem 'cocoapods', '~> 1.11', '>= 1.11.2'
|
gem 'activesupport', '>= 6.1.7.3', '< 7.1.0'
|
||||||
|
|||||||
50
example/README.md
Normal file
50
example/README.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli).
|
||||||
|
# Getting Started
|
||||||
|
>**Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding.
|
||||||
|
## Step 1: Start the Metro Server
|
||||||
|
First, you will need to start **Metro**, the JavaScript _bundler_ that ships _with_ React Native.
|
||||||
|
To start Metro, run the following command from the _root_ of your React Native project:
|
||||||
|
```bash
|
||||||
|
# using npm
|
||||||
|
npm start
|
||||||
|
# OR using Yarn
|
||||||
|
yarn start
|
||||||
|
```
|
||||||
|
## Step 2: Start your Application
|
||||||
|
Let Metro Bundler run in its _own_ terminal. Open a _new_ terminal from the _root_ of your React Native project. Run the following command to start your _Android_ or _iOS_ app:
|
||||||
|
### For Android
|
||||||
|
```bash
|
||||||
|
# using npm
|
||||||
|
npm run android
|
||||||
|
# OR using Yarn
|
||||||
|
yarn android
|
||||||
|
```
|
||||||
|
### For iOS
|
||||||
|
```bash
|
||||||
|
# using npm
|
||||||
|
npm run ios
|
||||||
|
# OR using Yarn
|
||||||
|
yarn ios
|
||||||
|
```
|
||||||
|
If everything is set up _correctly_, you should see your new app running in your _Android Emulator_ or _iOS Simulator_ shortly provided you have set up your emulator/simulator correctly.
|
||||||
|
This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively.
|
||||||
|
## Step 3: Modifying your App
|
||||||
|
Now that you have successfully run the app, let's modify it.
|
||||||
|
1. Open `App.tsx` in your text editor of choice and edit some lines.
|
||||||
|
2. For **Android**: Press the <kbd>R</kbd> key twice or select **"Reload"** from the **Developer Menu** (<kbd>Ctrl</kbd> + <kbd>M</kbd> (on Window and Linux) or <kbd>Cmd ⌘</kbd> + <kbd>M</kbd> (on macOS)) to see your changes!
|
||||||
|
For **iOS**: Hit <kbd>Cmd ⌘</kbd> + <kbd>R</kbd> in your iOS Simulator to reload the app and see your changes!
|
||||||
|
## Congratulations! :tada:
|
||||||
|
You've successfully run and modified your React Native App. :partying_face:
|
||||||
|
### Now what?
|
||||||
|
- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps).
|
||||||
|
- If you're curious to learn more about React Native, check out the [Introduction to React Native](https://reactnative.dev/docs/getting-started).
|
||||||
|
# Troubleshooting
|
||||||
|
If you can't get this to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page.
|
||||||
|
# Learn More
|
||||||
|
To learn more about React Native, take a look at the following resources:
|
||||||
|
- [React Native Website](https://reactnative.dev) - learn more about React Native.
|
||||||
|
- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment.
|
||||||
|
- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**.
|
||||||
|
- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts.
|
||||||
|
- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native.
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
import 'react-native';
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import 'react-native';
|
||||||
import App from '../src/App';
|
import App from '../src/App';
|
||||||
|
|
||||||
|
// Note: import explicitly to use the types shiped with jest.
|
||||||
|
import { it } from '@jest/globals';
|
||||||
|
|
||||||
// Note: test renderer must be required after react-native.
|
// Note: test renderer must be required after react-native.
|
||||||
import renderer from 'react-test-renderer';
|
import renderer from 'react-test-renderer';
|
||||||
|
|
||||||
it('renders correctly', () => {
|
it('renders correctly', () => {
|
||||||
renderer.create(<App />);
|
renderer.create(<App />);
|
||||||
});
|
});
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# To learn about Buck see [Docs](https://buckbuild.com/).
|
|
||||||
# To run your application with Buck:
|
|
||||||
# - install Buck
|
|
||||||
# - `npm start` - to start the packager
|
|
||||||
# - `cd android`
|
|
||||||
# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
|
|
||||||
# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
|
|
||||||
# - `buck install -r android/app` - compile, install and run application
|
|
||||||
#
|
|
||||||
|
|
||||||
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
|
|
||||||
|
|
||||||
lib_deps = []
|
|
||||||
|
|
||||||
create_aar_targets(glob(["libs/*.aar"]))
|
|
||||||
|
|
||||||
create_jar_targets(glob(["libs/*.jar"]))
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "all-libs",
|
|
||||||
exported_deps = lib_deps,
|
|
||||||
)
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "app-code",
|
|
||||||
srcs = glob([
|
|
||||||
"src/main/java/**/*.java",
|
|
||||||
]),
|
|
||||||
deps = [
|
|
||||||
":all-libs",
|
|
||||||
":build_config",
|
|
||||||
":res",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
android_build_config(
|
|
||||||
name = "build_config",
|
|
||||||
package = "com.example",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_resource(
|
|
||||||
name = "res",
|
|
||||||
package = "com.example",
|
|
||||||
res = "src/main/res",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_binary(
|
|
||||||
name = "app",
|
|
||||||
keystore = "//android/keystores:debug",
|
|
||||||
manifest = "src/main/AndroidManifest.xml",
|
|
||||||
package_type = "debug",
|
|
||||||
deps = [
|
|
||||||
":app-code",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@@ -1,221 +1,85 @@
|
|||||||
apply plugin: "com.android.application"
|
apply plugin: "com.android.application"
|
||||||
|
apply plugin: "com.facebook.react"
|
||||||
import com.android.build.OutputFile
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
|
* This is the configuration block to customize your React Native Android app.
|
||||||
* and bundleReleaseJsAndAssets).
|
* By default you don't need to apply any configuration, just uncomment the lines you need.
|
||||||
* These basically call `react-native bundle` with the correct arguments during the Android build
|
|
||||||
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
|
|
||||||
* bundle directly from the development server. Below you can see all the possible configurations
|
|
||||||
* and their defaults. If you decide to add a configuration block, make sure to add it before the
|
|
||||||
* `apply from: "../../node_modules/react-native/react.gradle"` line.
|
|
||||||
*
|
|
||||||
* project.ext.react = [
|
|
||||||
* // the name of the generated asset file containing your JS bundle
|
|
||||||
* bundleAssetName: "index.android.bundle",
|
|
||||||
*
|
|
||||||
* // the entry file for bundle generation. If none specified and
|
|
||||||
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
|
|
||||||
* // default. Can be overridden with ENTRY_FILE environment variable.
|
|
||||||
* entryFile: "index.android.js",
|
|
||||||
*
|
|
||||||
* // https://reactnative.dev/docs/performance#enable-the-ram-format
|
|
||||||
* bundleCommand: "ram-bundle",
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in debug mode
|
|
||||||
* bundleInDebug: false,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in release mode
|
|
||||||
* bundleInRelease: true,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in another build variant (if configured).
|
|
||||||
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'bundleIn${productFlavor}${buildType}'
|
|
||||||
* // 'bundleIn${buildType}'
|
|
||||||
* // bundleInFreeDebug: true,
|
|
||||||
* // bundleInPaidRelease: true,
|
|
||||||
* // bundleInBeta: true,
|
|
||||||
*
|
|
||||||
* // whether to disable dev mode in custom build variants (by default only disabled in release)
|
|
||||||
* // for example: to disable dev mode in the staging build type (if configured)
|
|
||||||
* devDisabledInStaging: true,
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'devDisabledIn${productFlavor}${buildType}'
|
|
||||||
* // 'devDisabledIn${buildType}'
|
|
||||||
*
|
|
||||||
* // the root of your project, i.e. where "package.json" lives
|
|
||||||
* root: "../../",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in debug mode
|
|
||||||
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in release mode
|
|
||||||
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in debug mode
|
|
||||||
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in release mode
|
|
||||||
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
|
|
||||||
*
|
|
||||||
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
|
|
||||||
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
|
|
||||||
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
|
|
||||||
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
|
|
||||||
* // for example, you might want to remove it from here.
|
|
||||||
* inputExcludes: ["android/**", "ios/**"],
|
|
||||||
*
|
|
||||||
* // override which node gets called and with what additional arguments
|
|
||||||
* nodeExecutableAndArgs: ["node"],
|
|
||||||
*
|
|
||||||
* // supply additional arguments to the packager
|
|
||||||
* extraPackagerArgs: []
|
|
||||||
* ]
|
|
||||||
*/
|
*/
|
||||||
|
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")
|
||||||
|
|
||||||
project.ext.react = [
|
/* Variants */
|
||||||
enableHermes: false, // clean and rebuild if changing
|
// 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"]
|
||||||
|
|
||||||
apply from: "../../node_modules/react-native/react.gradle"
|
/* 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 two separate APKs instead of one:
|
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
|
||||||
* - An APK that only works on ARM devices
|
|
||||||
* - An APK that only works on x86 devices
|
|
||||||
* The advantage is the size of the APK is reduced by about 4MB.
|
|
||||||
* Upload all the APKs to the Play Store and people will download
|
|
||||||
* the correct one based on the CPU architecture of their device.
|
|
||||||
*/
|
|
||||||
def enableSeparateBuildPerCPUArchitecture = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run Proguard to shrink the Java bytecode in release builds.
|
|
||||||
*/
|
*/
|
||||||
def enableProguardInReleaseBuilds = false
|
def enableProguardInReleaseBuilds = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The preferred build flavor of JavaScriptCore.
|
* The preferred build flavor of JavaScriptCore (JSC)
|
||||||
*
|
*
|
||||||
* For example, to use the international variant, you can use:
|
* For example, to use the international variant, you can use:
|
||||||
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
||||||
*
|
*
|
||||||
* The international variant includes ICU i18n library and necessary data
|
* The international variant includes ICU i18n library and necessary data
|
||||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
||||||
* give correct results when using with locales other than en-US. Note that
|
* give correct results when using with locales other than en-US. Note that
|
||||||
* this variant is about 6MiB larger per architecture than default.
|
* this variant is about 6MiB larger per architecture than default.
|
||||||
*/
|
*/
|
||||||
def jscFlavor = 'org.webkit:android-jsc:+'
|
def jscFlavor = 'org.webkit:android-jsc:+'
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether to enable the Hermes VM.
|
|
||||||
*
|
|
||||||
* This should be set on project.ext.react and that value will be read here. If it is not set
|
|
||||||
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
|
|
||||||
* and the benefits of using Hermes will therefore be sharply reduced.
|
|
||||||
*/
|
|
||||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Architectures to build native code for.
|
|
||||||
*/
|
|
||||||
def reactNativeArchitectures() {
|
|
||||||
def value = project.getProperties().get("reactNativeArchitectures")
|
|
||||||
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
ndkVersion rootProject.ext.ndkVersion
|
ndkVersion rootProject.ext.ndkVersion
|
||||||
|
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||||
|
|
||||||
|
namespace "com.example"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.example"
|
applicationId "com.example"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName "1.0"
|
||||||
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
||||||
|
|
||||||
if (isNewArchitectureEnabled()) {
|
|
||||||
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
|
||||||
externalNativeBuild {
|
|
||||||
ndkBuild {
|
|
||||||
arguments "APP_PLATFORM=android-21",
|
|
||||||
"APP_STL=c++_shared",
|
|
||||||
"NDK_TOOLCHAIN_VERSION=clang",
|
|
||||||
"GENERATED_SRC_DIR=$buildDir/generated/source",
|
|
||||||
"PROJECT_BUILD_DIR=$buildDir",
|
|
||||||
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
|
|
||||||
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
|
|
||||||
"NODE_MODULES_DIR=$rootDir/../node_modules"
|
|
||||||
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
|
||||||
cppFlags "-std=c++17"
|
|
||||||
// Make sure this target name is the same you specify inside the
|
|
||||||
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
|
|
||||||
targets "example_appmodules"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!enableSeparateBuildPerCPUArchitecture) {
|
|
||||||
ndk {
|
|
||||||
abiFilters (*reactNativeArchitectures())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNewArchitectureEnabled()) {
|
|
||||||
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
|
||||||
externalNativeBuild {
|
|
||||||
ndkBuild {
|
|
||||||
path "$projectDir/src/main/jni/Android.mk"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def reactAndroidProjectDir = project(':ReactAndroid').projectDir
|
|
||||||
def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
|
|
||||||
dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
|
|
||||||
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
|
|
||||||
into("$buildDir/react-ndk/exported")
|
|
||||||
}
|
|
||||||
def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
|
|
||||||
dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
|
|
||||||
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
|
|
||||||
into("$buildDir/react-ndk/exported")
|
|
||||||
}
|
|
||||||
afterEvaluate {
|
|
||||||
// If you wish to add a custom TurboModule or component locally,
|
|
||||||
// you should uncomment this line.
|
|
||||||
// preBuild.dependsOn("generateCodegenArtifactsFromSchema")
|
|
||||||
preDebugBuild.dependsOn(packageReactNdkDebugLibs)
|
|
||||||
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
|
|
||||||
|
|
||||||
// Due to a bug inside AGP, we have to explicitly set a dependency
|
|
||||||
// between configureNdkBuild* tasks and the preBuild tasks.
|
|
||||||
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
|
|
||||||
configureNdkBuildRelease.dependsOn(preReleaseBuild)
|
|
||||||
configureNdkBuildDebug.dependsOn(preDebugBuild)
|
|
||||||
reactNativeArchitectures().each { architecture ->
|
|
||||||
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
|
|
||||||
dependsOn("preDebugBuild")
|
|
||||||
}
|
|
||||||
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
|
|
||||||
dependsOn("preReleaseBuild")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
splits {
|
|
||||||
abi {
|
|
||||||
reset()
|
|
||||||
enable enableSeparateBuildPerCPUArchitecture
|
|
||||||
universalApk false // If true, also generate a universal APK
|
|
||||||
include (*reactNativeArchitectures())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
debug {
|
debug {
|
||||||
@@ -237,84 +101,23 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
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 {
|
dependencies {
|
||||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
// The version of react-native is set by the React Native Gradle Plugin
|
||||||
|
implementation("com.facebook.react:react-android")
|
||||||
//noinspection GradleDynamicVersion
|
|
||||||
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
||||||
|
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
|
|
||||||
|
|
||||||
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.fbjni'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
|
||||||
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
||||||
exclude group:'com.facebook.flipper'
|
|
||||||
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
||||||
}
|
}
|
||||||
|
|
||||||
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
|
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
|
||||||
exclude group:'com.facebook.flipper'
|
if (hermesEnabled.toBoolean()) {
|
||||||
}
|
implementation("com.facebook.react:hermes-android")
|
||||||
|
|
||||||
if (enableHermes) {
|
|
||||||
//noinspection GradleDynamicVersion
|
|
||||||
implementation("com.facebook.react:hermes-engine:+") { // From node_modules
|
|
||||||
exclude group:'com.facebook.fbjni'
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
implementation jscFlavor
|
implementation jscFlavor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNewArchitectureEnabled()) {
|
|
||||||
// If new architecture is enabled, we let you build RN from source
|
|
||||||
// Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
|
|
||||||
// This will be applied to all the imported transtitive dependency.
|
|
||||||
configurations.all {
|
|
||||||
resolutionStrategy.dependencySubstitution {
|
|
||||||
substitute(module("com.facebook.react:react-native"))
|
|
||||||
.using(project(":ReactAndroid"))
|
|
||||||
.because("On New Architecture we're building React Native from source")
|
|
||||||
substitute(module("com.facebook.react:hermes-engine"))
|
|
||||||
.using(project(":ReactAndroid:hermes-engine"))
|
|
||||||
.because("On New Architecture we're building Hermes from source")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run this once to be able to run the application with BUCK
|
|
||||||
// puts all compile dependencies into folder libs for BUCK to use
|
|
||||||
task copyDownloadableDepsToLibs(type: Copy) {
|
|
||||||
from configurations.implementation
|
|
||||||
into 'libs'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
||||||
|
|
||||||
def isNewArchitectureEnabled() {
|
|
||||||
// To opt-in for the New Architecture, you can either:
|
|
||||||
// - Set `newArchEnabled` to true inside the `gradle.properties` file
|
|
||||||
// - Invoke gradle with `-newArchEnabled=true`
|
|
||||||
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
|
|
||||||
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
"""Helper definitions to glob .aar and .jar targets"""
|
|
||||||
|
|
||||||
def create_aar_targets(aarfiles):
|
|
||||||
for aarfile in aarfiles:
|
|
||||||
name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
android_prebuilt_aar(
|
|
||||||
name = name,
|
|
||||||
aar = aarfile,
|
|
||||||
)
|
|
||||||
|
|
||||||
def create_jar_targets(jarfiles):
|
|
||||||
for jarfile in jarfiles:
|
|
||||||
name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
prebuilt_jar(
|
|
||||||
name = name,
|
|
||||||
binary_jar = jarfile,
|
|
||||||
)
|
|
||||||
@@ -1,6 +1,28 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".MainApplication"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:allowBackup="false"
|
||||||
|
android:theme="@style/AppTheme">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
||||||
|
android:launchMode="singleTask"
|
||||||
|
android:windowSoftInputMode="adjustResize"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import com.facebook.flipper.plugins.inspector.DescriptorMapping;
|
|||||||
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
|
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
|
||||||
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
|
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
|
||||||
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
|
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
|
||||||
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
|
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
|
||||||
import com.facebook.react.ReactInstanceEventListener;
|
import com.facebook.react.ReactInstanceEventListener;
|
||||||
import com.facebook.react.ReactInstanceManager;
|
import com.facebook.react.ReactInstanceManager;
|
||||||
@@ -25,13 +24,16 @@ import com.facebook.react.bridge.ReactContext;
|
|||||||
import com.facebook.react.modules.network.NetworkingModule;
|
import com.facebook.react.modules.network.NetworkingModule;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class responsible of loading Flipper inside your React Native application. This is the debug
|
||||||
|
* flavor of it. Here you can add your own plugins and customize the Flipper setup.
|
||||||
|
*/
|
||||||
public class ReactNativeFlipper {
|
public class ReactNativeFlipper {
|
||||||
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
|
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
|
||||||
if (FlipperUtils.shouldEnableFlipper(context)) {
|
if (FlipperUtils.shouldEnableFlipper(context)) {
|
||||||
final FlipperClient client = AndroidFlipperClient.getInstance(context);
|
final FlipperClient client = AndroidFlipperClient.getInstance(context);
|
||||||
|
|
||||||
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
|
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
|
||||||
client.addPlugin(new ReactFlipperPlugin());
|
|
||||||
client.addPlugin(new DatabasesFlipperPlugin(context));
|
client.addPlugin(new DatabasesFlipperPlugin(context));
|
||||||
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
|
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
|
||||||
client.addPlugin(CrashReporterPlugin.getInstance());
|
client.addPlugin(CrashReporterPlugin.getInstance());
|
||||||
|
|||||||
@@ -4,52 +4,22 @@ import android.os.Bundle;
|
|||||||
|
|
||||||
import com.facebook.react.ReactActivity;
|
import com.facebook.react.ReactActivity;
|
||||||
import com.facebook.react.ReactActivityDelegate;
|
import com.facebook.react.ReactActivityDelegate;
|
||||||
import com.facebook.react.ReactRootView;
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
|
||||||
|
import com.facebook.react.defaults.DefaultReactActivityDelegate;
|
||||||
|
|
||||||
public class MainActivity extends ReactActivity {
|
public class MainActivity extends ReactActivity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the main component registered from JavaScript. This is used to schedule
|
* Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link
|
||||||
* rendering of the component.
|
* DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React
|
||||||
*/
|
* (aka React 18) with two boolean flags.
|
||||||
@Override
|
|
||||||
protected String getMainComponentName() {
|
|
||||||
return "example";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
|
|
||||||
* you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer
|
|
||||||
* (Paper).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected ReactActivityDelegate createReactActivityDelegate() {
|
protected ReactActivityDelegate createReactActivityDelegate() {
|
||||||
return new MainActivityDelegate(this, getMainComponentName());
|
return new DefaultReactActivityDelegate(
|
||||||
}
|
this,
|
||||||
|
getMainComponentName(),
|
||||||
public static class MainActivityDelegate extends ReactActivityDelegate {
|
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
|
||||||
public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
|
DefaultNewArchitectureEntryPoint.getFabricEnabled());
|
||||||
super(activity, mainComponentName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReactRootView createRootView() {
|
|
||||||
ReactRootView reactRootView = new ReactRootView(getContext());
|
|
||||||
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
|
|
||||||
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
|
|
||||||
return reactRootView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isConcurrentRootEnabled() {
|
|
||||||
// If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
|
|
||||||
// More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
|
|
||||||
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,19 @@
|
|||||||
package com.example;
|
package com.example;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.content.Context;
|
|
||||||
import com.facebook.react.PackageList;
|
import com.facebook.react.PackageList;
|
||||||
import com.facebook.react.ReactApplication;
|
import com.facebook.react.ReactApplication;
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
import com.facebook.react.ReactNativeHost;
|
||||||
import com.facebook.react.ReactPackage;
|
import com.facebook.react.ReactPackage;
|
||||||
import com.facebook.react.config.ReactFeatureFlags;
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
|
||||||
|
import com.facebook.react.defaults.DefaultReactNativeHost;
|
||||||
import com.facebook.soloader.SoLoader;
|
import com.facebook.soloader.SoLoader;
|
||||||
import com.example.newarchitecture.MainApplicationReactNativeHost;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MainApplication extends Application implements ReactApplication {
|
public class MainApplication extends Application implements ReactApplication {
|
||||||
|
|
||||||
private final ReactNativeHost mReactNativeHost =
|
private final ReactNativeHost mReactNativeHost =
|
||||||
new ReactNativeHost(this) {
|
new DefaultReactNativeHost(this) {
|
||||||
@Override
|
@Override
|
||||||
public boolean getUseDeveloperSupport() {
|
public boolean getUseDeveloperSupport() {
|
||||||
return BuildConfig.DEBUG;
|
return BuildConfig.DEBUG;
|
||||||
@@ -35,57 +32,31 @@ public class MainApplication extends Application implements ReactApplication {
|
|||||||
protected String getJSMainModuleName() {
|
protected String getJSMainModuleName() {
|
||||||
return "index";
|
return "index";
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
private final ReactNativeHost mNewArchitectureNativeHost =
|
@Override
|
||||||
new MainApplicationReactNativeHost(this);
|
protected boolean isNewArchEnabled() {
|
||||||
|
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Boolean isHermesEnabled() {
|
||||||
|
return BuildConfig.IS_HERMES_ENABLED;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReactNativeHost getReactNativeHost() {
|
public ReactNativeHost getReactNativeHost() {
|
||||||
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
return mReactNativeHost;
|
||||||
return mNewArchitectureNativeHost;
|
|
||||||
} else {
|
|
||||||
return mReactNativeHost;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
// If you opted-in for the New Architecture, we enable the TurboModule system
|
|
||||||
ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
|
|
||||||
SoLoader.init(this, /* native exopackage */ false);
|
SoLoader.init(this, /* native exopackage */ false);
|
||||||
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
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();
|
||||||
/**
|
|
||||||
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
|
|
||||||
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param reactInstanceManager
|
|
||||||
*/
|
|
||||||
private static void initializeFlipper(
|
|
||||||
Context context, ReactInstanceManager reactInstanceManager) {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
We use reflection here to pick up the class that initializes Flipper,
|
|
||||||
since Flipper library is not available in release mode
|
|
||||||
*/
|
|
||||||
Class<?> aClass = Class.forName("com.example.ReactNativeFlipper");
|
|
||||||
aClass
|
|
||||||
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
|
|
||||||
.invoke(null, context, reactInstanceManager);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
package com.example.newarchitecture;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import com.facebook.react.PackageList;
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
|
||||||
import com.facebook.react.ReactPackage;
|
|
||||||
import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
|
|
||||||
import com.facebook.react.bridge.JSIModulePackage;
|
|
||||||
import com.facebook.react.bridge.JSIModuleProvider;
|
|
||||||
import com.facebook.react.bridge.JSIModuleSpec;
|
|
||||||
import com.facebook.react.bridge.JSIModuleType;
|
|
||||||
import com.facebook.react.bridge.JavaScriptContextHolder;
|
|
||||||
import com.facebook.react.bridge.ReactApplicationContext;
|
|
||||||
import com.facebook.react.bridge.UIManager;
|
|
||||||
import com.facebook.react.fabric.ComponentFactory;
|
|
||||||
import com.facebook.react.fabric.CoreComponentsRegistry;
|
|
||||||
import com.facebook.react.fabric.FabricJSIModuleProvider;
|
|
||||||
import com.facebook.react.fabric.ReactNativeConfig;
|
|
||||||
import com.facebook.react.uimanager.ViewManagerRegistry;
|
|
||||||
import com.example.BuildConfig;
|
|
||||||
import com.example.newarchitecture.components.MainComponentsRegistry;
|
|
||||||
import com.example.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both
|
|
||||||
* TurboModule delegates and the Fabric Renderer.
|
|
||||||
*
|
|
||||||
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
|
|
||||||
* `newArchEnabled` property). Is ignored otherwise.
|
|
||||||
*/
|
|
||||||
public class MainApplicationReactNativeHost extends ReactNativeHost {
|
|
||||||
public MainApplicationReactNativeHost(Application application) {
|
|
||||||
super(application);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getUseDeveloperSupport() {
|
|
||||||
return BuildConfig.DEBUG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<ReactPackage> getPackages() {
|
|
||||||
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
||||||
// Packages that cannot be autolinked yet can be added manually here, for example:
|
|
||||||
// packages.add(new MyReactNativePackage());
|
|
||||||
// TurboModules must also be loaded here providing a valid TurboReactPackage implementation:
|
|
||||||
// packages.add(new TurboReactPackage() { ... });
|
|
||||||
// If you have custom Fabric Components, their ViewManagers should also be loaded here
|
|
||||||
// inside a ReactPackage.
|
|
||||||
return packages;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getJSMainModuleName() {
|
|
||||||
return "index";
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
protected ReactPackageTurboModuleManagerDelegate.Builder
|
|
||||||
getReactPackageTurboModuleManagerDelegateBuilder() {
|
|
||||||
// Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary
|
|
||||||
// for the new architecture and to use TurboModules correctly.
|
|
||||||
return new MainApplicationTurboModuleManagerDelegate.Builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected JSIModulePackage getJSIModulePackage() {
|
|
||||||
return new JSIModulePackage() {
|
|
||||||
@Override
|
|
||||||
public List<JSIModuleSpec> getJSIModules(
|
|
||||||
final ReactApplicationContext reactApplicationContext,
|
|
||||||
final JavaScriptContextHolder jsContext) {
|
|
||||||
final List<JSIModuleSpec> specs = new ArrayList<>();
|
|
||||||
|
|
||||||
// Here we provide a new JSIModuleSpec that will be responsible of providing the
|
|
||||||
// custom Fabric Components.
|
|
||||||
specs.add(
|
|
||||||
new JSIModuleSpec() {
|
|
||||||
@Override
|
|
||||||
public JSIModuleType getJSIModuleType() {
|
|
||||||
return JSIModuleType.UIManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSIModuleProvider<UIManager> getJSIModuleProvider() {
|
|
||||||
final ComponentFactory componentFactory = new ComponentFactory();
|
|
||||||
CoreComponentsRegistry.register(componentFactory);
|
|
||||||
|
|
||||||
// Here we register a Components Registry.
|
|
||||||
// The one that is generated with the template contains no components
|
|
||||||
// and just provides you the one from React Native core.
|
|
||||||
MainComponentsRegistry.register(componentFactory);
|
|
||||||
|
|
||||||
final ReactInstanceManager reactInstanceManager = getReactInstanceManager();
|
|
||||||
|
|
||||||
ViewManagerRegistry viewManagerRegistry =
|
|
||||||
new ViewManagerRegistry(
|
|
||||||
reactInstanceManager.getOrCreateViewManagers(reactApplicationContext));
|
|
||||||
|
|
||||||
return new FabricJSIModuleProvider(
|
|
||||||
reactApplicationContext,
|
|
||||||
componentFactory,
|
|
||||||
ReactNativeConfig.DEFAULT_CONFIG,
|
|
||||||
viewManagerRegistry);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return specs;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.example.newarchitecture.components;
|
|
||||||
|
|
||||||
import com.facebook.jni.HybridData;
|
|
||||||
import com.facebook.proguard.annotations.DoNotStrip;
|
|
||||||
import com.facebook.react.fabric.ComponentFactory;
|
|
||||||
import com.facebook.soloader.SoLoader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class responsible to load the custom Fabric Components. This class has native methods and needs a
|
|
||||||
* corresponding C++ implementation/header file to work correctly (already placed inside the jni/
|
|
||||||
* folder for you).
|
|
||||||
*
|
|
||||||
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
|
|
||||||
* `newArchEnabled` property). Is ignored otherwise.
|
|
||||||
*/
|
|
||||||
@DoNotStrip
|
|
||||||
public class MainComponentsRegistry {
|
|
||||||
static {
|
|
||||||
SoLoader.loadLibrary("fabricjni");
|
|
||||||
}
|
|
||||||
|
|
||||||
@DoNotStrip private final HybridData mHybridData;
|
|
||||||
|
|
||||||
@DoNotStrip
|
|
||||||
private native HybridData initHybrid(ComponentFactory componentFactory);
|
|
||||||
|
|
||||||
@DoNotStrip
|
|
||||||
private MainComponentsRegistry(ComponentFactory componentFactory) {
|
|
||||||
mHybridData = initHybrid(componentFactory);
|
|
||||||
}
|
|
||||||
|
|
||||||
@DoNotStrip
|
|
||||||
public static MainComponentsRegistry register(ComponentFactory componentFactory) {
|
|
||||||
return new MainComponentsRegistry(componentFactory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package com.example.newarchitecture.modules;
|
|
||||||
|
|
||||||
import com.facebook.jni.HybridData;
|
|
||||||
import com.facebook.react.ReactPackage;
|
|
||||||
import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
|
|
||||||
import com.facebook.react.bridge.ReactApplicationContext;
|
|
||||||
import com.facebook.soloader.SoLoader;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class responsible to load the TurboModules. This class has native methods and needs a
|
|
||||||
* corresponding C++ implementation/header file to work correctly (already placed inside the jni/
|
|
||||||
* folder for you).
|
|
||||||
*
|
|
||||||
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
|
|
||||||
* `newArchEnabled` property). Is ignored otherwise.
|
|
||||||
*/
|
|
||||||
public class MainApplicationTurboModuleManagerDelegate
|
|
||||||
extends ReactPackageTurboModuleManagerDelegate {
|
|
||||||
|
|
||||||
private static volatile boolean sIsSoLibraryLoaded;
|
|
||||||
|
|
||||||
protected MainApplicationTurboModuleManagerDelegate(
|
|
||||||
ReactApplicationContext reactApplicationContext, List<ReactPackage> packages) {
|
|
||||||
super(reactApplicationContext, packages);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected native HybridData initHybrid();
|
|
||||||
|
|
||||||
native boolean canCreateTurboModule(String moduleName);
|
|
||||||
|
|
||||||
public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder {
|
|
||||||
protected MainApplicationTurboModuleManagerDelegate build(
|
|
||||||
ReactApplicationContext context, List<ReactPackage> packages) {
|
|
||||||
return new MainApplicationTurboModuleManagerDelegate(context, packages);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected synchronized void maybeLoadOtherSoLibraries() {
|
|
||||||
if (!sIsSoLibraryLoaded) {
|
|
||||||
// If you change the name of your application .so file in the Android.mk file,
|
|
||||||
// make sure you update the name here as well.
|
|
||||||
SoLoader.loadLibrary("example_appmodules");
|
|
||||||
sIsSoLibraryLoaded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
THIS_DIR := $(call my-dir)
|
|
||||||
|
|
||||||
include $(REACT_ANDROID_DIR)/Android-prebuilt.mk
|
|
||||||
|
|
||||||
# If you wish to add a custom TurboModule or Fabric component in your app you
|
|
||||||
# will have to include the following autogenerated makefile.
|
|
||||||
# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_PATH := $(THIS_DIR)
|
|
||||||
|
|
||||||
# You can customize the name of your application .so file here.
|
|
||||||
LOCAL_MODULE := example_appmodules
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)
|
|
||||||
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
|
|
||||||
|
|
||||||
# If you wish to add a custom TurboModule or Fabric component in your app you
|
|
||||||
# will have to uncomment those lines to include the generated source
|
|
||||||
# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni)
|
|
||||||
#
|
|
||||||
# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
|
|
||||||
# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp)
|
|
||||||
# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
|
|
||||||
|
|
||||||
# Here you should add any native library you wish to depend on.
|
|
||||||
LOCAL_SHARED_LIBRARIES := \
|
|
||||||
libfabricjni \
|
|
||||||
libfbjni \
|
|
||||||
libfolly_runtime \
|
|
||||||
libglog \
|
|
||||||
libjsi \
|
|
||||||
libreact_codegen_rncore \
|
|
||||||
libreact_debug \
|
|
||||||
libreact_nativemodule_core \
|
|
||||||
libreact_render_componentregistry \
|
|
||||||
libreact_render_core \
|
|
||||||
libreact_render_debug \
|
|
||||||
libreact_render_graphics \
|
|
||||||
librrc_view \
|
|
||||||
libruntimeexecutor \
|
|
||||||
libturbomodulejsijni \
|
|
||||||
libyoga
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall
|
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#include "MainApplicationModuleProvider.h"
|
|
||||||
|
|
||||||
#include <rncore.h>
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
std::shared_ptr<TurboModule> 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);
|
|
||||||
return rncore_ModuleProvider(moduleName, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <ReactCommon/JavaTurboModule.h>
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
|
|
||||||
const std::string moduleName,
|
|
||||||
const JavaTurboModule::InitParams ¶ms);
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#include "MainApplicationTurboModuleManagerDelegate.h"
|
|
||||||
#include "MainApplicationModuleProvider.h"
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
jni::local_ref<MainApplicationTurboModuleManagerDelegate::jhybriddata>
|
|
||||||
MainApplicationTurboModuleManagerDelegate::initHybrid(
|
|
||||||
jni::alias_ref<jhybridobject>) {
|
|
||||||
return makeCxxInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainApplicationTurboModuleManagerDelegate::registerNatives() {
|
|
||||||
registerHybrid({
|
|
||||||
makeNativeMethod(
|
|
||||||
"initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
|
|
||||||
makeNativeMethod(
|
|
||||||
"canCreateTurboModule",
|
|
||||||
MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<TurboModule>
|
|
||||||
MainApplicationTurboModuleManagerDelegate::getTurboModule(
|
|
||||||
const std::string name,
|
|
||||||
const std::shared_ptr<CallInvoker> jsInvoker) {
|
|
||||||
// Not implemented yet: provide pure-C++ NativeModules here.
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<TurboModule>
|
|
||||||
MainApplicationTurboModuleManagerDelegate::getTurboModule(
|
|
||||||
const std::string name,
|
|
||||||
const JavaTurboModule::InitParams ¶ms) {
|
|
||||||
return MainApplicationModuleProvider(name, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
|
|
||||||
std::string name) {
|
|
||||||
return getTurboModule(name, nullptr) != nullptr ||
|
|
||||||
getTurboModule(name, {.moduleName = name}) != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <ReactCommon/TurboModuleManagerDelegate.h>
|
|
||||||
#include <fbjni/fbjni.h>
|
|
||||||
|
|
||||||
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 =
|
|
||||||
"Lcom/example/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;";
|
|
||||||
|
|
||||||
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
|
|
||||||
|
|
||||||
static void registerNatives();
|
|
||||||
|
|
||||||
std::shared_ptr<TurboModule> getTurboModule(
|
|
||||||
const std::string name,
|
|
||||||
const std::shared_ptr<CallInvoker> jsInvoker) override;
|
|
||||||
std::shared_ptr<TurboModule> 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(std::string name);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#include "MainComponentsRegistry.h"
|
|
||||||
|
|
||||||
#include <CoreComponentsRegistry.h>
|
|
||||||
#include <fbjni/fbjni.h>
|
|
||||||
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
|
|
||||||
#include <react/renderer/components/rncore/ComponentDescriptors.h>
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
|
|
||||||
|
|
||||||
std::shared_ptr<ComponentDescriptorProviderRegistry const>
|
|
||||||
MainComponentsRegistry::sharedProviderRegistry() {
|
|
||||||
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
|
|
||||||
|
|
||||||
// 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::jhybriddata>
|
|
||||||
MainComponentsRegistry::initHybrid(
|
|
||||||
jni::alias_ref<jclass>,
|
|
||||||
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<ComponentDescriptorRegistry>(registry);
|
|
||||||
|
|
||||||
mutableRegistry->setFallbackComponentDescriptor(
|
|
||||||
std::make_shared<UnimplementedNativeViewComponentDescriptor>(
|
|
||||||
ComponentDescriptorParameters{
|
|
||||||
eventDispatcher, contextContainer, nullptr}));
|
|
||||||
|
|
||||||
return registry;
|
|
||||||
};
|
|
||||||
|
|
||||||
delegate->buildRegistryFunction = buildRegistryFunction;
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainComponentsRegistry::registerNatives() {
|
|
||||||
registerHybrid({
|
|
||||||
makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ComponentFactory.h>
|
|
||||||
#include <fbjni/fbjni.h>
|
|
||||||
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
|
|
||||||
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
class MainComponentsRegistry
|
|
||||||
: public facebook::jni::HybridClass<MainComponentsRegistry> {
|
|
||||||
public:
|
|
||||||
// Adapt it to the package you used for your Java class.
|
|
||||||
constexpr static auto kJavaDescriptor =
|
|
||||||
"Lcom/example/newarchitecture/components/MainComponentsRegistry;";
|
|
||||||
|
|
||||||
static void registerNatives();
|
|
||||||
|
|
||||||
MainComponentsRegistry(ComponentFactory *delegate);
|
|
||||||
|
|
||||||
private:
|
|
||||||
static std::shared_ptr<ComponentDescriptorProviderRegistry const>
|
|
||||||
sharedProviderRegistry();
|
|
||||||
|
|
||||||
static jni::local_ref<jhybriddata> initHybrid(
|
|
||||||
jni::alias_ref<jclass>,
|
|
||||||
ComponentFactory *delegate);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#include <fbjni/fbjni.h>
|
|
||||||
#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();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
|
*
|
||||||
|
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
|
||||||
|
* directory of this source tree.
|
||||||
|
*/
|
||||||
|
package com.example;
|
||||||
|
import android.content.Context;
|
||||||
|
import com.facebook.react.ReactInstanceManager;
|
||||||
|
/**
|
||||||
|
* Class responsible of loading Flipper inside your React Native application. This is the release
|
||||||
|
* flavor of it so it's empty as we don't want to load Flipper.
|
||||||
|
*/
|
||||||
|
public class ReactNativeFlipper {
|
||||||
|
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
|
||||||
|
// Do nothing as we don't want to initialize Flipper on Release.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,53 +1,21 @@
|
|||||||
import org.apache.tools.ant.taskdefs.condition.Os
|
|
||||||
|
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
buildToolsVersion = "31.0.0"
|
buildToolsVersion = "33.0.0"
|
||||||
minSdkVersion = 21
|
minSdkVersion = 21
|
||||||
compileSdkVersion = 31
|
compileSdkVersion = 33
|
||||||
targetSdkVersion = 31
|
targetSdkVersion = 33
|
||||||
|
|
||||||
if (System.properties['os.arch'] == "aarch64") {
|
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
|
||||||
// For M1 Users we need to use the NDK 24 which added support for aarch64
|
ndkVersion = "23.1.7779620"
|
||||||
ndkVersion = "24.0.8215888"
|
|
||||||
} else {
|
|
||||||
// Otherwise we default to the side-by-side NDK version from AGP.
|
|
||||||
ndkVersion = "21.4.7075529"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath("com.android.tools.build:gradle:7.1.1")
|
classpath("com.android.tools.build:gradle")
|
||||||
classpath("com.facebook.react:react-native-gradle-plugin")
|
classpath("com.facebook.react:react-native-gradle-plugin")
|
||||||
classpath("de.undercouch:gradle-download-task:5.0.1")
|
|
||||||
// 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' }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -25,7 +25,7 @@ android.useAndroidX=true
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
|
|
||||||
# Version of flipper SDK to use with React Native
|
# Version of flipper SDK to use with React Native
|
||||||
FLIPPER_VERSION=0.125.0
|
FLIPPER_VERSION=0.182.0
|
||||||
|
|
||||||
# Use this property to specify which architecture you want to build.
|
# Use this property to specify which architecture you want to build.
|
||||||
# You can also override it from the CLI using
|
# You can also override it from the CLI using
|
||||||
@@ -38,3 +38,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
|
|||||||
# to write custom TurboModules/Fabric components OR use libraries that
|
# to write custom TurboModules/Fabric components OR use libraries that
|
||||||
# are providing them.
|
# are providing them.
|
||||||
newArchEnabled=false
|
newArchEnabled=false
|
||||||
|
|
||||||
|
# Use this property to enable or disable the Hermes JS engine.
|
||||||
|
# If set to false, you will be using JSC instead.
|
||||||
|
hermesEnabled=true
|
||||||
BIN
example/android/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
example/android/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
@@ -1,5 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip
|
||||||
|
networkTimeout=10000
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
20
example/android/gradlew
vendored
20
example/android/gradlew
vendored
@@ -55,7 +55,7 @@
|
|||||||
# Darwin, MinGW, and NonStop.
|
# Darwin, MinGW, and NonStop.
|
||||||
#
|
#
|
||||||
# (3) This script is generated from the Groovy template
|
# (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
|
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
# within the Gradle project.
|
# within the Gradle project.
|
||||||
#
|
#
|
||||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
@@ -80,10 +80,10 @@ do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
# This is normally unused
|
||||||
|
# shellcheck disable=SC2034
|
||||||
APP_NAME="Gradle"
|
|
||||||
APP_BASE_NAME=${0##*/}
|
APP_BASE_NAME=${0##*/}
|
||||||
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# 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"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
@@ -143,12 +143,16 @@ fi
|
|||||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
case $MAX_FD in #(
|
case $MAX_FD in #(
|
||||||
max*)
|
max*)
|
||||||
|
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||||
|
# shellcheck disable=SC3045
|
||||||
MAX_FD=$( ulimit -H -n ) ||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
warn "Could not query maximum file descriptor limit"
|
warn "Could not query maximum file descriptor limit"
|
||||||
esac
|
esac
|
||||||
case $MAX_FD in #(
|
case $MAX_FD in #(
|
||||||
'' | soft) :;; #(
|
'' | soft) :;; #(
|
||||||
*)
|
*)
|
||||||
|
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||||
|
# shellcheck disable=SC3045
|
||||||
ulimit -n "$MAX_FD" ||
|
ulimit -n "$MAX_FD" ||
|
||||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
esac
|
esac
|
||||||
@@ -205,6 +209,12 @@ set -- \
|
|||||||
org.gradle.wrapper.GradleWrapperMain \
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
"$@"
|
"$@"
|
||||||
|
|
||||||
|
# Stop when "xargs" is not available.
|
||||||
|
if ! command -v xargs >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "xargs is not available"
|
||||||
|
fi
|
||||||
|
|
||||||
# Use "xargs" to parse quoted args.
|
# Use "xargs" to parse quoted args.
|
||||||
#
|
#
|
||||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
@@ -231,4 +241,4 @@ eval "set -- $(
|
|||||||
tr '\n' ' '
|
tr '\n' ' '
|
||||||
)" '"$@"'
|
)" '"$@"'
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
17
example/android/gradlew.bat
vendored
17
example/android/gradlew.bat
vendored
@@ -14,7 +14,7 @@
|
|||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%"=="" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@rem Gradle startup script for Windows
|
@rem Gradle startup script for Windows
|
||||||
@@ -25,7 +25,8 @@
|
|||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%"=="" set DIRNAME=.
|
||||||
|
@rem This is normally unused
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto execute
|
if %ERRORLEVEL% equ 0 goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
@@ -75,15 +76,17 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||||
|
|
||||||
:fail
|
:fail
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
rem the _cmd.exe /c_ return code!
|
rem the _cmd.exe /c_ return code!
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
set EXIT_CODE=%ERRORLEVEL%
|
||||||
exit /b 1
|
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||||
|
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||||
|
exit /b %EXIT_CODE%
|
||||||
|
|
||||||
:mainEnd
|
:mainEnd
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
:omega
|
:omega
|
||||||
@@ -1,11 +1,4 @@
|
|||||||
rootProject.name = 'example'
|
rootProject.name = 'example'
|
||||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
|
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
|
||||||
include ':app'
|
include ':app'
|
||||||
includeBuild('../node_modules/react-native-gradle-plugin')
|
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')
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,29 @@
|
|||||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
# Resolve react_native_pods.rb with node to allow for hoisting
|
||||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
require Pod::Executable.execute_command('node', ['-p',
|
||||||
|
'require.resolve(
|
||||||
|
"react-native/scripts/react_native_pods.rb",
|
||||||
|
{paths: [process.argv[1]]},
|
||||||
|
)', __dir__]).strip
|
||||||
|
|
||||||
platform :ios, '12.4'
|
platform :ios, min_ios_version_supported
|
||||||
install! 'cocoapods', :deterministic_uuids => false
|
prepare_react_native_project!
|
||||||
|
|
||||||
production = ENV["PRODUCTION"] == "1"
|
# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set.
|
||||||
|
# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded
|
||||||
|
#
|
||||||
|
# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js`
|
||||||
|
# ```js
|
||||||
|
# module.exports = {
|
||||||
|
# dependencies: {
|
||||||
|
# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}),
|
||||||
|
# ```
|
||||||
|
flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled
|
||||||
|
|
||||||
|
linkage = ENV['USE_FRAMEWORKS']
|
||||||
|
if linkage != nil
|
||||||
|
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
|
||||||
|
use_frameworks! :linkage => linkage.to_sym
|
||||||
|
end
|
||||||
|
|
||||||
target 'example' do
|
target 'example' do
|
||||||
config = use_native_modules!
|
config = use_native_modules!
|
||||||
@@ -14,11 +33,14 @@ target 'example' do
|
|||||||
|
|
||||||
use_react_native!(
|
use_react_native!(
|
||||||
:path => config[:reactNativePath],
|
:path => config[:reactNativePath],
|
||||||
# to enable hermes on iOS, change `false` to `true` and then install pods
|
# Hermes is now enabled by default. Disable by setting this flag to false.
|
||||||
:production => production,
|
|
||||||
:hermes_enabled => flags[:hermes_enabled],
|
:hermes_enabled => flags[:hermes_enabled],
|
||||||
:fabric_enabled => flags[:fabric_enabled],
|
:fabric_enabled => flags[:fabric_enabled],
|
||||||
:flipper_configuration => FlipperConfiguration.enabled,
|
# Enables Flipper.
|
||||||
|
#
|
||||||
|
# Note that if you have use_frameworks! enabled, Flipper will not work and
|
||||||
|
# you should disable the next line.
|
||||||
|
:flipper_configuration => flipper_config,
|
||||||
# An absolute path to your application root.
|
# An absolute path to your application root.
|
||||||
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
||||||
)
|
)
|
||||||
@@ -29,7 +51,12 @@ target 'example' do
|
|||||||
end
|
end
|
||||||
|
|
||||||
post_install do |installer|
|
post_install do |installer|
|
||||||
react_native_post_install(installer)
|
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
|
||||||
|
react_native_post_install(
|
||||||
|
installer,
|
||||||
|
config[:reactNativePath],
|
||||||
|
:mac_catalyst_enabled => false
|
||||||
|
)
|
||||||
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,6 @@
|
|||||||
#import <React/RCTBridgeDelegate.h>
|
#import <RCTAppDelegate.h>
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
|
@interface AppDelegate : RCTAppDelegate
|
||||||
|
|
||||||
@property (nonatomic, strong) UIWindow *window;
|
@end
|
||||||
|
|
||||||
@end
|
|
||||||
@@ -1,87 +1,17 @@
|
|||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
#import <React/RCTBridge.h>
|
|
||||||
#import <React/RCTBundleURLProvider.h>
|
#import <React/RCTBundleURLProvider.h>
|
||||||
#import <React/RCTRootView.h>
|
|
||||||
|
|
||||||
#import <React/RCTAppSetupUtils.h>
|
|
||||||
|
|
||||||
#import <RNBackgroundDownloader.h>
|
|
||||||
|
|
||||||
#if RCT_NEW_ARCH_ENABLED
|
|
||||||
#import <React/CoreModulesPlugins.h>
|
|
||||||
#import <React/RCTCxxBridgeDelegate.h>
|
|
||||||
#import <React/RCTFabricSurfaceHostingProxyRootView.h>
|
|
||||||
#import <React/RCTSurfacePresenter.h>
|
|
||||||
#import <React/RCTSurfacePresenterBridgeAdapter.h>
|
|
||||||
#import <ReactCommon/RCTTurboModuleManager.h>
|
|
||||||
|
|
||||||
#import <react/config/ReactNativeConfig.h>
|
|
||||||
|
|
||||||
static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
|
||||||
|
|
||||||
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
|
|
||||||
RCTTurboModuleManager *_turboModuleManager;
|
|
||||||
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
|
|
||||||
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
|
|
||||||
facebook::react::ContextContainer::Shared _contextContainer;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||||
{
|
{
|
||||||
RCTAppSetupPrepareApp(application);
|
self.moduleName = @"example";
|
||||||
|
// You can add your custom initial props in the dictionary below.
|
||||||
|
// They will be passed down to the ViewController used by React Native.
|
||||||
|
self.initialProps = @{};
|
||||||
|
|
||||||
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
|
return [super application:application didFinishLaunchingWithOptions:launchOptions];
|
||||||
|
|
||||||
#if RCT_NEW_ARCH_ENABLED
|
|
||||||
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
|
|
||||||
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
|
|
||||||
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
|
|
||||||
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
|
|
||||||
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NSDictionary *initProps = [self prepareInitialProps];
|
|
||||||
UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"example", initProps);
|
|
||||||
|
|
||||||
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
|
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
||||||
@@ -93,48 +23,4 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if RCT_NEW_ARCH_ENABLED
|
@end
|
||||||
|
|
||||||
#pragma mark - RCTCxxBridgeDelegate
|
|
||||||
|
|
||||||
- (std::unique_ptr<facebook::react::JSExecutorFactory>)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<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
|
|
||||||
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
|
|
||||||
initParams:
|
|
||||||
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
|
|
||||||
{
|
|
||||||
return RCTAppSetupDefaultModuleFromClass(moduleClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler
|
|
||||||
{
|
|
||||||
[RNBackgroundDownloader setCompletionHandlerWithIdentifier:identifier completionHandler:completionHandler];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
@@ -17,11 +17,11 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.0</string>
|
<string>$(MARKETING_VERSION)</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
/**
|
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
|
||||||
* Metro configuration for React Native
|
|
||||||
* https://github.com/facebook/react-native
|
|
||||||
*
|
|
||||||
* @format
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = {
|
/**
|
||||||
transformer: {
|
* Metro configuration
|
||||||
getTransformOptions: async () => ({
|
* https://facebook.github.io/metro/docs/configuration
|
||||||
transform: {
|
*
|
||||||
experimentalImportSupport: false,
|
* @type {import('metro-config').MetroConfig}
|
||||||
inlineRequires: true,
|
*/
|
||||||
},
|
const config = {};
|
||||||
}),
|
|
||||||
},
|
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
|
||||||
};
|
|
||||||
@@ -4,36 +4,45 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
"ios": "react-native run-ios",
|
"ios": "react-native run-ios --simulator=\"iPhone 15 Pro\"",
|
||||||
|
"open:ios" : "open ios/example.xcworkspace",
|
||||||
"start": "react-native start",
|
"start": "react-native start",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kesha-antonov/react-native-background-downloader": "^2.7.2",
|
"@kesha-antonov/react-native-background-downloader": "^2.9.0",
|
||||||
"@react-native-community/slider": "^4.4.2",
|
"@react-native-community/slider": "^4.4.3",
|
||||||
"@react-navigation/native": "^6.1.6",
|
"@react-navigation/native": "^6.1.9",
|
||||||
"@react-navigation/stack": "^6.3.16",
|
"@react-navigation/stack": "^6.3.20",
|
||||||
"react": "18.0.0",
|
"react": "18.2.0",
|
||||||
"react-native": "0.69.8",
|
"react-native": "0.72.6",
|
||||||
"react-native-fs": "^2.20.0",
|
"react-native-fs": "^2.20.0",
|
||||||
"react-native-gesture-handler": "^2.9.0",
|
"react-native-gesture-handler": "^2.13.4",
|
||||||
"react-native-root-siblings": "^4.1.1",
|
"react-native-root-siblings": "^5.0.1",
|
||||||
"react-native-root-toast": "^3.4.1",
|
"react-native-root-toast": "^3.5.1",
|
||||||
"react-native-safe-area-context": "^4.5.0",
|
"react-native-safe-area-context": "^4.7.4",
|
||||||
"react-native-screens": "^3.20.0"
|
"react-native-screens": "^3.27.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.12.9",
|
"@babel/core": "^7.20.0",
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/preset-env": "^7.20.0",
|
||||||
"@react-native-community/eslint-config": "^2.0.0",
|
"@babel/runtime": "^7.20.0",
|
||||||
"babel-jest": "^26.6.3",
|
"@react-native/eslint-config": "^0.72.2",
|
||||||
"eslint": "^7.32.0",
|
"@react-native/metro-config": "^0.72.11",
|
||||||
"jest": "^26.6.3",
|
"@tsconfig/react-native": "^3.0.0",
|
||||||
"metro-react-native-babel-preset": "^0.70.3",
|
"@types/react": "^18.0.24",
|
||||||
"react-test-renderer": "18.0.0"
|
"@types/react-test-renderer": "^18.0.0",
|
||||||
|
"babel-jest": "^29.2.1",
|
||||||
|
"eslint": "^8.19.0",
|
||||||
|
"jest": "^29.2.1",
|
||||||
|
"metro-react-native-babel-preset": "0.76.8",
|
||||||
|
"prettier": "^2.4.1",
|
||||||
|
"react-test-renderer": "18.2.0",
|
||||||
|
"typescript": "4.8.4"
|
||||||
|
|
||||||
},
|
},
|
||||||
"jest": {
|
"engines": {
|
||||||
"preset": "react-native"
|
"node": ">=16"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import Toast from 'react-native-root-toast';
|
import Toast from 'react-native-root-toast';
|
||||||
import {initialWindowMetrics} from 'react-native-safe-area-context';
|
import {initialWindowMetrics} from 'react-native-safe-area-context';
|
||||||
|
|
||||||
const safeTopInset = initialWindowMetrics.insets.top
|
const safeTopInset =
|
||||||
? initialWindowMetrics.insets.top + 50
|
initialWindowMetrics != null && initialWindowMetrics.insets.top
|
||||||
: 100;
|
? initialWindowMetrics.insets.top + 50
|
||||||
|
: 100;
|
||||||
|
|
||||||
export const uuid = () => Math.random().toString(36).substring(2, 6);
|
export const uuid = () => Math.random().toString(36).substring(2, 6);
|
||||||
export const toast = (message, duration = 750, position = safeTopInset) => {
|
export const toast = (message, duration = 750, position = safeTopInset) => {
|
||||||
3
example/tsconfig.json
Normal file
3
example/tsconfig.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": "@tsconfig/react-native/tsconfig.json"
|
||||||
|
}
|
||||||
5720
example/yarn.lock
5720
example/yarn.lock
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user