Sfoglia il codice sorgente

Initial commit

Generated by create-react-native-app 3.8.0.
andrea.nieves7 1 anno fa
commit
beb6837397
73 ha cambiato i file con 9595 aggiunte e 0 eliminazioni
  1. 6
    0
      .buckconfig
  2. 1
    0
      .gitattributes
  3. 56
    0
      .gitignore
  4. 21
    0
      App.js
  5. 21
    0
      android/.gitignore
  6. 55
    0
      android/app/BUCK
  7. 362
    0
      android/app/build.gradle
  8. 19
    0
      android/app/build_defs.bzl
  9. BIN
      android/app/debug.keystore
  10. 14
    0
      android/app/proguard-rules.pro
  11. 7
    0
      android/app/src/debug/AndroidManifest.xml
  12. 69
    0
      android/app/src/debug/java/com/test/ReactNativeFlipper.java
  13. 32
    0
      android/app/src/main/AndroidManifest.xml
  14. 83
    0
      android/app/src/main/java/com/test/MainActivity.java
  15. 106
    0
      android/app/src/main/java/com/test/MainApplication.java
  16. 117
    0
      android/app/src/main/java/com/test/newarchitecture/MainApplicationReactNativeHost.java
  17. 36
    0
      android/app/src/main/java/com/test/newarchitecture/components/MainComponentsRegistry.java
  18. 48
    0
      android/app/src/main/java/com/test/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java
  19. 7
    0
      android/app/src/main/jni/CMakeLists.txt
  20. 32
    0
      android/app/src/main/jni/MainApplicationModuleProvider.cpp
  21. 16
    0
      android/app/src/main/jni/MainApplicationModuleProvider.h
  22. 45
    0
      android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp
  23. 38
    0
      android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h
  24. 65
    0
      android/app/src/main/jni/MainComponentsRegistry.cpp
  25. 32
    0
      android/app/src/main/jni/MainComponentsRegistry.h
  26. 11
    0
      android/app/src/main/jni/OnLoad.cpp
  27. 36
    0
      android/app/src/main/res/drawable/rn_edit_text_material.xml
  28. 4
    0
      android/app/src/main/res/drawable/splashscreen.xml
  29. BIN
      android/app/src/main/res/drawable/splashscreen_image.png
  30. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  31. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  32. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  33. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  34. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  35. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  36. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  37. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  38. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  39. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  40. 4
    0
      android/app/src/main/res/values/colors.xml
  41. 3
    0
      android/app/src/main/res/values/strings.xml
  42. 15
    0
      android/app/src/main/res/values/styles.xml
  43. 65
    0
      android/build.gradle
  44. 53
    0
      android/gradle.properties
  45. BIN
      android/gradle/wrapper/gradle-wrapper.jar
  46. 5
    0
      android/gradle/wrapper/gradle-wrapper.properties
  47. 240
    0
      android/gradlew
  48. 91
    0
      android/gradlew.bat
  49. 17
    0
      android/settings.gradle
  50. 11
    0
      app.json
  51. 6
    0
      babel.config.js
  52. 8
    0
      index.js
  53. 30
    0
      ios/.gitignore
  54. 11
    0
      ios/.xcode.env
  55. 61
    0
      ios/Podfile
  56. 3
    0
      ios/Podfile.properties.json
  57. 477
    0
      ios/Test.xcodeproj/project.pbxproj
  58. 88
    0
      ios/Test.xcodeproj/xcshareddata/xcschemes/Test.xcscheme
  59. 9
    0
      ios/Test/AppDelegate.h
  60. 166
    0
      ios/Test/AppDelegate.mm
  61. 38
    0
      ios/Test/Images.xcassets/AppIcon.appiconset/Contents.json
  62. 6
    0
      ios/Test/Images.xcassets/Contents.json
  63. 21
    0
      ios/Test/Images.xcassets/SplashScreen.imageset/Contents.json
  64. BIN
      ios/Test/Images.xcassets/SplashScreen.imageset/splashscreen.png
  65. 21
    0
      ios/Test/Images.xcassets/SplashScreenBackground.imageset/Contents.json
  66. BIN
      ios/Test/Images.xcassets/SplashScreenBackground.imageset/background.png
  67. 55
    0
      ios/Test/Info.plist
  68. 91
    0
      ios/Test/SplashScreen.storyboard
  69. 10
    0
      ios/Test/Supporting/Expo.plist
  70. 10
    0
      ios/Test/main.m
  71. 4
    0
      metro.config.js
  72. 22
    0
      package.json
  73. 6615
    0
      yarn.lock

+ 6
- 0
.buckconfig Vedi File

@@ -0,0 +1,6 @@
1
+
2
+[android]
3
+  target = Google Inc.:Google APIs:23
4
+
5
+[maven_repositories]
6
+  central = https://repo1.maven.org/maven2

+ 1
- 0
.gitattributes Vedi File

@@ -0,0 +1 @@
1
+*.pbxproj -text

+ 56
- 0
.gitignore Vedi File

@@ -0,0 +1,56 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+
25
+# Android/IntelliJ
26
+#
27
+build/
28
+.idea
29
+.gradle
30
+local.properties
31
+*.iml
32
+*.hprof
33
+.cxx/
34
+
35
+# node.js
36
+#
37
+node_modules/
38
+npm-debug.log
39
+yarn-error.log
40
+
41
+# BUCK
42
+buck-out/
43
+\.buckd/
44
+*.keystore
45
+!debug.keystore
46
+
47
+# Bundle artifacts
48
+*.jsbundle
49
+
50
+# CocoaPods
51
+/ios/Pods/
52
+
53
+# Expo
54
+.expo/
55
+web-build/
56
+dist/

+ 21
- 0
App.js Vedi File

@@ -0,0 +1,21 @@
1
+import { StatusBar } from 'expo-status-bar';
2
+import React from 'react';
3
+import { StyleSheet, Text, View } from 'react-native';
4
+
5
+export default function App() {
6
+  return (
7
+    <View style={styles.container}>
8
+      <Text>Open up App.js to start working on your app!</Text>
9
+      <StatusBar style="auto" />
10
+    </View>
11
+  );
12
+}
13
+
14
+const styles = StyleSheet.create({
15
+  container: {
16
+    flex: 1,
17
+    backgroundColor: '#fff',
18
+    alignItems: 'center',
19
+    justifyContent: 'center',
20
+  },
21
+});

+ 21
- 0
android/.gitignore Vedi File

@@ -0,0 +1,21 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Android/IntelliJ
6
+#
7
+build/
8
+.idea
9
+.gradle
10
+local.properties
11
+*.iml
12
+*.hprof
13
+
14
+# BUCK
15
+buck-out/
16
+\.buckd/
17
+*.keystore
18
+!debug.keystore
19
+
20
+# Bundle artifacts
21
+*.jsbundle

+ 55
- 0
android/app/BUCK Vedi File

@@ -0,0 +1,55 @@
1
+# To learn about Buck see [Docs](https://buckbuild.com/).
2
+# To run your application with Buck:
3
+# - install Buck
4
+# - `npm start` - to start the packager
5
+# - `cd android`
6
+# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
7
+# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
8
+# - `buck install -r android/app` - compile, install and run application
9
+#
10
+
11
+load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
12
+
13
+lib_deps = []
14
+
15
+create_aar_targets(glob(["libs/*.aar"]))
16
+
17
+create_jar_targets(glob(["libs/*.jar"]))
18
+
19
+android_library(
20
+    name = "all-libs",
21
+    exported_deps = lib_deps,
22
+)
23
+
24
+android_library(
25
+    name = "app-code",
26
+    srcs = glob([
27
+        "src/main/java/**/*.java",
28
+    ]),
29
+    deps = [
30
+        ":all-libs",
31
+        ":build_config",
32
+        ":res",
33
+    ],
34
+)
35
+
36
+android_build_config(
37
+    name = "build_config",
38
+    package = "com.test",
39
+)
40
+
41
+android_resource(
42
+    name = "res",
43
+    package = "com.test",
44
+    res = "src/main/res",
45
+)
46
+
47
+android_binary(
48
+    name = "app",
49
+    keystore = "//android/keystores:debug",
50
+    manifest = "src/main/AndroidManifest.xml",
51
+    package_type = "debug",
52
+    deps = [
53
+        ":app-code",
54
+    ],
55
+)

+ 362
- 0
android/app/build.gradle Vedi File

@@ -0,0 +1,362 @@
1
+apply plugin: "com.android.application"
2
+
3
+import com.android.build.OutputFile
4
+
5
+/**
6
+ * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7
+ * and bundleReleaseJsAndAssets).
8
+ * These basically call `react-native bundle` with the correct arguments during the Android build
9
+ * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10
+ * bundle directly from the development server. Below you can see all the possible configurations
11
+ * and their defaults. If you decide to add a configuration block, make sure to add it before the
12
+ * `apply from: "../../node_modules/react-native/react.gradle"` line.
13
+ *
14
+ * project.ext.react = [
15
+ *   // the name of the generated asset file containing your JS bundle
16
+ *   bundleAssetName: "index.android.bundle",
17
+ *
18
+ *   // the entry file for bundle generation. If none specified and
19
+ *   // "index.android.js" exists, it will be used. Otherwise "index.js" is
20
+ *   // default. Can be overridden with ENTRY_FILE environment variable.
21
+ *   entryFile: "index.android.js",
22
+ *
23
+ *   // https://reactnative.dev/docs/performance#enable-the-ram-format
24
+ *   bundleCommand: "ram-bundle",
25
+ *
26
+ *   // whether to bundle JS and assets in debug mode
27
+ *   bundleInDebug: false,
28
+ *
29
+ *   // whether to bundle JS and assets in release mode
30
+ *   bundleInRelease: true,
31
+ *
32
+ *   // whether to bundle JS and assets in another build variant (if configured).
33
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
34
+ *   // The configuration property can be in the following formats
35
+ *   //         'bundleIn${productFlavor}${buildType}'
36
+ *   //         'bundleIn${buildType}'
37
+ *   // bundleInFreeDebug: true,
38
+ *   // bundleInPaidRelease: true,
39
+ *   // bundleInBeta: true,
40
+ *
41
+ *   // whether to disable dev mode in custom build variants (by default only disabled in release)
42
+ *   // for example: to disable dev mode in the staging build type (if configured)
43
+ *   devDisabledInStaging: true,
44
+ *   // The configuration property can be in the following formats
45
+ *   //         'devDisabledIn${productFlavor}${buildType}'
46
+ *   //         'devDisabledIn${buildType}'
47
+ *
48
+ *   // the root of your project, i.e. where "package.json" lives
49
+ *   root: "../../",
50
+ *
51
+ *   // where to put the JS bundle asset in debug mode
52
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
53
+ *
54
+ *   // where to put the JS bundle asset in release mode
55
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
56
+ *
57
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
58
+ *   // require('./image.png')), in debug mode
59
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
60
+ *
61
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
62
+ *   // require('./image.png')), in release mode
63
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
64
+ *
65
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
66
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
67
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
68
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
69
+ *   // for example, you might want to remove it from here.
70
+ *   inputExcludes: ["android/**", "ios/**"],
71
+ *
72
+ *   // override which node gets called and with what additional arguments
73
+ *   nodeExecutableAndArgs: ["node"],
74
+ *
75
+ *   // supply additional arguments to the packager
76
+ *   extraPackagerArgs: []
77
+ * ]
78
+ */
79
+
80
+def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
81
+
82
+def reactNativeRoot = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath()
83
+
84
+project.ext.react = [
85
+    entryFile: ["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android"].execute(null, rootDir).text.trim(),
86
+    enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes",
87
+    hermesCommand: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc",
88
+    cliPath: "${reactNativeRoot}/cli.js",
89
+    composeSourceMapsPath: "${reactNativeRoot}/scripts/compose-source-maps.js",
90
+]
91
+
92
+apply from: new File(reactNativeRoot, "react.gradle")
93
+
94
+/**
95
+ * Set this to true to create two separate APKs instead of one:
96
+ *   - An APK that only works on ARM devices
97
+ *   - An APK that only works on x86 devices
98
+ * The advantage is the size of the APK is reduced by about 4MB.
99
+ * Upload all the APKs to the Play Store and people will download
100
+ * the correct one based on the CPU architecture of their device.
101
+ */
102
+def enableSeparateBuildPerCPUArchitecture = false
103
+
104
+/**
105
+ * Run Proguard to shrink the Java bytecode in release builds.
106
+ */
107
+def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean()
108
+
109
+/**
110
+ * The preferred build flavor of JavaScriptCore.
111
+ *
112
+ * For example, to use the international variant, you can use:
113
+ * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
114
+ *
115
+ * The international variant includes ICU i18n library and necessary data
116
+ * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
117
+ * give correct results when using with locales other than en-US.  Note that
118
+ * this variant is about 6MiB larger per architecture than default.
119
+ */
120
+def jscFlavor = 'org.webkit:android-jsc:+'
121
+
122
+/**
123
+ * Whether to enable the Hermes VM.
124
+ *
125
+ * This should be set on project.ext.react and that value will be read here. If it is not set
126
+ * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
127
+ * and the benefits of using Hermes will therefore be sharply reduced.
128
+ */
129
+def enableHermes = project.ext.react.get("enableHermes", false);
130
+
131
+/**
132
+ * Architectures to build native code for.
133
+ */
134
+def reactNativeArchitectures() {
135
+    def value = project.getProperties().get("reactNativeArchitectures")
136
+    return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
137
+}
138
+
139
+android {
140
+    ndkVersion rootProject.ext.ndkVersion
141
+
142
+    compileSdkVersion rootProject.ext.compileSdkVersion
143
+
144
+    defaultConfig {
145
+        applicationId "com.test"
146
+        minSdkVersion rootProject.ext.minSdkVersion
147
+        targetSdkVersion rootProject.ext.targetSdkVersion
148
+        versionCode 1
149
+        versionName "1.0"
150
+        buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
151
+
152
+        if (isNewArchitectureEnabled()) {
153
+            // We configure the CMake build only if you decide to opt-in for the New Architecture.
154
+            externalNativeBuild {
155
+                cmake {
156
+                    arguments "-DPROJECT_BUILD_DIR=$buildDir",
157
+                        "-DREACT_ANDROID_DIR=${reactNativeRoot}/ReactAndroid",
158
+                        "-DREACT_ANDROID_BUILD_DIR=${reactNativeRoot}/ReactAndroid/build",
159
+                        "-DNODE_MODULES_DIR=$rootDir/../node_modules",
160
+                        "-DANDROID_STL=c++_shared"
161
+                }
162
+            }
163
+            if (!enableSeparateBuildPerCPUArchitecture) {
164
+                ndk {
165
+                    abiFilters (*reactNativeArchitectures())
166
+                }
167
+            }
168
+        }
169
+    }
170
+
171
+    if (isNewArchitectureEnabled()) {
172
+        // We configure the CMake build only if you decide to opt-in for the New Architecture.
173
+        externalNativeBuild {
174
+            cmake {
175
+                path "$projectDir/src/main/jni/CMakeLists.txt"
176
+            }
177
+        }
178
+        def reactAndroidProjectDir = project(':ReactAndroid').projectDir
179
+        def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
180
+            dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
181
+            from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
182
+            into("$buildDir/react-ndk/exported")
183
+        }
184
+        def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
185
+            dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
186
+            from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
187
+            into("$buildDir/react-ndk/exported")
188
+        }
189
+        afterEvaluate {
190
+            // If you wish to add a custom TurboModule or component locally,
191
+            // you should uncomment this line.
192
+            // preBuild.dependsOn("generateCodegenArtifactsFromSchema")
193
+            preDebugBuild.dependsOn(packageReactNdkDebugLibs)
194
+            preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
195
+
196
+            // Due to a bug inside AGP, we have to explicitly set a dependency
197
+            // between configureCMakeDebug* tasks and the preBuild tasks.
198
+            // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
199
+            configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
200
+            configureCMakeDebug.dependsOn(preDebugBuild)
201
+            reactNativeArchitectures().each { architecture ->
202
+                tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
203
+                    dependsOn("preDebugBuild")
204
+                }
205
+                tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
206
+                    dependsOn("preReleaseBuild")
207
+                }
208
+            }
209
+        }
210
+    }
211
+
212
+    splits {
213
+        abi {
214
+            reset()
215
+            enable enableSeparateBuildPerCPUArchitecture
216
+            universalApk false  // If true, also generate a universal APK
217
+            include (*reactNativeArchitectures())
218
+        }
219
+    }
220
+    signingConfigs {
221
+        debug {
222
+            storeFile file('debug.keystore')
223
+            storePassword 'android'
224
+            keyAlias 'androiddebugkey'
225
+            keyPassword 'android'
226
+        }
227
+    }
228
+    buildTypes {
229
+        debug {
230
+            signingConfig signingConfigs.debug
231
+        }
232
+        release {
233
+            // Caution! In production, you need to generate your own keystore file.
234
+            // see https://reactnative.dev/docs/signed-apk-android.
235
+            signingConfig signingConfigs.debug
236
+            minifyEnabled enableProguardInReleaseBuilds
237
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
238
+        }
239
+    }
240
+
241
+    // applicationVariants are e.g. debug, release
242
+    applicationVariants.all { variant ->
243
+        variant.outputs.each { output ->
244
+            // For each separate APK per architecture, set a unique version code as described here:
245
+            // https://developer.android.com/studio/build/configure-apk-splits.html
246
+            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
247
+            def abi = output.getFilter(OutputFile.ABI)
248
+            if (abi != null) {  // null for the universal-debug, universal-release variants
249
+                output.versionCodeOverride =
250
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
251
+            }
252
+
253
+        }
254
+    }
255
+}
256
+
257
+// Apply static values from `gradle.properties` to the `android.packagingOptions`
258
+// Accepts values in comma delimited lists, example:
259
+// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini
260
+["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop ->
261
+    // Split option: 'foo,bar' -> ['foo', 'bar']
262
+    def options = (findProperty("android.packagingOptions.$prop") ?: "").split(",");
263
+    // Trim all elements in place.
264
+    for (i in 0..<options.size()) options[i] = options[i].trim();
265
+    // `[] - ""` is essentially `[""].filter(Boolean)` removing all empty strings.
266
+    options -= ""
267
+
268
+    if (options.length > 0) {
269
+        println "android.packagingOptions.$prop += $options ($options.length)"
270
+        // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**'
271
+        options.each {
272
+            android.packagingOptions[prop] += it
273
+        }
274
+    }
275
+}
276
+
277
+dependencies {
278
+    implementation fileTree(dir: "libs", include: ["*.jar"])
279
+
280
+    //noinspection GradleDynamicVersion
281
+    implementation "com.facebook.react:react-native:+"  // From node_modules
282
+
283
+    def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
284
+    def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
285
+    def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";
286
+    def frescoVersion = rootProject.ext.frescoVersion
287
+
288
+    // If your app supports Android versions before Ice Cream Sandwich (API level 14)
289
+    if (isGifEnabled || isWebpEnabled) {
290
+        implementation "com.facebook.fresco:fresco:${frescoVersion}"
291
+        implementation "com.facebook.fresco:imagepipeline-okhttp3:${frescoVersion}"
292
+    }
293
+
294
+    if (isGifEnabled) {
295
+        // For animated gif support
296
+        implementation "com.facebook.fresco:animated-gif:${frescoVersion}"
297
+    }
298
+
299
+    if (isWebpEnabled) {
300
+        // For webp support
301
+        implementation "com.facebook.fresco:webpsupport:${frescoVersion}"
302
+        if (isWebpAnimatedEnabled) {
303
+            // Animated webp support
304
+            implementation "com.facebook.fresco:animated-webp:${frescoVersion}"
305
+        }
306
+    }
307
+
308
+    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
309
+    debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
310
+        exclude group:'com.facebook.fbjni'
311
+    }
312
+    debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
313
+        exclude group:'com.facebook.flipper'
314
+        exclude group:'com.squareup.okhttp3', module:'okhttp'
315
+    }
316
+    debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
317
+        exclude group:'com.facebook.flipper'
318
+    }
319
+
320
+    if (enableHermes) {
321
+        //noinspection GradleDynamicVersion
322
+        implementation("com.facebook.react:hermes-engine:+") { // From node_modules
323
+            exclude group:'com.facebook.fbjni'
324
+        }
325
+    } else {
326
+        implementation jscFlavor
327
+    }
328
+}
329
+
330
+if (isNewArchitectureEnabled()) {
331
+    // If new architecture is enabled, we let you build RN from source
332
+    // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
333
+    // This will be applied to all the imported transtitive dependency.
334
+    configurations.all {
335
+        resolutionStrategy.dependencySubstitution {
336
+            substitute(module("com.facebook.react:react-native"))
337
+                    .using(project(":ReactAndroid"))
338
+                    .because("On New Architecture we're building React Native from source")
339
+            substitute(module("com.facebook.react:hermes-engine"))
340
+                    .using(project(":ReactAndroid:hermes-engine"))
341
+                    .because("On New Architecture we're building Hermes from source")
342
+        }
343
+    }
344
+}
345
+
346
+// Run this once to be able to run the application with BUCK
347
+// puts all compile dependencies into folder libs for BUCK to use
348
+task copyDownloadableDepsToLibs(type: Copy) {
349
+    from configurations.implementation
350
+    into 'libs'
351
+}
352
+
353
+apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
354
+applyNativeModulesAppBuildGradle(project)
355
+
356
+def isNewArchitectureEnabled() {
357
+    // To opt-in for the New Architecture, you can either:
358
+    // - Set `newArchEnabled` to true inside the `gradle.properties` file
359
+    // - Invoke gradle with `-newArchEnabled=true`
360
+    // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
361
+    return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
362
+}

+ 19
- 0
android/app/build_defs.bzl Vedi File

@@ -0,0 +1,19 @@
1
+"""Helper definitions to glob .aar and .jar targets"""
2
+
3
+def create_aar_targets(aarfiles):
4
+    for aarfile in aarfiles:
5
+        name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
6
+        lib_deps.append(":" + name)
7
+        android_prebuilt_aar(
8
+            name = name,
9
+            aar = aarfile,
10
+        )
11
+
12
+def create_jar_targets(jarfiles):
13
+    for jarfile in jarfiles:
14
+        name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
15
+        lib_deps.append(":" + name)
16
+        prebuilt_jar(
17
+            name = name,
18
+            binary_jar = jarfile,
19
+        )

BIN
android/app/debug.keystore Vedi File


+ 14
- 0
android/app/proguard-rules.pro Vedi File

@@ -0,0 +1,14 @@
1
+# Add project specific ProGuard rules here.
2
+# By default, the flags in this file are appended to flags specified
3
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4
+# You can edit the include path and order by changing the proguardFiles
5
+# directive in build.gradle.
6
+#
7
+# For more details, see
8
+#   http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+# react-native-reanimated
11
+-keep class com.swmansion.reanimated.** { *; }
12
+-keep class com.facebook.react.turbomodule.** { *; }
13
+
14
+# Add any project specific keep options here:

+ 7
- 0
android/app/src/debug/AndroidManifest.xml Vedi File

@@ -0,0 +1,7 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+    xmlns:tools="http://schemas.android.com/tools">
3
+
4
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
5
+
6
+    <application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
7
+</manifest>

+ 69
- 0
android/app/src/debug/java/com/test/ReactNativeFlipper.java Vedi File

@@ -0,0 +1,69 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * <p>This source code is licensed under the MIT license found in the LICENSE file in the root
5
+ * directory of this source tree.
6
+ */
7
+package com.test;
8
+
9
+import android.content.Context;
10
+import com.facebook.flipper.android.AndroidFlipperClient;
11
+import com.facebook.flipper.android.utils.FlipperUtils;
12
+import com.facebook.flipper.core.FlipperClient;
13
+import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
14
+import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
15
+import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
16
+import com.facebook.flipper.plugins.inspector.DescriptorMapping;
17
+import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
18
+import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
19
+import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
20
+import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
21
+import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
22
+import com.facebook.react.ReactInstanceManager;
23
+import com.facebook.react.bridge.ReactContext;
24
+import com.facebook.react.modules.network.NetworkingModule;
25
+import okhttp3.OkHttpClient;
26
+
27
+public class ReactNativeFlipper {
28
+  public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
29
+    if (FlipperUtils.shouldEnableFlipper(context)) {
30
+      final FlipperClient client = AndroidFlipperClient.getInstance(context);
31
+      client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
32
+      client.addPlugin(new ReactFlipperPlugin());
33
+      client.addPlugin(new DatabasesFlipperPlugin(context));
34
+      client.addPlugin(new SharedPreferencesFlipperPlugin(context));
35
+      client.addPlugin(CrashReporterPlugin.getInstance());
36
+      NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
37
+      NetworkingModule.setCustomClientBuilder(
38
+          new NetworkingModule.CustomClientBuilder() {
39
+            @Override
40
+            public void apply(OkHttpClient.Builder builder) {
41
+              builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
42
+            }
43
+          });
44
+      client.addPlugin(networkFlipperPlugin);
45
+      client.start();
46
+      // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
47
+      // Hence we run if after all native modules have been initialized
48
+      ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
49
+      if (reactContext == null) {
50
+        reactInstanceManager.addReactInstanceEventListener(
51
+            new ReactInstanceManager.ReactInstanceEventListener() {
52
+              @Override
53
+              public void onReactContextInitialized(ReactContext reactContext) {
54
+                reactInstanceManager.removeReactInstanceEventListener(this);
55
+                reactContext.runOnNativeModulesQueueThread(
56
+                    new Runnable() {
57
+                      @Override
58
+                      public void run() {
59
+                        client.addPlugin(new FrescoFlipperPlugin());
60
+                      }
61
+                    });
62
+              }
63
+            });
64
+      } else {
65
+        client.addPlugin(new FrescoFlipperPlugin());
66
+      }
67
+    }
68
+  }
69
+}

+ 32
- 0
android/app/src/main/AndroidManifest.xml Vedi File

@@ -0,0 +1,32 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test">
2
+
3
+  <uses-permission android:name="android.permission.INTERNET"/>
4
+  <!-- OPTIONAL PERMISSIONS, REMOVE WHATEVER YOU DO NOT NEED -->
5
+  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
6
+  <uses-permission android:name="android.permission.VIBRATE"/>
7
+  <!-- These require runtime permissions on M -->
8
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
9
+  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
10
+  <!-- END OPTIONAL PERMISSIONS -->
11
+
12
+  <queries>
13
+    <!-- Support checking for http(s) links via the Linking API -->
14
+    <intent>
15
+      <action android:name="android.intent.action.VIEW" />
16
+      <category android:name="android.intent.category.BROWSABLE" />
17
+      <data android:scheme="https" />
18
+    </intent>
19
+  </queries>
20
+
21
+  <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" android:usesCleartextTraffic="true">
22
+    <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="YOUR-APP-URL-HERE"/>
23
+    <meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="YOUR-APP-SDK-VERSION-HERE"/>
24
+    <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true">
25
+      <intent-filter>
26
+        <action android:name="android.intent.action.MAIN"/>
27
+        <category android:name="android.intent.category.LAUNCHER"/>
28
+      </intent-filter>
29
+    </activity>
30
+    <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false"/>
31
+  </application>
32
+</manifest>

+ 83
- 0
android/app/src/main/java/com/test/MainActivity.java Vedi File

@@ -0,0 +1,83 @@
1
+package com.test;
2
+
3
+import android.os.Build;
4
+import android.os.Bundle;
5
+
6
+import com.facebook.react.ReactActivity;
7
+import com.facebook.react.ReactActivityDelegate;
8
+import com.facebook.react.ReactRootView;
9
+
10
+import expo.modules.ReactActivityDelegateWrapper;
11
+
12
+public class MainActivity extends ReactActivity {
13
+  @Override
14
+  protected void onCreate(Bundle savedInstanceState) {
15
+    // Set the theme to AppTheme BEFORE onCreate to support 
16
+    // coloring the background, status bar, and navigation bar.
17
+    // This is required for expo-splash-screen.
18
+    setTheme(R.style.AppTheme);
19
+    super.onCreate(null);
20
+  }
21
+
22
+  /**
23
+   * Returns the name of the main component registered from JavaScript.
24
+   * This is used to schedule rendering of the component.
25
+   */
26
+  @Override
27
+  protected String getMainComponentName() {
28
+    return "main";
29
+  }
30
+
31
+  /**
32
+   * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
33
+   * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer
34
+   * (Paper).
35
+   */
36
+  @Override
37
+  protected ReactActivityDelegate createReactActivityDelegate() {
38
+    return new ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
39
+      new MainActivityDelegate(this, getMainComponentName())
40
+    );
41
+  }
42
+
43
+  /**
44
+   * Align the back button behavior with Android S
45
+   * where moving root activities to background instead of finishing activities.
46
+   * @see <a href="https://developer.android.com/reference/android/app/Activity#onBackPressed()">onBackPressed</a>
47
+   */
48
+  @Override
49
+  public void invokeDefaultOnBackPressed() {
50
+    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
51
+      if (!moveTaskToBack(false)) {
52
+        // For non-root activities, use the default implementation to finish them.
53
+        super.invokeDefaultOnBackPressed();
54
+      }
55
+      return;
56
+    }
57
+
58
+    // Use the default back button implementation on Android S
59
+    // because it's doing more than {@link Activity#moveTaskToBack} in fact.
60
+    super.invokeDefaultOnBackPressed();
61
+  }
62
+
63
+  public static class MainActivityDelegate extends ReactActivityDelegate {
64
+    public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
65
+      super(activity, mainComponentName);
66
+    }
67
+
68
+    @Override
69
+    protected ReactRootView createRootView() {
70
+      ReactRootView reactRootView = new ReactRootView(getContext());
71
+      // If you opted-in for the New Architecture, we enable the Fabric Renderer.
72
+      reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
73
+      return reactRootView;
74
+    }
75
+
76
+    @Override
77
+    protected boolean isConcurrentRootEnabled() {
78
+      // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
79
+      // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
80
+      return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
81
+    }
82
+  }
83
+}

+ 106
- 0
android/app/src/main/java/com/test/MainApplication.java Vedi File

@@ -0,0 +1,106 @@
1
+package com.test;
2
+
3
+import android.app.Application;
4
+import android.content.Context;
5
+import android.content.res.Configuration;
6
+import androidx.annotation.NonNull;
7
+
8
+import com.facebook.react.PackageList;
9
+import com.facebook.react.ReactApplication;
10
+import com.facebook.react.ReactInstanceManager;
11
+import com.facebook.react.ReactNativeHost;
12
+import com.facebook.react.ReactPackage;
13
+import com.facebook.react.config.ReactFeatureFlags;
14
+import com.facebook.soloader.SoLoader;
15
+import com.test.newarchitecture.MainApplicationReactNativeHost;
16
+
17
+import expo.modules.ApplicationLifecycleDispatcher;
18
+import expo.modules.ReactNativeHostWrapper;
19
+
20
+import java.lang.reflect.InvocationTargetException;
21
+import java.util.List;
22
+
23
+public class MainApplication extends Application implements ReactApplication {
24
+  private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper(
25
+    this,
26
+    new ReactNativeHost(this) {
27
+    @Override
28
+    public boolean getUseDeveloperSupport() {
29
+      return BuildConfig.DEBUG;
30
+    }
31
+
32
+    @Override
33
+    protected List<ReactPackage> getPackages() {
34
+      @SuppressWarnings("UnnecessaryLocalVariable")
35
+      List<ReactPackage> packages = new PackageList(this).getPackages();
36
+      // Packages that cannot be autolinked yet can be added manually here, for example:
37
+      // packages.add(new MyReactNativePackage());
38
+      return packages;
39
+    }
40
+
41
+    @Override
42
+    protected String getJSMainModuleName() {
43
+      return "index";
44
+    }
45
+  });
46
+
47
+  private final ReactNativeHost mNewArchitectureNativeHost =
48
+      new ReactNativeHostWrapper(this, new MainApplicationReactNativeHost(this));
49
+
50
+  @Override
51
+  public ReactNativeHost getReactNativeHost() {
52
+    if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
53
+      return mNewArchitectureNativeHost;
54
+    } else {
55
+      return mReactNativeHost;
56
+    }
57
+  }
58
+
59
+  @Override
60
+  public void onCreate() {
61
+    super.onCreate();
62
+    // If you opted-in for the New Architecture, we enable the TurboModule system
63
+    ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
64
+    SoLoader.init(this, /* native exopackage */ false);
65
+
66
+    initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
67
+    ApplicationLifecycleDispatcher.onApplicationCreate(this);
68
+  }
69
+
70
+  @Override
71
+  public void onConfigurationChanged(@NonNull Configuration newConfig) {
72
+    super.onConfigurationChanged(newConfig);
73
+    ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig);
74
+  }
75
+
76
+  /**
77
+   * Loads Flipper in React Native templates. Call this in the onCreate method with something like
78
+   * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
79
+   *
80
+   * @param context
81
+   * @param reactInstanceManager
82
+   */
83
+  private static void initializeFlipper(
84
+      Context context, ReactInstanceManager reactInstanceManager) {
85
+    if (BuildConfig.DEBUG) {
86
+      try {
87
+        /*
88
+         We use reflection here to pick up the class that initializes Flipper,
89
+        since Flipper library is not available in release mode
90
+        */
91
+        Class<?> aClass = Class.forName("com.test.ReactNativeFlipper");
92
+        aClass
93
+            .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
94
+            .invoke(null, context, reactInstanceManager);
95
+      } catch (ClassNotFoundException e) {
96
+        e.printStackTrace();
97
+      } catch (NoSuchMethodException e) {
98
+        e.printStackTrace();
99
+      } catch (IllegalAccessException e) {
100
+        e.printStackTrace();
101
+      } catch (InvocationTargetException e) {
102
+        e.printStackTrace();
103
+      }
104
+    }
105
+  }
106
+}

+ 117
- 0
android/app/src/main/java/com/test/newarchitecture/MainApplicationReactNativeHost.java Vedi File

@@ -0,0 +1,117 @@
1
+package com.test.newarchitecture;
2
+
3
+import android.app.Application;
4
+import androidx.annotation.NonNull;
5
+import com.facebook.react.PackageList;
6
+import com.facebook.react.ReactInstanceManager;
7
+import com.facebook.react.ReactNativeHost;
8
+import com.facebook.react.ReactPackage;
9
+import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
10
+import com.facebook.react.bridge.JSIModulePackage;
11
+import com.facebook.react.bridge.JSIModuleProvider;
12
+import com.facebook.react.bridge.JSIModuleSpec;
13
+import com.facebook.react.bridge.JSIModuleType;
14
+import com.facebook.react.bridge.JavaScriptContextHolder;
15
+import com.facebook.react.bridge.ReactApplicationContext;
16
+import com.facebook.react.bridge.UIManager;
17
+import com.facebook.react.fabric.ComponentFactory;
18
+import com.facebook.react.fabric.CoreComponentsRegistry;
19
+import com.facebook.react.fabric.EmptyReactNativeConfig;
20
+import com.facebook.react.fabric.FabricJSIModuleProvider;
21
+import com.facebook.react.fabric.ReactNativeConfig;
22
+import com.facebook.react.uimanager.ViewManagerRegistry;
23
+import com.test.BuildConfig;
24
+import com.test.newarchitecture.components.MainComponentsRegistry;
25
+import com.test.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate;
26
+import java.util.ArrayList;
27
+import java.util.List;
28
+
29
+/**
30
+ * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both
31
+ * TurboModule delegates and the Fabric Renderer.
32
+ *
33
+ * <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
34
+ * `newArchEnabled` property). Is ignored otherwise.
35
+ */
36
+public class MainApplicationReactNativeHost extends ReactNativeHost {
37
+  public MainApplicationReactNativeHost(Application application) {
38
+    super(application);
39
+  }
40
+
41
+  @Override
42
+  public boolean getUseDeveloperSupport() {
43
+    return BuildConfig.DEBUG;
44
+  }
45
+
46
+  @Override
47
+  protected List<ReactPackage> getPackages() {
48
+    List<ReactPackage> packages = new PackageList(this).getPackages();
49
+    // Packages that cannot be autolinked yet can be added manually here, for example:
50
+    //     packages.add(new MyReactNativePackage());
51
+    // TurboModules must also be loaded here providing a valid TurboReactPackage implementation:
52
+    //     packages.add(new TurboReactPackage() { ... });
53
+    // If you have custom Fabric Components, their ViewManagers should also be loaded here
54
+    // inside a ReactPackage.
55
+    return packages;
56
+  }
57
+
58
+  @Override
59
+  protected String getJSMainModuleName() {
60
+    return "index";
61
+  }
62
+
63
+  @NonNull
64
+  @Override
65
+  protected ReactPackageTurboModuleManagerDelegate.Builder
66
+      getReactPackageTurboModuleManagerDelegateBuilder() {
67
+    // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary
68
+    // for the new architecture and to use TurboModules correctly.
69
+    return new MainApplicationTurboModuleManagerDelegate.Builder();
70
+  }
71
+
72
+  @Override
73
+  protected JSIModulePackage getJSIModulePackage() {
74
+    return new JSIModulePackage() {
75
+      @Override
76
+      public List<JSIModuleSpec> getJSIModules(
77
+          final ReactApplicationContext reactApplicationContext,
78
+          final JavaScriptContextHolder jsContext) {
79
+        final List<JSIModuleSpec> specs = new ArrayList<>();
80
+
81
+        // Here we provide a new JSIModuleSpec that will be responsible of providing the
82
+        // custom Fabric Components.
83
+        specs.add(
84
+            new JSIModuleSpec() {
85
+              @Override
86
+              public JSIModuleType getJSIModuleType() {
87
+                return JSIModuleType.UIManager;
88
+              }
89
+
90
+              @Override
91
+              public JSIModuleProvider<UIManager> getJSIModuleProvider() {
92
+                final ComponentFactory componentFactory = new ComponentFactory();
93
+                CoreComponentsRegistry.register(componentFactory);
94
+
95
+                // Here we register a Components Registry.
96
+                // The one that is generated with the template contains no components
97
+                // and just provides you the one from React Native core.
98
+                MainComponentsRegistry.register(componentFactory);
99
+
100
+                final ReactInstanceManager reactInstanceManager = getReactInstanceManager();
101
+
102
+                ViewManagerRegistry viewManagerRegistry =
103
+                    new ViewManagerRegistry(
104
+                        reactInstanceManager.getOrCreateViewManagers(reactApplicationContext));
105
+
106
+                return new FabricJSIModuleProvider(
107
+                    reactApplicationContext,
108
+                    componentFactory,
109
+                    ReactNativeConfig.DEFAULT_CONFIG,
110
+                    viewManagerRegistry);
111
+              }
112
+            });
113
+        return specs;
114
+      }
115
+    };
116
+  }
117
+}

+ 36
- 0
android/app/src/main/java/com/test/newarchitecture/components/MainComponentsRegistry.java Vedi File

@@ -0,0 +1,36 @@
1
+package com.test.newarchitecture.components;
2
+
3
+import com.facebook.jni.HybridData;
4
+import com.facebook.proguard.annotations.DoNotStrip;
5
+import com.facebook.react.fabric.ComponentFactory;
6
+import com.facebook.soloader.SoLoader;
7
+
8
+/**
9
+ * Class responsible to load the custom Fabric Components. This class has native methods and needs a
10
+ * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
11
+ * folder for you).
12
+ *
13
+ * <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
14
+ * `newArchEnabled` property). Is ignored otherwise.
15
+ */
16
+@DoNotStrip
17
+public class MainComponentsRegistry {
18
+  static {
19
+    SoLoader.loadLibrary("fabricjni");
20
+  }
21
+
22
+  @DoNotStrip private final HybridData mHybridData;
23
+
24
+  @DoNotStrip
25
+  private native HybridData initHybrid(ComponentFactory componentFactory);
26
+
27
+  @DoNotStrip
28
+  private MainComponentsRegistry(ComponentFactory componentFactory) {
29
+    mHybridData = initHybrid(componentFactory);
30
+  }
31
+
32
+  @DoNotStrip
33
+  public static MainComponentsRegistry register(ComponentFactory componentFactory) {
34
+    return new MainComponentsRegistry(componentFactory);
35
+  }
36
+}

+ 48
- 0
android/app/src/main/java/com/test/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java Vedi File

@@ -0,0 +1,48 @@
1
+package com.test.newarchitecture.modules;
2
+
3
+import com.facebook.jni.HybridData;
4
+import com.facebook.react.ReactPackage;
5
+import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
6
+import com.facebook.react.bridge.ReactApplicationContext;
7
+import com.facebook.soloader.SoLoader;
8
+import java.util.List;
9
+
10
+/**
11
+ * Class responsible to load the TurboModules. This class has native methods and needs a
12
+ * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
13
+ * folder for you).
14
+ *
15
+ * <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
16
+ * `newArchEnabled` property). Is ignored otherwise.
17
+ */
18
+public class MainApplicationTurboModuleManagerDelegate
19
+    extends ReactPackageTurboModuleManagerDelegate {
20
+
21
+  private static volatile boolean sIsSoLibraryLoaded;
22
+
23
+  protected MainApplicationTurboModuleManagerDelegate(
24
+      ReactApplicationContext reactApplicationContext, List<ReactPackage> packages) {
25
+    super(reactApplicationContext, packages);
26
+  }
27
+
28
+  protected native HybridData initHybrid();
29
+
30
+  native boolean canCreateTurboModule(String moduleName);
31
+
32
+  public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder {
33
+    protected MainApplicationTurboModuleManagerDelegate build(
34
+        ReactApplicationContext context, List<ReactPackage> packages) {
35
+      return new MainApplicationTurboModuleManagerDelegate(context, packages);
36
+    }
37
+  }
38
+
39
+  @Override
40
+  protected synchronized void maybeLoadOtherSoLibraries() {
41
+    if (!sIsSoLibraryLoaded) {
42
+      // If you change the name of your application .so file in the Android.mk file,
43
+      // make sure you update the name here as well.
44
+      SoLoader.loadLibrary("test_appmodules");
45
+      sIsSoLibraryLoaded = true;
46
+    }
47
+  }
48
+}

+ 7
- 0
android/app/src/main/jni/CMakeLists.txt Vedi File

@@ -0,0 +1,7 @@
1
+cmake_minimum_required(VERSION 3.13)
2
+
3
+# Define the library name here.
4
+project(test_appmodules)
5
+
6
+# This file includes all the necessary to let you build your application with the New Architecture.
7
+include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake)

+ 32
- 0
android/app/src/main/jni/MainApplicationModuleProvider.cpp Vedi File

@@ -0,0 +1,32 @@
1
+#include "MainApplicationModuleProvider.h"
2
+
3
+#include <rncli.h>
4
+#include <rncore.h>
5
+
6
+namespace facebook {
7
+namespace react {
8
+
9
+std::shared_ptr<TurboModule> MainApplicationModuleProvider(
10
+    const std::string &moduleName,
11
+    const JavaTurboModule::InitParams &params) {
12
+  // Here you can provide your own module provider for TurboModules coming from
13
+  // either your application or from external libraries. The approach to follow
14
+  // is similar to the following (for a library called `samplelibrary`:
15
+  //
16
+  // auto module = samplelibrary_ModuleProvider(moduleName, params);
17
+  // if (module != nullptr) {
18
+  //    return module;
19
+  // }
20
+  // return rncore_ModuleProvider(moduleName, params);
21
+
22
+  // Module providers autolinked by RN CLI
23
+  auto rncli_module = rncli_ModuleProvider(moduleName, params);
24
+  if (rncli_module != nullptr) {
25
+    return rncli_module;
26
+  }
27
+
28
+  return rncore_ModuleProvider(moduleName, params);
29
+}
30
+
31
+} // namespace react
32
+} // namespace facebook

+ 16
- 0
android/app/src/main/jni/MainApplicationModuleProvider.h Vedi File

@@ -0,0 +1,16 @@
1
+#pragma once
2
+
3
+#include <memory>
4
+#include <string>
5
+
6
+#include <ReactCommon/JavaTurboModule.h>
7
+
8
+namespace facebook {
9
+namespace react {
10
+
11
+std::shared_ptr<TurboModule> MainApplicationModuleProvider(
12
+    const std::string &moduleName,
13
+    const JavaTurboModule::InitParams &params);
14
+
15
+} // namespace react
16
+} // namespace facebook

+ 45
- 0
android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp Vedi File

@@ -0,0 +1,45 @@
1
+#include "MainApplicationTurboModuleManagerDelegate.h"
2
+#include "MainApplicationModuleProvider.h"
3
+
4
+namespace facebook {
5
+namespace react {
6
+
7
+jni::local_ref<MainApplicationTurboModuleManagerDelegate::jhybriddata>
8
+MainApplicationTurboModuleManagerDelegate::initHybrid(
9
+    jni::alias_ref<jhybridobject>) {
10
+  return makeCxxInstance();
11
+}
12
+
13
+void MainApplicationTurboModuleManagerDelegate::registerNatives() {
14
+  registerHybrid({
15
+      makeNativeMethod(
16
+          "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
17
+      makeNativeMethod(
18
+          "canCreateTurboModule",
19
+          MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
20
+  });
21
+}
22
+
23
+std::shared_ptr<TurboModule>
24
+MainApplicationTurboModuleManagerDelegate::getTurboModule(
25
+    const std::string &name,
26
+    const std::shared_ptr<CallInvoker> &jsInvoker) {
27
+  // Not implemented yet: provide pure-C++ NativeModules here.
28
+  return nullptr;
29
+}
30
+
31
+std::shared_ptr<TurboModule>
32
+MainApplicationTurboModuleManagerDelegate::getTurboModule(
33
+    const std::string &name,
34
+    const JavaTurboModule::InitParams &params) {
35
+  return MainApplicationModuleProvider(name, params);
36
+}
37
+
38
+bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
39
+    const std::string &name) {
40
+  return getTurboModule(name, nullptr) != nullptr ||
41
+      getTurboModule(name, {.moduleName = name}) != nullptr;
42
+}
43
+
44
+} // namespace react
45
+} // namespace facebook

+ 38
- 0
android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h Vedi File

@@ -0,0 +1,38 @@
1
+#include <memory>
2
+#include <string>
3
+
4
+#include <ReactCommon/TurboModuleManagerDelegate.h>
5
+#include <fbjni/fbjni.h>
6
+
7
+namespace facebook {
8
+namespace react {
9
+
10
+class MainApplicationTurboModuleManagerDelegate
11
+    : public jni::HybridClass<
12
+          MainApplicationTurboModuleManagerDelegate,
13
+          TurboModuleManagerDelegate> {
14
+ public:
15
+  // Adapt it to the package you used for your Java class.
16
+  static constexpr auto kJavaDescriptor =
17
+      "Lcom/test/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;";
18
+
19
+  static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
20
+
21
+  static void registerNatives();
22
+
23
+  std::shared_ptr<TurboModule> getTurboModule(
24
+      const std::string &name,
25
+      const std::shared_ptr<CallInvoker> &jsInvoker) override;
26
+  std::shared_ptr<TurboModule> getTurboModule(
27
+      const std::string &name,
28
+      const JavaTurboModule::InitParams &params) override;
29
+
30
+  /**
31
+   * Test-only method. Allows user to verify whether a TurboModule can be
32
+   * created by instances of this class.
33
+   */
34
+  bool canCreateTurboModule(const std::string &name);
35
+};
36
+
37
+} // namespace react
38
+} // namespace facebook

+ 65
- 0
android/app/src/main/jni/MainComponentsRegistry.cpp Vedi File

@@ -0,0 +1,65 @@
1
+#include "MainComponentsRegistry.h"
2
+
3
+#include <CoreComponentsRegistry.h>
4
+#include <fbjni/fbjni.h>
5
+#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
6
+#include <react/renderer/components/rncore/ComponentDescriptors.h>
7
+#include <rncli.h>
8
+
9
+namespace facebook {
10
+namespace react {
11
+
12
+MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
13
+
14
+std::shared_ptr<ComponentDescriptorProviderRegistry const>
15
+MainComponentsRegistry::sharedProviderRegistry() {
16
+  auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
17
+
18
+  // Autolinked providers registered by RN CLI
19
+  rncli_registerProviders(providerRegistry);
20
+
21
+  // Custom Fabric Components go here. You can register custom
22
+  // components coming from your App or from 3rd party libraries here.
23
+  //
24
+  // providerRegistry->add(concreteComponentDescriptorProvider<
25
+  //        AocViewerComponentDescriptor>());
26
+  return providerRegistry;
27
+}
28
+
29
+jni::local_ref<MainComponentsRegistry::jhybriddata>
30
+MainComponentsRegistry::initHybrid(
31
+    jni::alias_ref<jclass>,
32
+    ComponentFactory *delegate) {
33
+  auto instance = makeCxxInstance(delegate);
34
+
35
+  auto buildRegistryFunction =
36
+      [](EventDispatcher::Weak const &eventDispatcher,
37
+         ContextContainer::Shared const &contextContainer)
38
+      -> ComponentDescriptorRegistry::Shared {
39
+    auto registry = MainComponentsRegistry::sharedProviderRegistry()
40
+                        ->createComponentDescriptorRegistry(
41
+                            {eventDispatcher, contextContainer});
42
+
43
+    auto mutableRegistry =
44
+        std::const_pointer_cast<ComponentDescriptorRegistry>(registry);
45
+
46
+    mutableRegistry->setFallbackComponentDescriptor(
47
+        std::make_shared<UnimplementedNativeViewComponentDescriptor>(
48
+            ComponentDescriptorParameters{
49
+                eventDispatcher, contextContainer, nullptr}));
50
+
51
+    return registry;
52
+  };
53
+
54
+  delegate->buildRegistryFunction = buildRegistryFunction;
55
+  return instance;
56
+}
57
+
58
+void MainComponentsRegistry::registerNatives() {
59
+  registerHybrid({
60
+      makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
61
+  });
62
+}
63
+
64
+} // namespace react
65
+} // namespace facebook

+ 32
- 0
android/app/src/main/jni/MainComponentsRegistry.h Vedi File

@@ -0,0 +1,32 @@
1
+#pragma once
2
+
3
+#include <ComponentFactory.h>
4
+#include <fbjni/fbjni.h>
5
+#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
6
+#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
7
+
8
+namespace facebook {
9
+namespace react {
10
+
11
+class MainComponentsRegistry
12
+    : public facebook::jni::HybridClass<MainComponentsRegistry> {
13
+ public:
14
+  // Adapt it to the package you used for your Java class.
15
+  constexpr static auto kJavaDescriptor =
16
+      "Lcom/test/newarchitecture/components/MainComponentsRegistry;";
17
+
18
+  static void registerNatives();
19
+
20
+  MainComponentsRegistry(ComponentFactory *delegate);
21
+
22
+ private:
23
+  static std::shared_ptr<ComponentDescriptorProviderRegistry const>
24
+  sharedProviderRegistry();
25
+
26
+  static jni::local_ref<jhybriddata> initHybrid(
27
+      jni::alias_ref<jclass>,
28
+      ComponentFactory *delegate);
29
+};
30
+
31
+} // namespace react
32
+} // namespace facebook

+ 11
- 0
android/app/src/main/jni/OnLoad.cpp Vedi File

@@ -0,0 +1,11 @@
1
+#include <fbjni/fbjni.h>
2
+#include "MainApplicationTurboModuleManagerDelegate.h"
3
+#include "MainComponentsRegistry.h"
4
+
5
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
6
+  return facebook::jni::initialize(vm, [] {
7
+    facebook::react::MainApplicationTurboModuleManagerDelegate::
8
+        registerNatives();
9
+    facebook::react::MainComponentsRegistry::registerNatives();
10
+  });
11
+}

+ 36
- 0
android/app/src/main/res/drawable/rn_edit_text_material.xml Vedi File

@@ -0,0 +1,36 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Copyright (C) 2014 The Android Open Source Project
3
+
4
+     Licensed under the Apache License, Version 2.0 (the "License");
5
+     you may not use this file except in compliance with the License.
6
+     You may obtain a copy of the License at
7
+
8
+          http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+     Unless required by applicable law or agreed to in writing, software
11
+     distributed under the License is distributed on an "AS IS" BASIS,
12
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+     See the License for the specific language governing permissions and
14
+     limitations under the License.
15
+-->
16
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
17
+       android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
18
+       android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
19
+       android:insetTop="@dimen/abc_edit_text_inset_top_material"
20
+       android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
21
+
22
+    <selector>
23
+        <!-- 
24
+          This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
25
+          The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
26
+          NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
27
+
28
+          <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
29
+
30
+          For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
31
+        -->
32
+        <item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
33
+        <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
34
+    </selector>
35
+
36
+</inset>

+ 4
- 0
android/app/src/main/res/drawable/splashscreen.xml Vedi File

@@ -0,0 +1,4 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3
+  <item android:drawable="@color/splashscreen_background"/>
4
+</layer-list>

BIN
android/app/src/main/res/drawable/splashscreen_image.png Vedi File


BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png Vedi File


BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png Vedi File


BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png Vedi File


BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png Vedi File


BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png Vedi File


BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png Vedi File


BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Vedi File


BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png Vedi File


BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Vedi File


BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png Vedi File


+ 4
- 0
android/app/src/main/res/values/colors.xml Vedi File

@@ -0,0 +1,4 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+<resources>
3
+  <color name="splashscreen_background">#FFFFFF</color>
4
+</resources>

+ 3
- 0
android/app/src/main/res/values/strings.xml Vedi File

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">Test</string>
3
+</resources>

+ 15
- 0
android/app/src/main/res/values/styles.xml Vedi File

@@ -0,0 +1,15 @@
1
+<resources>
2
+  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
3
+    <item name="android:textColor">@android:color/black</item>
4
+    <item name="android:editTextStyle">@style/ResetEditText</item>
5
+    <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
6
+  </style>
7
+  <style name="ResetEditText" parent="@android:style/Widget.EditText">
8
+    <item name="android:padding">0dp</item>
9
+    <item name="android:textColorHint">#c8c8c8</item>
10
+    <item name="android:textColor">@android:color/black</item>
11
+  </style>
12
+  <style name="Theme.App.SplashScreen" parent="AppTheme">
13
+    <item name="android:windowBackground">@drawable/splashscreen</item>
14
+  </style>
15
+</resources>

+ 65
- 0
android/build.gradle Vedi File

@@ -0,0 +1,65 @@
1
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+buildscript {
4
+    ext {
5
+        buildToolsVersion = findProperty('android.buildToolsVersion') ?: '31.0.0'
6
+        minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21')
7
+        compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '31')
8
+        targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '31')
9
+        if (findProperty('android.kotlinVersion')) {
10
+            kotlinVersion = findProperty('android.kotlinVersion')
11
+        }
12
+        frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0'
13
+
14
+        if (System.properties['os.arch'] == 'aarch64') {
15
+            // For M1 Users we need to use the NDK 24 which added support for aarch64
16
+            ndkVersion = '24.0.8215888'
17
+        } else {
18
+            // Otherwise we default to the side-by-side NDK version from AGP.
19
+            ndkVersion = '21.4.7075529'
20
+        }
21
+    }
22
+    repositories {
23
+        google()
24
+        mavenCentral()
25
+    }
26
+    dependencies {
27
+        classpath('com.android.tools.build:gradle:7.2.1')
28
+        classpath('com.facebook.react:react-native-gradle-plugin')
29
+        classpath('de.undercouch:gradle-download-task:5.0.1')
30
+        // NOTE: Do not place your application dependencies here; they belong
31
+        // in the individual module build.gradle files
32
+    }
33
+}
34
+
35
+def REACT_NATIVE_VERSION = new File(['node', '--print', "JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())
36
+
37
+allprojects {
38
+    configurations.all {
39
+        resolutionStrategy {
40
+            force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
41
+        }
42
+    }
43
+
44
+    repositories {
45
+        mavenLocal()
46
+        maven {
47
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
48
+            url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))
49
+        }
50
+        maven {
51
+            // Android JSC is installed from npm
52
+            url(new File(['node', '--print', "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), '../dist'))
53
+        }
54
+
55
+        google()
56
+        mavenCentral {
57
+            // We don't want to fetch react-native from Maven Central as there are
58
+            // older versions over there.
59
+            content {
60
+                excludeGroup 'com.facebook.react'
61
+            }
62
+        }
63
+        maven { url 'https://www.jitpack.io' }
64
+    }
65
+}

+ 53
- 0
android/gradle.properties Vedi File

@@ -0,0 +1,53 @@
1
+# Project-wide Gradle settings.
2
+
3
+# IDE (e.g. Android Studio) users:
4
+# Gradle settings configured through the IDE *will override*
5
+# any settings specified in this file.
6
+
7
+# For more details on how to configure your build environment visit
8
+# http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+# Specifies the JVM arguments used for the daemon process.
11
+# The setting is particularly useful for tweaking memory settings.
12
+# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
13
+org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
14
+
15
+# When configured, Gradle will run in incubating parallel mode.
16
+# This option should only be used with decoupled projects. More details, visit
17
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
+# org.gradle.parallel=true
19
+
20
+# AndroidX package structure to make it clearer which packages are bundled with the
21
+# Android operating system, and which are packaged with your app's APK
22
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
23
+android.useAndroidX=true
24
+
25
+# Automatically convert third-party libraries to use AndroidX
26
+android.enableJetifier=true
27
+
28
+# Version of flipper SDK to use with React Native
29
+FLIPPER_VERSION=0.125.0
30
+
31
+# Use this property to specify which architecture you want to build.
32
+# You can also override it from the CLI using
33
+# ./gradlew <task> -PreactNativeArchitectures=x86_64
34
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
35
+
36
+# Use this property to enable support to the new architecture.
37
+# This will allow you to use TurboModules and the Fabric render in
38
+# your application. You should enable this flag either if you want
39
+# to write custom TurboModules/Fabric components OR use libraries that
40
+# are providing them.
41
+newArchEnabled=false
42
+
43
+# The hosted JavaScript engine
44
+# Supported values: expo.jsEngine = "hermes" | "jsc"
45
+expo.jsEngine=jsc
46
+
47
+# Enable GIF support in React Native images (~200 B increase)
48
+expo.gif.enabled=true
49
+# Enable webp support in React Native images (~85 KB increase)
50
+expo.webp.enabled=true
51
+# Enable animated webp support (~3.4 MB increase)
52
+# Disabled by default because iOS doesn't support animated webp
53
+expo.webp.animated=false

BIN
android/gradle/wrapper/gradle-wrapper.jar Vedi File


+ 5
- 0
android/gradle/wrapper/gradle-wrapper.properties Vedi File

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
4
+zipStoreBase=GRADLE_USER_HOME
5
+zipStorePath=wrapper/dists

+ 240
- 0
android/gradlew Vedi File

@@ -0,0 +1,240 @@
1
+#!/bin/sh
2
+
3
+#
4
+# Copyright © 2015-2021 the original authors.
5
+#
6
+# Licensed under the Apache License, Version 2.0 (the "License");
7
+# you may not use this file except in compliance with the License.
8
+# You may obtain a copy of the License at
9
+#
10
+#      https://www.apache.org/licenses/LICENSE-2.0
11
+#
12
+# Unless required by applicable law or agreed to in writing, software
13
+# distributed under the License is distributed on an "AS IS" BASIS,
14
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+# See the License for the specific language governing permissions and
16
+# limitations under the License.
17
+#
18
+
19
+##############################################################################
20
+#
21
+#   Gradle start up script for POSIX generated by Gradle.
22
+#
23
+#   Important for running:
24
+#
25
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26
+#       noncompliant, but you have some other compliant shell such as ksh or
27
+#       bash, then to run this script, type that shell name before the whole
28
+#       command line, like:
29
+#
30
+#           ksh Gradle
31
+#
32
+#       Busybox and similar reduced shells will NOT work, because this script
33
+#       requires all of these POSIX shell features:
34
+#         * functions;
35
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37
+#         * compound commands having a testable exit status, especially «case»;
38
+#         * various built-in commands including «command», «set», and «ulimit».
39
+#
40
+#   Important for patching:
41
+#
42
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
43
+#       by Bash, Ksh, etc; in particular arrays are avoided.
44
+#
45
+#       The "traditional" practice of packing multiple parameters into a
46
+#       space-separated string is a well documented source of bugs and security
47
+#       problems, so this is (mostly) avoided, by progressively accumulating
48
+#       options in "$@", and eventually passing that to Java.
49
+#
50
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52
+#       see the in-line comments for details.
53
+#
54
+#       There are tweaks for specific operating systems such as AIX, CygWin,
55
+#       Darwin, MinGW, and NonStop.
56
+#
57
+#   (3) This script is generated from the Groovy template
58
+#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59
+#       within the Gradle project.
60
+#
61
+#       You can find Gradle at https://github.com/gradle/gradle/.
62
+#
63
+##############################################################################
64
+
65
+# Attempt to set APP_HOME
66
+
67
+# Resolve links: $0 may be a link
68
+app_path=$0
69
+
70
+# Need this for daisy-chained symlinks.
71
+while
72
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
73
+    [ -h "$app_path" ]
74
+do
75
+    ls=$( ls -ld "$app_path" )
76
+    link=${ls#*' -> '}
77
+    case $link in             #(
78
+      /*)   app_path=$link ;; #(
79
+      *)    app_path=$APP_HOME$link ;;
80
+    esac
81
+done
82
+
83
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84
+
85
+APP_NAME="Gradle"
86
+APP_BASE_NAME=${0##*/}
87
+
88
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
90
+
91
+# Use the maximum available, or set MAX_FD != -1 to use that value.
92
+MAX_FD=maximum
93
+
94
+warn () {
95
+    echo "$*"
96
+} >&2
97
+
98
+die () {
99
+    echo
100
+    echo "$*"
101
+    echo
102
+    exit 1
103
+} >&2
104
+
105
+# OS specific support (must be 'true' or 'false').
106
+cygwin=false
107
+msys=false
108
+darwin=false
109
+nonstop=false
110
+case "$( uname )" in                #(
111
+  CYGWIN* )         cygwin=true  ;; #(
112
+  Darwin* )         darwin=true  ;; #(
113
+  MSYS* | MINGW* )  msys=true    ;; #(
114
+  NONSTOP* )        nonstop=true ;;
115
+esac
116
+
117
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
118
+
119
+
120
+# Determine the Java command to use to start the JVM.
121
+if [ -n "$JAVA_HOME" ] ; then
122
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
123
+        # IBM's JDK on AIX uses strange locations for the executables
124
+        JAVACMD=$JAVA_HOME/jre/sh/java
125
+    else
126
+        JAVACMD=$JAVA_HOME/bin/java
127
+    fi
128
+    if [ ! -x "$JAVACMD" ] ; then
129
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
130
+
131
+Please set the JAVA_HOME variable in your environment to match the
132
+location of your Java installation."
133
+    fi
134
+else
135
+    JAVACMD=java
136
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137
+
138
+Please set the JAVA_HOME variable in your environment to match the
139
+location of your Java installation."
140
+fi
141
+
142
+# Increase the maximum file descriptors if we can.
143
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144
+    case $MAX_FD in #(
145
+      max*)
146
+        MAX_FD=$( ulimit -H -n ) ||
147
+            warn "Could not query maximum file descriptor limit"
148
+    esac
149
+    case $MAX_FD in  #(
150
+      '' | soft) :;; #(
151
+      *)
152
+        ulimit -n "$MAX_FD" ||
153
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
154
+    esac
155
+fi
156
+
157
+# Collect all arguments for the java command, stacking in reverse order:
158
+#   * args from the command line
159
+#   * the main class name
160
+#   * -classpath
161
+#   * -D...appname settings
162
+#   * --module-path (only if needed)
163
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
164
+
165
+# For Cygwin or MSYS, switch paths to Windows format before running java
166
+if "$cygwin" || "$msys" ; then
167
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
168
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
169
+
170
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
171
+
172
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
173
+    for arg do
174
+        if
175
+            case $arg in                                #(
176
+              -*)   false ;;                            # don't mess with options #(
177
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
178
+                    [ -e "$t" ] ;;                      #(
179
+              *)    false ;;
180
+            esac
181
+        then
182
+            arg=$( cygpath --path --ignore --mixed "$arg" )
183
+        fi
184
+        # Roll the args list around exactly as many times as the number of
185
+        # args, so each arg winds up back in the position where it started, but
186
+        # possibly modified.
187
+        #
188
+        # NB: a `for` loop captures its iteration list before it begins, so
189
+        # changing the positional parameters here affects neither the number of
190
+        # iterations, nor the values presented in `arg`.
191
+        shift                   # remove old arg
192
+        set -- "$@" "$arg"      # push replacement arg
193
+    done
194
+fi
195
+
196
+# Collect all arguments for the java command;
197
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198
+#     shell script including quotes and variable substitutions, so put them in
199
+#     double quotes to make sure that they get re-expanded; and
200
+#   * put everything else in single quotes, so that it's not re-expanded.
201
+
202
+set -- \
203
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
204
+        -classpath "$CLASSPATH" \
205
+        org.gradle.wrapper.GradleWrapperMain \
206
+        "$@"
207
+
208
+# Stop when "xargs" is not available.
209
+if ! command -v xargs >/dev/null 2>&1
210
+then
211
+    die "xargs is not available"
212
+fi
213
+
214
+# Use "xargs" to parse quoted args.
215
+#
216
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
217
+#
218
+# In Bash we could simply go:
219
+#
220
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
221
+#   set -- "${ARGS[@]}" "$@"
222
+#
223
+# but POSIX shell has neither arrays nor command substitution, so instead we
224
+# post-process each arg (as a line of input to sed) to backslash-escape any
225
+# character that might be a shell metacharacter, then use eval to reverse
226
+# that process (while maintaining the separation between arguments), and wrap
227
+# the whole thing up as a single "set" statement.
228
+#
229
+# This will of course break if any of these variables contains a newline or
230
+# an unmatched quote.
231
+#
232
+
233
+eval "set -- $(
234
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
235
+        xargs -n1 |
236
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
237
+        tr '\n' ' '
238
+    )" '"$@"'
239
+
240
+exec "$JAVACMD" "$@"

+ 91
- 0
android/gradlew.bat Vedi File

@@ -0,0 +1,91 @@
1
+@rem
2
+@rem Copyright 2015 the original author or authors.
3
+@rem
4
+@rem Licensed under the Apache License, Version 2.0 (the "License");
5
+@rem you may not use this file except in compliance with the License.
6
+@rem You may obtain a copy of the License at
7
+@rem
8
+@rem      https://www.apache.org/licenses/LICENSE-2.0
9
+@rem
10
+@rem Unless required by applicable law or agreed to in writing, software
11
+@rem distributed under the License is distributed on an "AS IS" BASIS,
12
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+@rem See the License for the specific language governing permissions and
14
+@rem limitations under the License.
15
+@rem
16
+
17
+@if "%DEBUG%"=="" @echo off
18
+@rem ##########################################################################
19
+@rem
20
+@rem  Gradle startup script for Windows
21
+@rem
22
+@rem ##########################################################################
23
+
24
+@rem Set local scope for the variables with windows NT shell
25
+if "%OS%"=="Windows_NT" setlocal
26
+
27
+set DIRNAME=%~dp0
28
+if "%DIRNAME%"=="" set DIRNAME=.
29
+set APP_BASE_NAME=%~n0
30
+set APP_HOME=%DIRNAME%
31
+
32
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34
+
35
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37
+
38
+@rem Find java.exe
39
+if defined JAVA_HOME goto findJavaFromJavaHome
40
+
41
+set JAVA_EXE=java.exe
42
+%JAVA_EXE% -version >NUL 2>&1
43
+if %ERRORLEVEL% equ 0 goto execute
44
+
45
+echo.
46
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47
+echo.
48
+echo Please set the JAVA_HOME variable in your environment to match the
49
+echo location of your Java installation.
50
+
51
+goto fail
52
+
53
+:findJavaFromJavaHome
54
+set JAVA_HOME=%JAVA_HOME:"=%
55
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56
+
57
+if exist "%JAVA_EXE%" goto execute
58
+
59
+echo.
60
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61
+echo.
62
+echo Please set the JAVA_HOME variable in your environment to match the
63
+echo location of your Java installation.
64
+
65
+goto fail
66
+
67
+:execute
68
+@rem Setup the command line
69
+
70
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71
+
72
+
73
+@rem Execute Gradle
74
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75
+
76
+:end
77
+@rem End local scope for the variables with windows NT shell
78
+if %ERRORLEVEL% equ 0 goto mainEnd
79
+
80
+:fail
81
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82
+rem the _cmd.exe /c_ return code!
83
+set EXIT_CODE=%ERRORLEVEL%
84
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
85
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
86
+exit /b %EXIT_CODE%
87
+
88
+:mainEnd
89
+if "%OS%"=="Windows_NT" endlocal
90
+
91
+:omega

+ 17
- 0
android/settings.gradle Vedi File

@@ -0,0 +1,17 @@
1
+rootProject.name = 'Test'
2
+
3
+apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
4
+useExpoModules()
5
+
6
+apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
7
+applyNativeModulesSettingsGradle(settings)
8
+
9
+include ':app'
10
+includeBuild(new File(["node", "--print", "require.resolve('react-native-gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile())
11
+
12
+if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") {
13
+  include(":ReactAndroid")
14
+  project(":ReactAndroid").projectDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../ReactAndroid");
15
+  include(":ReactAndroid:hermes-engine")
16
+  project(":ReactAndroid:hermes-engine").projectDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../ReactAndroid/hermes-engine");
17
+}

+ 11
- 0
app.json Vedi File

@@ -0,0 +1,11 @@
1
+{
2
+  "expo": {
3
+    "name": "Test",
4
+    "slug": "Test",
5
+    "version": "1.0.0",
6
+    "assetBundlePatterns": [
7
+      "**/*"
8
+    ]
9
+  },
10
+  "name": "Test"
11
+}

+ 6
- 0
babel.config.js Vedi File

@@ -0,0 +1,6 @@
1
+module.exports = function(api) {
2
+  api.cache(true);
3
+  return {
4
+    presets: ['babel-preset-expo']
5
+  };
6
+};

+ 8
- 0
index.js Vedi File

@@ -0,0 +1,8 @@
1
+import { registerRootComponent } from 'expo';
2
+
3
+import App from './App';
4
+
5
+// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
6
+// It also ensures that whether you load the app in Expo Go or in a native build,
7
+// the environment is set up appropriately
8
+registerRootComponent(App);

+ 30
- 0
ios/.gitignore Vedi File

@@ -0,0 +1,30 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+.xcode.env.local
25
+
26
+# Bundle artifacts
27
+*.jsbundle
28
+
29
+# CocoaPods
30
+/Pods/

+ 11
- 0
ios/.xcode.env Vedi File

@@ -0,0 +1,11 @@
1
+# This `.xcode.env` file is versioned and is used to source the environment
2
+# used when running script phases inside Xcode.
3
+# To customize your local environment, you can create an `.xcode.env.local`
4
+# file that is not versioned.
5
+
6
+# NODE_BINARY variable contains the PATH to the node executable.
7
+#
8
+# Customize the NODE_BINARY variable here.
9
+# For example, to use nvm with brew, add the following line
10
+# . "$(brew --prefix nvm)/nvm.sh" --no-use
11
+export NODE_BINARY=$(command -v node)

+ 61
- 0
ios/Podfile Vedi File

@@ -0,0 +1,61 @@
1
+require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
2
+require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
3
+require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
4
+
5
+require 'json'
6
+podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
7
+
8
+platform :ios, podfile_properties['ios.deploymentTarget'] || '13.0'
9
+install! 'cocoapods',
10
+  :deterministic_uuids => false
11
+
12
+target 'Test' do
13
+  use_expo_modules!
14
+  config = use_native_modules!
15
+
16
+  use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
17
+
18
+  # Flags change depending on the env values.
19
+  flags = get_default_flags()
20
+
21
+  use_react_native!(
22
+    :path => config[:reactNativePath],
23
+    :hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
24
+    :fabric_enabled => flags[:fabric_enabled],
25
+    # An absolute path to your application root.
26
+    :app_path => "#{Pod::Config.instance.installation_root}/..",
27
+    #
28
+    # Uncomment to opt-in to using Flipper
29
+    # Note that if you have use_frameworks! enabled, Flipper will not work
30
+    # :flipper_configuration => !ENV['CI'] ? FlipperConfiguration.enabled : FlipperConfiguration.disabled,
31
+  )
32
+
33
+  post_install do |installer|
34
+    react_native_post_install(
35
+      installer,
36
+      # Set `mac_catalyst_enabled` to `true` in order to apply patches
37
+      # necessary for Mac Catalyst builds
38
+      :mac_catalyst_enabled => false
39
+    )
40
+    __apply_Xcode_12_5_M1_post_install_workaround(installer)
41
+
42
+    # This is necessary for Xcode 14, because it signs resource bundles by default
43
+    # when building for devices.
44
+    installer.target_installation_results.pod_target_installation_results
45
+      .each do |pod_name, target_installation_result|
46
+      target_installation_result.resource_bundle_targets.each do |resource_bundle_target|
47
+        resource_bundle_target.build_configurations.each do |config|
48
+          config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
49
+        end
50
+      end
51
+    end
52
+  end
53
+
54
+  post_integrate do |installer|
55
+    begin
56
+      expo_patch_react_imports!(installer)
57
+    rescue => e
58
+      Pod::UI.warn e
59
+    end
60
+  end
61
+end

+ 3
- 0
ios/Podfile.properties.json Vedi File

@@ -0,0 +1,3 @@
1
+{
2
+  "expo.jsEngine": "jsc"
3
+}

+ 477
- 0
ios/Test.xcodeproj/project.pbxproj Vedi File

@@ -0,0 +1,477 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
11
+		13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
12
+		13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
13
+		3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
14
+		96905EF65AED1B983A6B3ABC /* libPods-Test.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Test.a */; };
15
+		B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
16
+		BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
17
+/* End PBXBuildFile section */
18
+
19
+/* Begin PBXFileReference section */
20
+		008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
21
+		13B07F961A680F5B00A75B9A /* Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Test.app; sourceTree = BUILT_PRODUCTS_DIR; };
22
+		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Test/AppDelegate.h; sourceTree = "<group>"; };
23
+		13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Test/AppDelegate.mm; sourceTree = "<group>"; };
24
+		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Test/Images.xcassets; sourceTree = "<group>"; };
25
+		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Test/Info.plist; sourceTree = "<group>"; };
26
+		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Test/main.m; sourceTree = "<group>"; };
27
+		58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Test.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Test.a"; sourceTree = BUILT_PRODUCTS_DIR; };
28
+		6C2E3173556A471DD304B334 /* Pods-Test.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.debug.xcconfig"; path = "Target Support Files/Pods-Test/Pods-Test.debug.xcconfig"; sourceTree = "<group>"; };
29
+		7A4D352CD337FB3A3BF06240 /* Pods-Test.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.release.xcconfig"; path = "Target Support Files/Pods-Test/Pods-Test.release.xcconfig"; sourceTree = "<group>"; };
30
+		AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Test/SplashScreen.storyboard; sourceTree = "<group>"; };
31
+		BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
32
+		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
33
+		FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Test/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
34
+/* End PBXFileReference section */
35
+
36
+/* Begin PBXFrameworksBuildPhase section */
37
+		13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
38
+			isa = PBXFrameworksBuildPhase;
39
+			buildActionMask = 2147483647;
40
+			files = (
41
+				96905EF65AED1B983A6B3ABC /* libPods-Test.a in Frameworks */,
42
+			);
43
+			runOnlyForDeploymentPostprocessing = 0;
44
+		};
45
+/* End PBXFrameworksBuildPhase section */
46
+
47
+/* Begin PBXGroup section */
48
+		13B07FAE1A68108700A75B9A /* Test */ = {
49
+			isa = PBXGroup;
50
+			children = (
51
+				BB2F792B24A3F905000567C9 /* Supporting */,
52
+				008F07F21AC5B25A0029DE68 /* main.jsbundle */,
53
+				13B07FAF1A68108700A75B9A /* AppDelegate.h */,
54
+				13B07FB01A68108700A75B9A /* AppDelegate.mm */,
55
+				13B07FB51A68108700A75B9A /* Images.xcassets */,
56
+				13B07FB61A68108700A75B9A /* Info.plist */,
57
+				13B07FB71A68108700A75B9A /* main.m */,
58
+				AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
59
+			);
60
+			name = Test;
61
+			sourceTree = "<group>";
62
+		};
63
+		2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
64
+			isa = PBXGroup;
65
+			children = (
66
+				ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
67
+				58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Test.a */,
68
+			);
69
+			name = Frameworks;
70
+			sourceTree = "<group>";
71
+		};
72
+		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
73
+			isa = PBXGroup;
74
+			children = (
75
+			);
76
+			name = Libraries;
77
+			sourceTree = "<group>";
78
+		};
79
+		83CBB9F61A601CBA00E9B192 = {
80
+			isa = PBXGroup;
81
+			children = (
82
+				13B07FAE1A68108700A75B9A /* Test */,
83
+				832341AE1AAA6A7D00B99B32 /* Libraries */,
84
+				83CBBA001A601CBA00E9B192 /* Products */,
85
+				2D16E6871FA4F8E400B85C8A /* Frameworks */,
86
+				D65327D7A22EEC0BE12398D9 /* Pods */,
87
+				D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */,
88
+			);
89
+			indentWidth = 2;
90
+			sourceTree = "<group>";
91
+			tabWidth = 2;
92
+			usesTabs = 0;
93
+		};
94
+		83CBBA001A601CBA00E9B192 /* Products */ = {
95
+			isa = PBXGroup;
96
+			children = (
97
+				13B07F961A680F5B00A75B9A /* Test.app */,
98
+			);
99
+			name = Products;
100
+			sourceTree = "<group>";
101
+		};
102
+		92DBD88DE9BF7D494EA9DA96 /* Test */ = {
103
+			isa = PBXGroup;
104
+			children = (
105
+				FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */,
106
+			);
107
+			name = Test;
108
+			sourceTree = "<group>";
109
+		};
110
+		BB2F792B24A3F905000567C9 /* Supporting */ = {
111
+			isa = PBXGroup;
112
+			children = (
113
+				BB2F792C24A3F905000567C9 /* Expo.plist */,
114
+			);
115
+			name = Supporting;
116
+			path = Test/Supporting;
117
+			sourceTree = "<group>";
118
+		};
119
+		D65327D7A22EEC0BE12398D9 /* Pods */ = {
120
+			isa = PBXGroup;
121
+			children = (
122
+				6C2E3173556A471DD304B334 /* Pods-Test.debug.xcconfig */,
123
+				7A4D352CD337FB3A3BF06240 /* Pods-Test.release.xcconfig */,
124
+			);
125
+			path = Pods;
126
+			sourceTree = "<group>";
127
+		};
128
+		D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = {
129
+			isa = PBXGroup;
130
+			children = (
131
+				92DBD88DE9BF7D494EA9DA96 /* Test */,
132
+			);
133
+			name = ExpoModulesProviders;
134
+			sourceTree = "<group>";
135
+		};
136
+/* End PBXGroup section */
137
+
138
+/* Begin PBXNativeTarget section */
139
+		13B07F861A680F5B00A75B9A /* Test */ = {
140
+			isa = PBXNativeTarget;
141
+			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Test" */;
142
+			buildPhases = (
143
+				08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
144
+				FD10A7F022414F080027D42C /* Start Packager */,
145
+				13B07F871A680F5B00A75B9A /* Sources */,
146
+				13B07F8C1A680F5B00A75B9A /* Frameworks */,
147
+				13B07F8E1A680F5B00A75B9A /* Resources */,
148
+				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
149
+				800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
150
+			);
151
+			buildRules = (
152
+			);
153
+			dependencies = (
154
+			);
155
+			name = Test;
156
+			productName = Test;
157
+			productReference = 13B07F961A680F5B00A75B9A /* Test.app */;
158
+			productType = "com.apple.product-type.application";
159
+		};
160
+/* End PBXNativeTarget section */
161
+
162
+/* Begin PBXProject section */
163
+		83CBB9F71A601CBA00E9B192 /* Project object */ = {
164
+			isa = PBXProject;
165
+			attributes = {
166
+				LastUpgradeCheck = 1130;
167
+				TargetAttributes = {
168
+					13B07F861A680F5B00A75B9A = {
169
+						LastSwiftMigration = 1250;
170
+					};
171
+				};
172
+			};
173
+			buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Test" */;
174
+			compatibilityVersion = "Xcode 3.2";
175
+			developmentRegion = en;
176
+			hasScannedForEncodings = 0;
177
+			knownRegions = (
178
+				en,
179
+				Base,
180
+			);
181
+			mainGroup = 83CBB9F61A601CBA00E9B192;
182
+			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
183
+			projectDirPath = "";
184
+			projectRoot = "";
185
+			targets = (
186
+				13B07F861A680F5B00A75B9A /* Test */,
187
+			);
188
+		};
189
+/* End PBXProject section */
190
+
191
+/* Begin PBXResourcesBuildPhase section */
192
+		13B07F8E1A680F5B00A75B9A /* Resources */ = {
193
+			isa = PBXResourcesBuildPhase;
194
+			buildActionMask = 2147483647;
195
+			files = (
196
+				BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
197
+				13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
198
+				3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
199
+			);
200
+			runOnlyForDeploymentPostprocessing = 0;
201
+		};
202
+/* End PBXResourcesBuildPhase section */
203
+
204
+/* Begin PBXShellScriptBuildPhase section */
205
+		00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
206
+			isa = PBXShellScriptBuildPhase;
207
+			buildActionMask = 2147483647;
208
+			files = (
209
+			);
210
+			inputPaths = (
211
+			);
212
+			name = "Bundle React Native code and images";
213
+			outputPaths = (
214
+			);
215
+			runOnlyForDeploymentPostprocessing = 0;
216
+			shellPath = /bin/sh;
217
+			shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n  source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n  source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n  export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n  # Set the entry JS file using the bundler's entry resolution.\n  export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" $PROJECT_ROOT ios relative | tail -n 1)\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
218
+		};
219
+		08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
220
+			isa = PBXShellScriptBuildPhase;
221
+			buildActionMask = 2147483647;
222
+			files = (
223
+			);
224
+			inputFileListPaths = (
225
+			);
226
+			inputPaths = (
227
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
228
+				"${PODS_ROOT}/Manifest.lock",
229
+			);
230
+			name = "[CP] Check Pods Manifest.lock";
231
+			outputFileListPaths = (
232
+			);
233
+			outputPaths = (
234
+				"$(DERIVED_FILE_DIR)/Pods-Test-checkManifestLockResult.txt",
235
+			);
236
+			runOnlyForDeploymentPostprocessing = 0;
237
+			shellPath = /bin/sh;
238
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
239
+			showEnvVarsInLog = 0;
240
+		};
241
+		800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
242
+			isa = PBXShellScriptBuildPhase;
243
+			buildActionMask = 2147483647;
244
+			files = (
245
+			);
246
+			inputPaths = (
247
+				"${PODS_ROOT}/Target Support Files/Pods-Test/Pods-Test-resources.sh",
248
+				"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
249
+				"${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle",
250
+				"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
251
+			);
252
+			name = "[CP] Copy Pods Resources";
253
+			outputPaths = (
254
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
255
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle",
256
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
257
+			);
258
+			runOnlyForDeploymentPostprocessing = 0;
259
+			shellPath = /bin/sh;
260
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Test/Pods-Test-resources.sh\"\n";
261
+			showEnvVarsInLog = 0;
262
+		};
263
+		FD10A7F022414F080027D42C /* Start Packager */ = {
264
+			isa = PBXShellScriptBuildPhase;
265
+			buildActionMask = 2147483647;
266
+			files = (
267
+			);
268
+			inputFileListPaths = (
269
+			);
270
+			inputPaths = (
271
+			);
272
+			name = "Start Packager";
273
+			outputFileListPaths = (
274
+			);
275
+			outputPaths = (
276
+			);
277
+			runOnlyForDeploymentPostprocessing = 0;
278
+			shellPath = /bin/sh;
279
+			shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n  source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n  source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n    if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n      echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n      exit 2\n    fi\n  else\n    open `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n  fi\nfi\n";
280
+			showEnvVarsInLog = 0;
281
+		};
282
+/* End PBXShellScriptBuildPhase section */
283
+
284
+/* Begin PBXSourcesBuildPhase section */
285
+		13B07F871A680F5B00A75B9A /* Sources */ = {
286
+			isa = PBXSourcesBuildPhase;
287
+			buildActionMask = 2147483647;
288
+			files = (
289
+				13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
290
+				13B07FC11A68108700A75B9A /* main.m in Sources */,
291
+				B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
292
+			);
293
+			runOnlyForDeploymentPostprocessing = 0;
294
+		};
295
+/* End PBXSourcesBuildPhase section */
296
+
297
+/* Begin XCBuildConfiguration section */
298
+		13B07F941A680F5B00A75B9A /* Debug */ = {
299
+			isa = XCBuildConfiguration;
300
+			baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Test.debug.xcconfig */;
301
+			buildSettings = {
302
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
303
+				CLANG_ENABLE_MODULES = YES;
304
+				CURRENT_PROJECT_VERSION = 1;
305
+				ENABLE_BITCODE = NO;
306
+				GCC_PREPROCESSOR_DEFINITIONS = (
307
+					"$(inherited)",
308
+					"FB_SONARKIT_ENABLED=1",
309
+				);
310
+				INFOPLIST_FILE = Test/Info.plist;
311
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
312
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
313
+				OTHER_LDFLAGS = (
314
+					"$(inherited)",
315
+					"-ObjC",
316
+					"-lc++",
317
+				);
318
+				PRODUCT_BUNDLE_IDENTIFIER = org.name.Test;
319
+				PRODUCT_NAME = Test;
320
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
321
+				SWIFT_VERSION = 5.0;
322
+				VERSIONING_SYSTEM = "apple-generic";
323
+			};
324
+			name = Debug;
325
+		};
326
+		13B07F951A680F5B00A75B9A /* Release */ = {
327
+			isa = XCBuildConfiguration;
328
+			baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Test.release.xcconfig */;
329
+			buildSettings = {
330
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
331
+				CLANG_ENABLE_MODULES = YES;
332
+				CURRENT_PROJECT_VERSION = 1;
333
+				INFOPLIST_FILE = Test/Info.plist;
334
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
335
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
336
+				OTHER_LDFLAGS = (
337
+					"$(inherited)",
338
+					"-ObjC",
339
+					"-lc++",
340
+				);
341
+				PRODUCT_BUNDLE_IDENTIFIER = org.name.Test;
342
+				PRODUCT_NAME = Test;
343
+				SWIFT_VERSION = 5.0;
344
+				VERSIONING_SYSTEM = "apple-generic";
345
+			};
346
+			name = Release;
347
+		};
348
+		83CBBA201A601CBA00E9B192 /* Debug */ = {
349
+			isa = XCBuildConfiguration;
350
+			buildSettings = {
351
+				ALWAYS_SEARCH_USER_PATHS = NO;
352
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
353
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
354
+				CLANG_CXX_LIBRARY = "libc++";
355
+				CLANG_ENABLE_MODULES = YES;
356
+				CLANG_ENABLE_OBJC_ARC = YES;
357
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
358
+				CLANG_WARN_BOOL_CONVERSION = YES;
359
+				CLANG_WARN_COMMA = YES;
360
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
361
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
362
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
363
+				CLANG_WARN_EMPTY_BODY = YES;
364
+				CLANG_WARN_ENUM_CONVERSION = YES;
365
+				CLANG_WARN_INFINITE_RECURSION = YES;
366
+				CLANG_WARN_INT_CONVERSION = YES;
367
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
368
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
369
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
370
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
371
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
372
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
373
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
374
+				CLANG_WARN_UNREACHABLE_CODE = YES;
375
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
376
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
377
+				COPY_PHASE_STRIP = NO;
378
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
379
+				ENABLE_TESTABILITY = YES;
380
+				GCC_C_LANGUAGE_STANDARD = gnu99;
381
+				GCC_DYNAMIC_NO_PIC = NO;
382
+				GCC_NO_COMMON_BLOCKS = YES;
383
+				GCC_OPTIMIZATION_LEVEL = 0;
384
+				GCC_PREPROCESSOR_DEFINITIONS = (
385
+					"DEBUG=1",
386
+					"$(inherited)",
387
+				);
388
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
389
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
390
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
391
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
392
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
393
+				GCC_WARN_UNUSED_FUNCTION = YES;
394
+				GCC_WARN_UNUSED_VARIABLE = YES;
395
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
396
+				LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
397
+				LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
398
+				MTL_ENABLE_DEBUG_INFO = YES;
399
+				ONLY_ACTIVE_ARCH = YES;
400
+				SDKROOT = iphoneos;
401
+			};
402
+			name = Debug;
403
+		};
404
+		83CBBA211A601CBA00E9B192 /* Release */ = {
405
+			isa = XCBuildConfiguration;
406
+			buildSettings = {
407
+				ALWAYS_SEARCH_USER_PATHS = NO;
408
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
409
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
410
+				CLANG_CXX_LIBRARY = "libc++";
411
+				CLANG_ENABLE_MODULES = YES;
412
+				CLANG_ENABLE_OBJC_ARC = YES;
413
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
414
+				CLANG_WARN_BOOL_CONVERSION = YES;
415
+				CLANG_WARN_COMMA = YES;
416
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
417
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
418
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
419
+				CLANG_WARN_EMPTY_BODY = YES;
420
+				CLANG_WARN_ENUM_CONVERSION = YES;
421
+				CLANG_WARN_INFINITE_RECURSION = YES;
422
+				CLANG_WARN_INT_CONVERSION = YES;
423
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
424
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
425
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
426
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
427
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
428
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
429
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
430
+				CLANG_WARN_UNREACHABLE_CODE = YES;
431
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
432
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
433
+				COPY_PHASE_STRIP = YES;
434
+				ENABLE_NS_ASSERTIONS = NO;
435
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
436
+				GCC_C_LANGUAGE_STANDARD = gnu99;
437
+				GCC_NO_COMMON_BLOCKS = YES;
438
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
439
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
440
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
441
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
442
+				GCC_WARN_UNUSED_FUNCTION = YES;
443
+				GCC_WARN_UNUSED_VARIABLE = YES;
444
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
445
+				LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
446
+				LIBRARY_SEARCH_PATHS = "\"$(inherited)\"";
447
+				MTL_ENABLE_DEBUG_INFO = NO;
448
+				SDKROOT = iphoneos;
449
+				VALIDATE_PRODUCT = YES;
450
+			};
451
+			name = Release;
452
+		};
453
+/* End XCBuildConfiguration section */
454
+
455
+/* Begin XCConfigurationList section */
456
+		13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Test" */ = {
457
+			isa = XCConfigurationList;
458
+			buildConfigurations = (
459
+				13B07F941A680F5B00A75B9A /* Debug */,
460
+				13B07F951A680F5B00A75B9A /* Release */,
461
+			);
462
+			defaultConfigurationIsVisible = 0;
463
+			defaultConfigurationName = Release;
464
+		};
465
+		83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Test" */ = {
466
+			isa = XCConfigurationList;
467
+			buildConfigurations = (
468
+				83CBBA201A601CBA00E9B192 /* Debug */,
469
+				83CBBA211A601CBA00E9B192 /* Release */,
470
+			);
471
+			defaultConfigurationIsVisible = 0;
472
+			defaultConfigurationName = Release;
473
+		};
474
+/* End XCConfigurationList section */
475
+	};
476
+	rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
477
+}

+ 88
- 0
ios/Test.xcodeproj/xcshareddata/xcschemes/Test.xcscheme Vedi File

@@ -0,0 +1,88 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "1130"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
18
+               BuildableName = "Test.app"
19
+               BlueprintName = "Test"
20
+               ReferencedContainer = "container:Test.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+      </BuildActionEntries>
24
+   </BuildAction>
25
+   <TestAction
26
+      buildConfiguration = "Debug"
27
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+      shouldUseLaunchSchemeArgsEnv = "YES">
30
+      <Testables>
31
+         <TestableReference
32
+            skipped = "NO">
33
+            <BuildableReference
34
+               BuildableIdentifier = "primary"
35
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
36
+               BuildableName = "TestTests.xctest"
37
+               BlueprintName = "TestTests"
38
+               ReferencedContainer = "container:Test.xcodeproj">
39
+            </BuildableReference>
40
+         </TestableReference>
41
+      </Testables>
42
+   </TestAction>
43
+   <LaunchAction
44
+      buildConfiguration = "Debug"
45
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
46
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
47
+      launchStyle = "0"
48
+      useCustomWorkingDirectory = "NO"
49
+      ignoresPersistentStateOnLaunch = "NO"
50
+      debugDocumentVersioning = "YES"
51
+      debugServiceExtension = "internal"
52
+      allowLocationSimulation = "YES">
53
+      <BuildableProductRunnable
54
+         runnableDebuggingMode = "0">
55
+         <BuildableReference
56
+            BuildableIdentifier = "primary"
57
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
58
+            BuildableName = "Test.app"
59
+            BlueprintName = "Test"
60
+            ReferencedContainer = "container:Test.xcodeproj">
61
+         </BuildableReference>
62
+      </BuildableProductRunnable>
63
+   </LaunchAction>
64
+   <ProfileAction
65
+      buildConfiguration = "Release"
66
+      shouldUseLaunchSchemeArgsEnv = "YES"
67
+      savedToolIdentifier = ""
68
+      useCustomWorkingDirectory = "NO"
69
+      debugDocumentVersioning = "YES">
70
+      <BuildableProductRunnable
71
+         runnableDebuggingMode = "0">
72
+         <BuildableReference
73
+            BuildableIdentifier = "primary"
74
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
75
+            BuildableName = "Test.app"
76
+            BlueprintName = "Test"
77
+            ReferencedContainer = "container:Test.xcodeproj">
78
+         </BuildableReference>
79
+      </BuildableProductRunnable>
80
+   </ProfileAction>
81
+   <AnalyzeAction
82
+      buildConfiguration = "Debug">
83
+   </AnalyzeAction>
84
+   <ArchiveAction
85
+      buildConfiguration = "Release"
86
+      revealArchiveInOrganizer = "YES">
87
+   </ArchiveAction>
88
+</Scheme>

+ 9
- 0
ios/Test/AppDelegate.h Vedi File

@@ -0,0 +1,9 @@
1
+#import <Foundation/Foundation.h>
2
+#import <React/RCTBridgeDelegate.h>
3
+#import <UIKit/UIKit.h>
4
+
5
+#import <Expo/Expo.h>
6
+
7
+@interface AppDelegate : EXAppDelegateWrapper <RCTBridgeDelegate>
8
+
9
+@end

+ 166
- 0
ios/Test/AppDelegate.mm Vedi File

@@ -0,0 +1,166 @@
1
+#import "AppDelegate.h"
2
+
3
+#import <React/RCTBridge.h>
4
+#import <React/RCTBundleURLProvider.h>
5
+#import <React/RCTRootView.h>
6
+#import <React/RCTLinkingManager.h>
7
+#import <React/RCTConvert.h>
8
+
9
+#import <React/RCTAppSetupUtils.h>
10
+
11
+#if RCT_NEW_ARCH_ENABLED
12
+#import <React/CoreModulesPlugins.h>
13
+#import <React/RCTCxxBridgeDelegate.h>
14
+#import <React/RCTFabricSurfaceHostingProxyRootView.h>
15
+#import <React/RCTSurfacePresenter.h>
16
+#import <React/RCTSurfacePresenterBridgeAdapter.h>
17
+#import <ReactCommon/RCTTurboModuleManager.h>
18
+
19
+#import <react/config/ReactNativeConfig.h>
20
+
21
+static NSString *const kRNConcurrentRoot = @"concurrentRoot";
22
+
23
+@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> {
24
+  RCTTurboModuleManager *_turboModuleManager;
25
+  RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
26
+  std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
27
+  facebook::react::ContextContainer::Shared _contextContainer;
28
+}
29
+@end
30
+#endif
31
+
32
+@implementation AppDelegate
33
+
34
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
35
+{
36
+  RCTAppSetupPrepareApp(application);
37
+
38
+  RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
39
+
40
+#if RCT_NEW_ARCH_ENABLED
41
+  _contextContainer = std::make_shared<facebook::react::ContextContainer const>();
42
+  _reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
43
+  _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
44
+  _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
45
+  bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
46
+#endif
47
+
48
+  NSDictionary *initProps = [self prepareInitialProps];
49
+  UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:initProps];
50
+
51
+  rootView.backgroundColor = [UIColor whiteColor];
52
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
53
+  UIViewController *rootViewController = [self.reactDelegate createRootViewController];
54
+  rootViewController.view = rootView;
55
+  self.window.rootViewController = rootViewController;
56
+  [self.window makeKeyAndVisible];
57
+
58
+  [super application:application didFinishLaunchingWithOptions:launchOptions];
59
+
60
+  return YES;
61
+}
62
+
63
+- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
64
+{
65
+  // If you'd like to export some custom RCTBridgeModules, add them here!
66
+  return @[];
67
+}
68
+
69
+/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
70
+///
71
+/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
72
+/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
73
+/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`.
74
+- (BOOL)concurrentRootEnabled
75
+{
76
+  // Switch this bool to turn on and off the concurrent root
77
+  return true;
78
+}
79
+
80
+- (NSDictionary *)prepareInitialProps
81
+{
82
+  NSMutableDictionary *initProps = [NSMutableDictionary new];
83
+#if RCT_NEW_ARCH_ENABLED
84
+  initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
85
+#endif
86
+  return initProps;
87
+}
88
+
89
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
90
+{
91
+#if DEBUG
92
+  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
93
+#else
94
+  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
95
+#endif
96
+}
97
+
98
+// Linking API
99
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
100
+  return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
101
+}
102
+
103
+// Universal Links
104
+- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
105
+  BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
106
+  return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
107
+}
108
+
109
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
110
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
111
+{
112
+  return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
113
+}
114
+
115
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
116
+- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
117
+{
118
+  return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
119
+}
120
+
121
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
122
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
123
+{
124
+  return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
125
+}
126
+
127
+#if RCT_NEW_ARCH_ENABLED
128
+
129
+#pragma mark - RCTCxxBridgeDelegate
130
+
131
+- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
132
+{
133
+  _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
134
+                                                             delegate:self
135
+                                                            jsInvoker:bridge.jsCallInvoker];
136
+  return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
137
+}
138
+
139
+#pragma mark RCTTurboModuleManagerDelegate
140
+
141
+- (Class)getModuleClassFromName:(const char *)name
142
+{
143
+  return RCTCoreModulesClassProvider(name);
144
+}
145
+
146
+- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
147
+                                                      jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
148
+{
149
+  return nullptr;
150
+}
151
+
152
+- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name
153
+                                                     initParams:
154
+                                                         (const facebook::react::ObjCTurboModule::InitParams &)params
155
+{
156
+  return nullptr;
157
+}
158
+
159
+- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass
160
+{
161
+  return RCTAppSetupDefaultModuleFromClass(moduleClass);
162
+}
163
+
164
+#endif
165
+
166
+@end

+ 38
- 0
ios/Test/Images.xcassets/AppIcon.appiconset/Contents.json Vedi File

@@ -0,0 +1,38 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "29x29",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "29x29",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "40x40",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "40x40",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "60x60",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "60x60",
31
+      "scale" : "3x"
32
+    }
33
+  ],
34
+  "info" : {
35
+    "version" : 1,
36
+    "author" : "expo"
37
+  }
38
+}

+ 6
- 0
ios/Test/Images.xcassets/Contents.json Vedi File

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "expo"
5
+  }
6
+}

+ 21
- 0
ios/Test/Images.xcassets/SplashScreen.imageset/Contents.json Vedi File

@@ -0,0 +1,21 @@
1
+{
2
+  "images": [
3
+    {
4
+      "idiom": "universal",
5
+      "filename": "splashscreen.png",
6
+      "scale": "1x"
7
+    },
8
+    {
9
+      "idiom": "universal",
10
+      "scale": "2x"
11
+    },
12
+    {
13
+      "idiom": "universal",
14
+      "scale": "3x"
15
+    }
16
+  ],
17
+  "info": {
18
+    "version": 1,
19
+    "author": "expo"
20
+  }
21
+}

BIN
ios/Test/Images.xcassets/SplashScreen.imageset/splashscreen.png Vedi File


+ 21
- 0
ios/Test/Images.xcassets/SplashScreenBackground.imageset/Contents.json Vedi File

@@ -0,0 +1,21 @@
1
+{
2
+  "images": [
3
+    {
4
+      "idiom": "universal",
5
+      "filename": "background.png",
6
+      "scale": "1x"
7
+    },
8
+    {
9
+      "idiom": "universal",
10
+      "scale": "2x"
11
+    },
12
+    {
13
+      "idiom": "universal",
14
+      "scale": "3x"
15
+    }
16
+  ],
17
+  "info": {
18
+    "version": 1,
19
+    "author": "expo"
20
+  }
21
+}

BIN
ios/Test/Images.xcassets/SplashScreenBackground.imageset/background.png Vedi File


+ 55
- 0
ios/Test/Info.plist Vedi File

@@ -0,0 +1,55 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
17
+	<key>CFBundleSignature</key>
18
+	<string>????</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>1.0</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>NSAppTransportSecurity</key>
26
+	<dict>
27
+		<key>NSAllowsArbitraryLoads</key>
28
+		<true/>
29
+		<key>NSExceptionDomains</key>
30
+		<dict>
31
+			<key>localhost</key>
32
+			<dict>
33
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
34
+				<true/>
35
+			</dict>
36
+		</dict>
37
+	</dict>
38
+	<key>UILaunchStoryboardName</key>
39
+	<string>SplashScreen</string>
40
+	<key>UIRequiredDeviceCapabilities</key>
41
+	<array>
42
+		<string>armv7</string>
43
+	</array>
44
+	<key>UISupportedInterfaceOrientations</key>
45
+	<array>
46
+		<string>UIInterfaceOrientationPortrait</string>
47
+		<string>UIInterfaceOrientationLandscapeLeft</string>
48
+		<string>UIInterfaceOrientationLandscapeRight</string>
49
+	</array>
50
+	<key>UIViewControllerBasedStatusBarAppearance</key>
51
+	<false/>
52
+  <key>UIStatusBarStyle</key>
53
+  <string>UIStatusBarStyleDefault</string>
54
+</dict>
55
+</plist>

+ 91
- 0
ios/Test/SplashScreen.storyboard Vedi File

@@ -0,0 +1,91 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document
3
+  type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB"
4
+  version="3.0"
5
+  toolsVersion="16096"
6
+  targetRuntime="iOS.CocoaTouch"
7
+  propertyAccessControl="none"
8
+  useAutolayout="YES"
9
+  launchScreen="YES"
10
+  useTraitCollections="YES"
11
+  useSafeAreas="YES"
12
+  colorMatched="YES"
13
+  initialViewController="EXPO-VIEWCONTROLLER-1"
14
+>
15
+  <device id="retina5_5" orientation="portrait" appearance="light"/>
16
+  <dependencies>
17
+    <deployment identifier="iOS"/>
18
+    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
19
+    <capability name="Safe area layout guides" minToolsVersion="9.0"/>
20
+    <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
21
+  </dependencies>
22
+  <scenes>
23
+    <!--View Controller-->
24
+    <scene sceneID="EXPO-SCENE-1">
25
+      <objects>
26
+        <viewController
27
+          storyboardIdentifier="SplashScreenViewController"
28
+          id="EXPO-VIEWCONTROLLER-1"
29
+          sceneMemberID="viewController"
30
+        >
31
+          <view
32
+            key="view"
33
+            userInteractionEnabled="NO"
34
+            contentMode="scaleToFill"
35
+            insetsLayoutMarginsFromSafeArea="NO"
36
+            id="EXPO-ContainerView"
37
+            userLabel="ContainerView"
38
+          >
39
+            <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
40
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
41
+            <subviews>
42
+              <imageView
43
+                userInteractionEnabled="NO"
44
+                contentMode="scaleAspectFill"
45
+                horizontalHuggingPriority="251"
46
+                verticalHuggingPriority="251"
47
+                insetsLayoutMarginsFromSafeArea="NO"
48
+                image="SplashScreenBackground"
49
+                translatesAutoresizingMaskIntoConstraints="NO"
50
+                id="EXPO-SplashScreenBackground"
51
+                userLabel="SplashScreenBackground"
52
+              >
53
+                <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
54
+              </imageView>
55
+              <imageView
56
+                clipsSubviews="YES"
57
+                userInteractionEnabled="NO"
58
+                contentMode="scaleAspectFit"
59
+                horizontalHuggingPriority="251"
60
+                verticalHuggingPriority="251"
61
+                translatesAutoresizingMaskIntoConstraints="NO"
62
+                image="SplashScreen"
63
+                id="EXPO-SplashScreen"
64
+                userLabel="SplashScreen"
65
+              >
66
+                <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
67
+              </imageView>
68
+            </subviews>
69
+            <constraints>
70
+              <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="1gX-mQ-vu6"/>
71
+              <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="6tX-OG-Sck"/>
72
+              <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="ABX-8g-7v4"/>
73
+              <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="jkI-2V-eW5"/>
74
+              <constraint firstItem="EXPO-SplashScreen" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="2VS-Uz-0LU"/>
75
+              <constraint firstItem="EXPO-SplashScreen" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="LhH-Ei-DKo"/>
76
+              <constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="I6l-TP-6fn"/>
77
+              <constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="nbp-HC-eaG"/>
78
+            </constraints>
79
+            <viewLayoutGuide key="safeArea" id="Rmq-lb-GrQ"/>
80
+          </view>
81
+        </viewController>
82
+        <placeholder placeholderIdentifier="IBFirstResponder" id="EXPO-PLACEHOLDER-1" userLabel="First Responder" sceneMemberID="firstResponder"/>
83
+      </objects>
84
+      <point key="canvasLocation" x="140.625" y="129.4921875"/>
85
+    </scene>
86
+  </scenes>
87
+  <resources>
88
+    <image name="SplashScreen" width="414" height="736"/>
89
+    <image name="SplashScreenBackground" width="1" height="1"/>
90
+  </resources>
91
+</document>

+ 10
- 0
ios/Test/Supporting/Expo.plist Vedi File

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+        <key>EXUpdatesSDKVersion</key>
6
+        <string>YOUR-APP-SDK-VERSION-HERE</string>
7
+        <key>EXUpdatesURL</key>
8
+        <string>YOUR-APP-URL-HERE</string>
9
+</dict>
10
+</plist>

+ 10
- 0
ios/Test/main.m Vedi File

@@ -0,0 +1,10 @@
1
+#import <UIKit/UIKit.h>
2
+
3
+#import "AppDelegate.h"
4
+
5
+int main(int argc, char * argv[]) {
6
+  @autoreleasepool {
7
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
8
+  }
9
+}
10
+

+ 4
- 0
metro.config.js Vedi File

@@ -0,0 +1,4 @@
1
+// Learn more https://docs.expo.io/guides/customizing-metro
2
+const { getDefaultConfig } = require('expo/metro-config');
3
+
4
+module.exports = getDefaultConfig(__dirname);

+ 22
- 0
package.json Vedi File

@@ -0,0 +1,22 @@
1
+{
2
+  "name": "test",
3
+  "version": "1.0.0",
4
+  "main": "index.js",
5
+  "scripts": {
6
+    "start": "expo start --dev-client",
7
+    "android": "expo run:android",
8
+    "ios": "expo run:ios",
9
+    "web": "expo start --web"
10
+  },
11
+  "dependencies": {
12
+    "expo": "~47.0.6",
13
+    "expo-splash-screen": "~0.17.5",
14
+    "expo-status-bar": "~1.4.2",
15
+    "react": "18.1.0",
16
+    "react-native": "0.70.5"
17
+  },
18
+  "devDependencies": {
19
+    "@babel/core": "^7.12.9"
20
+  },
21
+  "private": true
22
+}

+ 6615
- 0
yarn.lock
File diff soppresso perché troppo grande
Vedi File