Showing
73 changed files
with
2269 additions
and
0 deletions
DetectApp/.buckconfig
0 → 100644
DetectApp/.bundle/config
0 → 100644
DetectApp/.eslintrc.js
0 → 100644
1 | +module.exports = { | ||
2 | + root: true, | ||
3 | + extends: '@react-native-community', | ||
4 | + parser: '@typescript-eslint/parser', | ||
5 | + plugins: ['@typescript-eslint'], | ||
6 | + overrides: [ | ||
7 | + { | ||
8 | + files: ['*.ts', '*.tsx'], | ||
9 | + rules: { | ||
10 | + '@typescript-eslint/no-shadow': ['error'], | ||
11 | + 'no-shadow': 'off', | ||
12 | + 'no-undef': 'off', | ||
13 | + }, | ||
14 | + }, | ||
15 | + ], | ||
16 | +}; |
DetectApp/.gitignore
0 → 100644
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 | + | ||
24 | +# Android/IntelliJ | ||
25 | +# | ||
26 | +build/ | ||
27 | +.idea | ||
28 | +.gradle | ||
29 | +local.properties | ||
30 | +*.iml | ||
31 | +*.hprof | ||
32 | + | ||
33 | +# node.js | ||
34 | +# | ||
35 | +node_modules/ | ||
36 | +npm-debug.log | ||
37 | +yarn-error.log | ||
38 | + | ||
39 | +# BUCK | ||
40 | +buck-out/ | ||
41 | +\.buckd/ | ||
42 | +*.keystore | ||
43 | +!debug.keystore | ||
44 | + | ||
45 | +# fastlane | ||
46 | +# | ||
47 | +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the | ||
48 | +# screenshots whenever they are needed. | ||
49 | +# For more information about the recommended setup visit: | ||
50 | +# https://docs.fastlane.tools/best-practices/source-control/ | ||
51 | + | ||
52 | +*/fastlane/report.xml | ||
53 | +*/fastlane/Preview.html | ||
54 | +*/fastlane/screenshots | ||
55 | + | ||
56 | +# Bundle artifact | ||
57 | +*.jsbundle | ||
58 | + | ||
59 | +# Ruby / CocoaPods | ||
60 | +/ios/Pods/ | ||
61 | +/vendor/bundle/ |
DetectApp/.prettierrc.js
0 → 100644
DetectApp/.ruby-version
0 → 100644
1 | +2.7.4 |
DetectApp/.watchmanconfig
0 → 100644
1 | +{} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DetectApp/App.tsx
0 → 100644
1 | +/** | ||
2 | + * Sample React Native App | ||
3 | + * https://github.com/facebook/react-native | ||
4 | + * | ||
5 | + * Generated with the TypeScript template | ||
6 | + * https://github.com/react-native-community/react-native-template-typescript | ||
7 | + * | ||
8 | + * @format | ||
9 | + */ | ||
10 | + | ||
11 | +import React from 'react'; | ||
12 | +import { | ||
13 | + SafeAreaView, | ||
14 | + ScrollView, | ||
15 | + StatusBar, | ||
16 | + StyleSheet, | ||
17 | + Text, | ||
18 | + useColorScheme, | ||
19 | + View, | ||
20 | +} from 'react-native'; | ||
21 | + | ||
22 | +import { | ||
23 | + Colors, | ||
24 | + DebugInstructions, | ||
25 | + Header, | ||
26 | + LearnMoreLinks, | ||
27 | + ReloadInstructions, | ||
28 | +} from 'react-native/Libraries/NewAppScreen'; | ||
29 | + | ||
30 | +const Section: React.FC<{ | ||
31 | + title: string; | ||
32 | +}> = ({children, title}) => { | ||
33 | + const isDarkMode = useColorScheme() === 'dark'; | ||
34 | + return ( | ||
35 | + <View style={styles.sectionContainer}> | ||
36 | + <Text | ||
37 | + style={[ | ||
38 | + styles.sectionTitle, | ||
39 | + { | ||
40 | + color: isDarkMode ? Colors.white : Colors.black, | ||
41 | + }, | ||
42 | + ]}> | ||
43 | + {title} | ||
44 | + </Text> | ||
45 | + <Text | ||
46 | + style={[ | ||
47 | + styles.sectionDescription, | ||
48 | + { | ||
49 | + color: isDarkMode ? Colors.light : Colors.dark, | ||
50 | + }, | ||
51 | + ]}> | ||
52 | + {children} | ||
53 | + </Text> | ||
54 | + </View> | ||
55 | + ); | ||
56 | +}; | ||
57 | + | ||
58 | +const App = () => { | ||
59 | + const isDarkMode = useColorScheme() === 'dark'; | ||
60 | + | ||
61 | + const backgroundStyle = { | ||
62 | + backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, | ||
63 | + }; | ||
64 | + | ||
65 | + return ( | ||
66 | + <SafeAreaView style={backgroundStyle}> | ||
67 | + <StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} /> | ||
68 | + <ScrollView | ||
69 | + contentInsetAdjustmentBehavior="automatic" | ||
70 | + style={backgroundStyle}> | ||
71 | + <Header /> | ||
72 | + <View | ||
73 | + style={{ | ||
74 | + backgroundColor: isDarkMode ? Colors.black : Colors.white, | ||
75 | + }}> | ||
76 | + <Section title="Step One"> | ||
77 | + Edit <Text style={styles.highlight}>App.tsx</Text> to change this | ||
78 | + screen and then come back to see your edits. | ||
79 | + </Section> | ||
80 | + <Section title="See Your Changes"> | ||
81 | + <ReloadInstructions /> | ||
82 | + </Section> | ||
83 | + <Section title="Debug"> | ||
84 | + <DebugInstructions /> | ||
85 | + </Section> | ||
86 | + <Section title="Learn More"> | ||
87 | + Read the docs to discover what to do next: | ||
88 | + </Section> | ||
89 | + <LearnMoreLinks /> | ||
90 | + </View> | ||
91 | + </ScrollView> | ||
92 | + </SafeAreaView> | ||
93 | + ); | ||
94 | +}; | ||
95 | + | ||
96 | +const styles = StyleSheet.create({ | ||
97 | + sectionContainer: { | ||
98 | + marginTop: 32, | ||
99 | + paddingHorizontal: 24, | ||
100 | + }, | ||
101 | + sectionTitle: { | ||
102 | + fontSize: 24, | ||
103 | + fontWeight: '600', | ||
104 | + }, | ||
105 | + sectionDescription: { | ||
106 | + marginTop: 8, | ||
107 | + fontSize: 18, | ||
108 | + fontWeight: '400', | ||
109 | + }, | ||
110 | + highlight: { | ||
111 | + fontWeight: '700', | ||
112 | + }, | ||
113 | +}); | ||
114 | + | ||
115 | +export default App; |
DetectApp/Gemfile
0 → 100644
DetectApp/Gemfile.lock
0 → 100644
1 | +GEM | ||
2 | + remote: https://rubygems.org/ | ||
3 | + specs: | ||
4 | + CFPropertyList (3.0.5) | ||
5 | + rexml | ||
6 | + activesupport (6.1.5) | ||
7 | + concurrent-ruby (~> 1.0, >= 1.0.2) | ||
8 | + i18n (>= 1.6, < 2) | ||
9 | + minitest (>= 5.1) | ||
10 | + tzinfo (~> 2.0) | ||
11 | + zeitwerk (~> 2.3) | ||
12 | + addressable (2.8.0) | ||
13 | + public_suffix (>= 2.0.2, < 5.0) | ||
14 | + algoliasearch (1.27.5) | ||
15 | + httpclient (~> 2.8, >= 2.8.3) | ||
16 | + json (>= 1.5.1) | ||
17 | + atomos (0.1.3) | ||
18 | + claide (1.1.0) | ||
19 | + cocoapods (1.11.3) | ||
20 | + addressable (~> 2.8) | ||
21 | + claide (>= 1.0.2, < 2.0) | ||
22 | + cocoapods-core (= 1.11.3) | ||
23 | + cocoapods-deintegrate (>= 1.0.3, < 2.0) | ||
24 | + cocoapods-downloader (>= 1.4.0, < 2.0) | ||
25 | + cocoapods-plugins (>= 1.0.0, < 2.0) | ||
26 | + cocoapods-search (>= 1.0.0, < 2.0) | ||
27 | + cocoapods-trunk (>= 1.4.0, < 2.0) | ||
28 | + cocoapods-try (>= 1.1.0, < 2.0) | ||
29 | + colored2 (~> 3.1) | ||
30 | + escape (~> 0.0.4) | ||
31 | + fourflusher (>= 2.3.0, < 3.0) | ||
32 | + gh_inspector (~> 1.0) | ||
33 | + molinillo (~> 0.8.0) | ||
34 | + nap (~> 1.0) | ||
35 | + ruby-macho (>= 1.0, < 3.0) | ||
36 | + xcodeproj (>= 1.21.0, < 2.0) | ||
37 | + cocoapods-core (1.11.3) | ||
38 | + activesupport (>= 5.0, < 7) | ||
39 | + addressable (~> 2.8) | ||
40 | + algoliasearch (~> 1.0) | ||
41 | + concurrent-ruby (~> 1.1) | ||
42 | + fuzzy_match (~> 2.0.4) | ||
43 | + nap (~> 1.0) | ||
44 | + netrc (~> 0.11) | ||
45 | + public_suffix (~> 4.0) | ||
46 | + typhoeus (~> 1.0) | ||
47 | + cocoapods-deintegrate (1.0.5) | ||
48 | + cocoapods-downloader (1.6.3) | ||
49 | + cocoapods-plugins (1.0.0) | ||
50 | + nap | ||
51 | + cocoapods-search (1.0.1) | ||
52 | + cocoapods-trunk (1.6.0) | ||
53 | + nap (>= 0.8, < 2.0) | ||
54 | + netrc (~> 0.11) | ||
55 | + cocoapods-try (1.2.0) | ||
56 | + colored2 (3.1.2) | ||
57 | + concurrent-ruby (1.1.10) | ||
58 | + escape (0.0.4) | ||
59 | + ethon (0.15.0) | ||
60 | + ffi (>= 1.15.0) | ||
61 | + ffi (1.15.5) | ||
62 | + fourflusher (2.3.1) | ||
63 | + fuzzy_match (2.0.4) | ||
64 | + gh_inspector (1.1.3) | ||
65 | + httpclient (2.8.3) | ||
66 | + i18n (1.10.0) | ||
67 | + concurrent-ruby (~> 1.0) | ||
68 | + json (2.6.1) | ||
69 | + minitest (5.15.0) | ||
70 | + molinillo (0.8.0) | ||
71 | + nanaimo (0.3.0) | ||
72 | + nap (1.1.0) | ||
73 | + netrc (0.11.0) | ||
74 | + public_suffix (4.0.7) | ||
75 | + rexml (3.2.5) | ||
76 | + ruby-macho (2.5.1) | ||
77 | + typhoeus (1.4.0) | ||
78 | + ethon (>= 0.9.0) | ||
79 | + tzinfo (2.0.4) | ||
80 | + concurrent-ruby (~> 1.0) | ||
81 | + xcodeproj (1.21.0) | ||
82 | + CFPropertyList (>= 2.3.3, < 4.0) | ||
83 | + atomos (~> 0.1.3) | ||
84 | + claide (>= 1.0.2, < 2.0) | ||
85 | + colored2 (~> 3.1) | ||
86 | + nanaimo (~> 0.3.0) | ||
87 | + rexml (~> 3.2.4) | ||
88 | + zeitwerk (2.5.4) | ||
89 | + | ||
90 | +PLATFORMS | ||
91 | + ruby | ||
92 | + | ||
93 | +DEPENDENCIES | ||
94 | + cocoapods (~> 1.11, >= 1.11.2) | ||
95 | + | ||
96 | +RUBY VERSION | ||
97 | + ruby 2.7.4p191 | ||
98 | + | ||
99 | +BUNDLED WITH | ||
100 | + 2.2.27 |
DetectApp/__tests__/App-test.tsx
0 → 100644
1 | +/** | ||
2 | + * @format | ||
3 | + */ | ||
4 | + | ||
5 | +import 'react-native'; | ||
6 | +import React from 'react'; | ||
7 | +import App from '../App'; | ||
8 | + | ||
9 | +// Note: test renderer must be required after react-native. | ||
10 | +import renderer from 'react-test-renderer'; | ||
11 | + | ||
12 | +it('renders correctly', () => { | ||
13 | + renderer.create(<App />); | ||
14 | +}); |
DetectApp/android/app/_BUCK
0 → 100644
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.detectapp", | ||
39 | +) | ||
40 | + | ||
41 | +android_resource( | ||
42 | + name = "res", | ||
43 | + package = "com.detectapp", | ||
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 | +) |
DetectApp/android/app/build.gradle
0 → 100644
This diff is collapsed. Click to expand it.
DetectApp/android/app/build_defs.bzl
0 → 100644
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 | + ) |
DetectApp/android/app/debug.keystore
0 → 100644
No preview for this file type
DetectApp/android/app/proguard-rules.pro
0 → 100644
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 | +# Add any project specific keep options here: |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:tools="http://schemas.android.com/tools"> | ||
4 | + | ||
5 | + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> | ||
6 | + | ||
7 | + <application | ||
8 | + android:usesCleartextTraffic="true" | ||
9 | + tools:targetApi="28" | ||
10 | + tools:ignore="GoogleAppIndexingWarning"> | ||
11 | + <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" /> | ||
12 | + </application> | ||
13 | +</manifest> |
1 | +/** | ||
2 | + * Copyright (c) Meta Platforms, Inc. and 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.detectapp; | ||
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.ReactInstanceEventListener; | ||
23 | +import com.facebook.react.ReactInstanceManager; | ||
24 | +import com.facebook.react.bridge.ReactContext; | ||
25 | +import com.facebook.react.modules.network.NetworkingModule; | ||
26 | +import okhttp3.OkHttpClient; | ||
27 | + | ||
28 | +public class ReactNativeFlipper { | ||
29 | + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { | ||
30 | + if (FlipperUtils.shouldEnableFlipper(context)) { | ||
31 | + final FlipperClient client = AndroidFlipperClient.getInstance(context); | ||
32 | + | ||
33 | + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); | ||
34 | + client.addPlugin(new ReactFlipperPlugin()); | ||
35 | + client.addPlugin(new DatabasesFlipperPlugin(context)); | ||
36 | + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); | ||
37 | + client.addPlugin(CrashReporterPlugin.getInstance()); | ||
38 | + | ||
39 | + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); | ||
40 | + NetworkingModule.setCustomClientBuilder( | ||
41 | + new NetworkingModule.CustomClientBuilder() { | ||
42 | + @Override | ||
43 | + public void apply(OkHttpClient.Builder builder) { | ||
44 | + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); | ||
45 | + } | ||
46 | + }); | ||
47 | + client.addPlugin(networkFlipperPlugin); | ||
48 | + client.start(); | ||
49 | + | ||
50 | + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized | ||
51 | + // Hence we run if after all native modules have been initialized | ||
52 | + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); | ||
53 | + if (reactContext == null) { | ||
54 | + reactInstanceManager.addReactInstanceEventListener( | ||
55 | + new ReactInstanceEventListener() { | ||
56 | + @Override | ||
57 | + public void onReactContextInitialized(ReactContext reactContext) { | ||
58 | + reactInstanceManager.removeReactInstanceEventListener(this); | ||
59 | + reactContext.runOnNativeModulesQueueThread( | ||
60 | + new Runnable() { | ||
61 | + @Override | ||
62 | + public void run() { | ||
63 | + client.addPlugin(new FrescoFlipperPlugin()); | ||
64 | + } | ||
65 | + }); | ||
66 | + } | ||
67 | + }); | ||
68 | + } else { | ||
69 | + client.addPlugin(new FrescoFlipperPlugin()); | ||
70 | + } | ||
71 | + } | ||
72 | + } | ||
73 | +} |
1 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | + package="com.detectapp"> | ||
3 | + | ||
4 | + <uses-permission android:name="android.permission.INTERNET" /> | ||
5 | + | ||
6 | + <application | ||
7 | + android:name=".MainApplication" | ||
8 | + android:label="@string/app_name" | ||
9 | + android:icon="@mipmap/ic_launcher" | ||
10 | + android:roundIcon="@mipmap/ic_launcher_round" | ||
11 | + android:allowBackup="false" | ||
12 | + android:theme="@style/AppTheme"> | ||
13 | + <activity | ||
14 | + android:name=".MainActivity" | ||
15 | + android:label="@string/app_name" | ||
16 | + android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" | ||
17 | + android:launchMode="singleTask" | ||
18 | + android:windowSoftInputMode="adjustResize" | ||
19 | + android:exported="true"> | ||
20 | + <intent-filter> | ||
21 | + <action android:name="android.intent.action.MAIN" /> | ||
22 | + <category android:name="android.intent.category.LAUNCHER" /> | ||
23 | + </intent-filter> | ||
24 | + </activity> | ||
25 | + </application> | ||
26 | +</manifest> |
1 | +package com.detectapp; | ||
2 | + | ||
3 | +import com.facebook.react.ReactActivity; | ||
4 | +import com.facebook.react.ReactActivityDelegate; | ||
5 | +import com.facebook.react.ReactRootView; | ||
6 | + | ||
7 | +public class MainActivity extends ReactActivity { | ||
8 | + | ||
9 | + /** | ||
10 | + * Returns the name of the main component registered from JavaScript. This is used to schedule | ||
11 | + * rendering of the component. | ||
12 | + */ | ||
13 | + @Override | ||
14 | + protected String getMainComponentName() { | ||
15 | + return "DetectApp"; | ||
16 | + } | ||
17 | + | ||
18 | + /** | ||
19 | + * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and | ||
20 | + * you can specify the rendered you wish to use (Fabric or the older renderer). | ||
21 | + */ | ||
22 | + @Override | ||
23 | + protected ReactActivityDelegate createReactActivityDelegate() { | ||
24 | + return new MainActivityDelegate(this, getMainComponentName()); | ||
25 | + } | ||
26 | + | ||
27 | + public static class MainActivityDelegate extends ReactActivityDelegate { | ||
28 | + public MainActivityDelegate(ReactActivity activity, String mainComponentName) { | ||
29 | + super(activity, mainComponentName); | ||
30 | + } | ||
31 | + | ||
32 | + @Override | ||
33 | + protected ReactRootView createRootView() { | ||
34 | + ReactRootView reactRootView = new ReactRootView(getContext()); | ||
35 | + // If you opted-in for the New Architecture, we enable the Fabric Renderer. | ||
36 | + reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); | ||
37 | + return reactRootView; | ||
38 | + } | ||
39 | + } | ||
40 | +} |
1 | +package com.detectapp; | ||
2 | + | ||
3 | +import android.app.Application; | ||
4 | +import android.content.Context; | ||
5 | +import com.facebook.react.PackageList; | ||
6 | +import com.facebook.react.ReactApplication; | ||
7 | +import com.facebook.react.ReactInstanceManager; | ||
8 | +import com.facebook.react.ReactNativeHost; | ||
9 | +import com.facebook.react.ReactPackage; | ||
10 | +import com.facebook.react.config.ReactFeatureFlags; | ||
11 | +import com.facebook.soloader.SoLoader; | ||
12 | +import com.detectapp.newarchitecture.MainApplicationReactNativeHost; | ||
13 | +import java.lang.reflect.InvocationTargetException; | ||
14 | +import java.util.List; | ||
15 | + | ||
16 | +public class MainApplication extends Application implements ReactApplication { | ||
17 | + | ||
18 | + private final ReactNativeHost mReactNativeHost = | ||
19 | + new ReactNativeHost(this) { | ||
20 | + @Override | ||
21 | + public boolean getUseDeveloperSupport() { | ||
22 | + return BuildConfig.DEBUG; | ||
23 | + } | ||
24 | + | ||
25 | + @Override | ||
26 | + protected List<ReactPackage> getPackages() { | ||
27 | + @SuppressWarnings("UnnecessaryLocalVariable") | ||
28 | + List<ReactPackage> packages = new PackageList(this).getPackages(); | ||
29 | + // Packages that cannot be autolinked yet can be added manually here, for example: | ||
30 | + // packages.add(new MyReactNativePackage()); | ||
31 | + return packages; | ||
32 | + } | ||
33 | + | ||
34 | + @Override | ||
35 | + protected String getJSMainModuleName() { | ||
36 | + return "index"; | ||
37 | + } | ||
38 | + }; | ||
39 | + | ||
40 | + private final ReactNativeHost mNewArchitectureNativeHost = | ||
41 | + new MainApplicationReactNativeHost(this); | ||
42 | + | ||
43 | + @Override | ||
44 | + public ReactNativeHost getReactNativeHost() { | ||
45 | + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { | ||
46 | + return mNewArchitectureNativeHost; | ||
47 | + } else { | ||
48 | + return mReactNativeHost; | ||
49 | + } | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public void onCreate() { | ||
54 | + super.onCreate(); | ||
55 | + // If you opted-in for the New Architecture, we enable the TurboModule system | ||
56 | + ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; | ||
57 | + SoLoader.init(this, /* native exopackage */ false); | ||
58 | + initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); | ||
59 | + } | ||
60 | + | ||
61 | + /** | ||
62 | + * Loads Flipper in React Native templates. Call this in the onCreate method with something like | ||
63 | + * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); | ||
64 | + * | ||
65 | + * @param context | ||
66 | + * @param reactInstanceManager | ||
67 | + */ | ||
68 | + private static void initializeFlipper( | ||
69 | + Context context, ReactInstanceManager reactInstanceManager) { | ||
70 | + if (BuildConfig.DEBUG) { | ||
71 | + try { | ||
72 | + /* | ||
73 | + We use reflection here to pick up the class that initializes Flipper, | ||
74 | + since Flipper library is not available in release mode | ||
75 | + */ | ||
76 | + Class<?> aClass = Class.forName("com.detectapp.ReactNativeFlipper"); | ||
77 | + aClass | ||
78 | + .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) | ||
79 | + .invoke(null, context, reactInstanceManager); | ||
80 | + } catch (ClassNotFoundException e) { | ||
81 | + e.printStackTrace(); | ||
82 | + } catch (NoSuchMethodException e) { | ||
83 | + e.printStackTrace(); | ||
84 | + } catch (IllegalAccessException e) { | ||
85 | + e.printStackTrace(); | ||
86 | + } catch (InvocationTargetException e) { | ||
87 | + e.printStackTrace(); | ||
88 | + } | ||
89 | + } | ||
90 | + } | ||
91 | +} |
1 | +package com.detectapp.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.uimanager.ViewManagerRegistry; | ||
22 | +import com.detectapp.BuildConfig; | ||
23 | +import com.detectapp.newarchitecture.components.MainComponentsRegistry; | ||
24 | +import com.detectapp.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate; | ||
25 | +import java.util.ArrayList; | ||
26 | +import java.util.List; | ||
27 | + | ||
28 | +/** | ||
29 | + * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both | ||
30 | + * TurboModule delegates and the Fabric Renderer. | ||
31 | + * | ||
32 | + * <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the | ||
33 | + * `newArchEnabled` property). Is ignored otherwise. | ||
34 | + */ | ||
35 | +public class MainApplicationReactNativeHost extends ReactNativeHost { | ||
36 | + public MainApplicationReactNativeHost(Application application) { | ||
37 | + super(application); | ||
38 | + } | ||
39 | + | ||
40 | + @Override | ||
41 | + public boolean getUseDeveloperSupport() { | ||
42 | + return BuildConfig.DEBUG; | ||
43 | + } | ||
44 | + | ||
45 | + @Override | ||
46 | + protected List<ReactPackage> getPackages() { | ||
47 | + List<ReactPackage> packages = new PackageList(this).getPackages(); | ||
48 | + // Packages that cannot be autolinked yet can be added manually here, for example: | ||
49 | + // packages.add(new MyReactNativePackage()); | ||
50 | + // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: | ||
51 | + // packages.add(new TurboReactPackage() { ... }); | ||
52 | + // If you have custom Fabric Components, their ViewManagers should also be loaded here | ||
53 | + // inside a ReactPackage. | ||
54 | + return packages; | ||
55 | + } | ||
56 | + | ||
57 | + @Override | ||
58 | + protected String getJSMainModuleName() { | ||
59 | + return "index"; | ||
60 | + } | ||
61 | + | ||
62 | + @NonNull | ||
63 | + @Override | ||
64 | + protected ReactPackageTurboModuleManagerDelegate.Builder | ||
65 | + getReactPackageTurboModuleManagerDelegateBuilder() { | ||
66 | + // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary | ||
67 | + // for the new architecture and to use TurboModules correctly. | ||
68 | + return new MainApplicationTurboModuleManagerDelegate.Builder(); | ||
69 | + } | ||
70 | + | ||
71 | + @Override | ||
72 | + protected JSIModulePackage getJSIModulePackage() { | ||
73 | + return new JSIModulePackage() { | ||
74 | + @Override | ||
75 | + public List<JSIModuleSpec> getJSIModules( | ||
76 | + final ReactApplicationContext reactApplicationContext, | ||
77 | + final JavaScriptContextHolder jsContext) { | ||
78 | + final List<JSIModuleSpec> specs = new ArrayList<>(); | ||
79 | + | ||
80 | + // Here we provide a new JSIModuleSpec that will be responsible of providing the | ||
81 | + // custom Fabric Components. | ||
82 | + specs.add( | ||
83 | + new JSIModuleSpec() { | ||
84 | + @Override | ||
85 | + public JSIModuleType getJSIModuleType() { | ||
86 | + return JSIModuleType.UIManager; | ||
87 | + } | ||
88 | + | ||
89 | + @Override | ||
90 | + public JSIModuleProvider<UIManager> getJSIModuleProvider() { | ||
91 | + final ComponentFactory componentFactory = new ComponentFactory(); | ||
92 | + CoreComponentsRegistry.register(componentFactory); | ||
93 | + | ||
94 | + // Here we register a Components Registry. | ||
95 | + // The one that is generated with the template contains no components | ||
96 | + // and just provides you the one from React Native core. | ||
97 | + MainComponentsRegistry.register(componentFactory); | ||
98 | + | ||
99 | + final ReactInstanceManager reactInstanceManager = getReactInstanceManager(); | ||
100 | + | ||
101 | + ViewManagerRegistry viewManagerRegistry = | ||
102 | + new ViewManagerRegistry( | ||
103 | + reactInstanceManager.getOrCreateViewManagers(reactApplicationContext)); | ||
104 | + | ||
105 | + return new FabricJSIModuleProvider( | ||
106 | + reactApplicationContext, | ||
107 | + componentFactory, | ||
108 | + new EmptyReactNativeConfig(), | ||
109 | + viewManagerRegistry); | ||
110 | + } | ||
111 | + }); | ||
112 | + return specs; | ||
113 | + } | ||
114 | + }; | ||
115 | + } | ||
116 | +} |
1 | +package com.detectapp.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 | +} |
1 | +package com.detectapp.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("detectapp_appmodules"); | ||
45 | + sIsSoLibraryLoaded = true; | ||
46 | + } | ||
47 | + } | ||
48 | +} |
1 | +THIS_DIR := $(call my-dir) | ||
2 | + | ||
3 | +include $(REACT_ANDROID_DIR)/Android-prebuilt.mk | ||
4 | + | ||
5 | +# If you wish to add a custom TurboModule or Fabric component in your app you | ||
6 | +# will have to include the following autogenerated makefile. | ||
7 | +# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk | ||
8 | +include $(CLEAR_VARS) | ||
9 | + | ||
10 | +LOCAL_PATH := $(THIS_DIR) | ||
11 | + | ||
12 | +# You can customize the name of your application .so file here. | ||
13 | +LOCAL_MODULE := detectapp_appmodules | ||
14 | + | ||
15 | +LOCAL_C_INCLUDES := $(LOCAL_PATH) | ||
16 | +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) | ||
17 | +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) | ||
18 | + | ||
19 | +# If you wish to add a custom TurboModule or Fabric component in your app you | ||
20 | +# will have to uncomment those lines to include the generated source | ||
21 | +# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni) | ||
22 | +# | ||
23 | +# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni | ||
24 | +# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp) | ||
25 | +# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni | ||
26 | + | ||
27 | +# Here you should add any native library you wish to depend on. | ||
28 | +LOCAL_SHARED_LIBRARIES := \ | ||
29 | + libfabricjni \ | ||
30 | + libfbjni \ | ||
31 | + libfolly_futures \ | ||
32 | + libfolly_json \ | ||
33 | + libglog \ | ||
34 | + libjsi \ | ||
35 | + libreact_codegen_rncore \ | ||
36 | + libreact_debug \ | ||
37 | + libreact_nativemodule_core \ | ||
38 | + libreact_render_componentregistry \ | ||
39 | + libreact_render_core \ | ||
40 | + libreact_render_debug \ | ||
41 | + libreact_render_graphics \ | ||
42 | + librrc_view \ | ||
43 | + libruntimeexecutor \ | ||
44 | + libturbomodulejsijni \ | ||
45 | + libyoga | ||
46 | + | ||
47 | +LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall | ||
48 | + | ||
49 | +include $(BUILD_SHARED_LIBRARY) |
1 | +#include "MainApplicationModuleProvider.h" | ||
2 | + | ||
3 | +#include <rncore.h> | ||
4 | + | ||
5 | +namespace facebook { | ||
6 | +namespace react { | ||
7 | + | ||
8 | +std::shared_ptr<TurboModule> MainApplicationModuleProvider( | ||
9 | + const std::string moduleName, | ||
10 | + const JavaTurboModule::InitParams ¶ms) { | ||
11 | + // Here you can provide your own module provider for TurboModules coming from | ||
12 | + // either your application or from external libraries. The approach to follow | ||
13 | + // is similar to the following (for a library called `samplelibrary`: | ||
14 | + // | ||
15 | + // auto module = samplelibrary_ModuleProvider(moduleName, params); | ||
16 | + // if (module != nullptr) { | ||
17 | + // return module; | ||
18 | + // } | ||
19 | + // return rncore_ModuleProvider(moduleName, params); | ||
20 | + return rncore_ModuleProvider(moduleName, params); | ||
21 | +} | ||
22 | + | ||
23 | +} // namespace react | ||
24 | +} // namespace facebook |
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 ¶ms); | ||
14 | + | ||
15 | +} // namespace react | ||
16 | +} // namespace facebook |
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 ¶ms) { | ||
35 | + return MainApplicationModuleProvider(name, params); | ||
36 | +} | ||
37 | + | ||
38 | +bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule( | ||
39 | + std::string name) { | ||
40 | + return getTurboModule(name, nullptr) != nullptr || | ||
41 | + getTurboModule(name, {.moduleName = name}) != nullptr; | ||
42 | +} | ||
43 | + | ||
44 | +} // namespace react | ||
45 | +} // namespace facebook |
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/detectapp/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 ¶ms) 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(std::string name); | ||
35 | +}; | ||
36 | + | ||
37 | +} // namespace react | ||
38 | +} // namespace facebook |
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 | + | ||
8 | +namespace facebook { | ||
9 | +namespace react { | ||
10 | + | ||
11 | +MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {} | ||
12 | + | ||
13 | +std::shared_ptr<ComponentDescriptorProviderRegistry const> | ||
14 | +MainComponentsRegistry::sharedProviderRegistry() { | ||
15 | + auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry(); | ||
16 | + | ||
17 | + // Custom Fabric Components go here. You can register custom | ||
18 | + // components coming from your App or from 3rd party libraries here. | ||
19 | + // | ||
20 | + // providerRegistry->add(concreteComponentDescriptorProvider< | ||
21 | + // AocViewerComponentDescriptor>()); | ||
22 | + return providerRegistry; | ||
23 | +} | ||
24 | + | ||
25 | +jni::local_ref<MainComponentsRegistry::jhybriddata> | ||
26 | +MainComponentsRegistry::initHybrid( | ||
27 | + jni::alias_ref<jclass>, | ||
28 | + ComponentFactory *delegate) { | ||
29 | + auto instance = makeCxxInstance(delegate); | ||
30 | + | ||
31 | + auto buildRegistryFunction = | ||
32 | + [](EventDispatcher::Weak const &eventDispatcher, | ||
33 | + ContextContainer::Shared const &contextContainer) | ||
34 | + -> ComponentDescriptorRegistry::Shared { | ||
35 | + auto registry = MainComponentsRegistry::sharedProviderRegistry() | ||
36 | + ->createComponentDescriptorRegistry( | ||
37 | + {eventDispatcher, contextContainer}); | ||
38 | + | ||
39 | + auto mutableRegistry = | ||
40 | + std::const_pointer_cast<ComponentDescriptorRegistry>(registry); | ||
41 | + | ||
42 | + mutableRegistry->setFallbackComponentDescriptor( | ||
43 | + std::make_shared<UnimplementedNativeViewComponentDescriptor>( | ||
44 | + ComponentDescriptorParameters{ | ||
45 | + eventDispatcher, contextContainer, nullptr})); | ||
46 | + | ||
47 | + return registry; | ||
48 | + }; | ||
49 | + | ||
50 | + delegate->buildRegistryFunction = buildRegistryFunction; | ||
51 | + return instance; | ||
52 | +} | ||
53 | + | ||
54 | +void MainComponentsRegistry::registerNatives() { | ||
55 | + registerHybrid({ | ||
56 | + makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid), | ||
57 | + }); | ||
58 | +} | ||
59 | + | ||
60 | +} // namespace react | ||
61 | +} // namespace facebook |
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/detectapp/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 |
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 | +} |
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> |
2.98 KB
4.91 KB
2.05 KB
2.79 KB
4.46 KB
6.93 KB
6.31 KB
10.4 KB
9.03 KB
15.2 KB
DetectApp/android/build.gradle
0 → 100644
1 | +import org.apache.tools.ant.taskdefs.condition.Os | ||
2 | + | ||
3 | +// Top-level build file where you can add configuration options common to all sub-projects/modules. | ||
4 | + | ||
5 | +buildscript { | ||
6 | + ext { | ||
7 | + buildToolsVersion = "31.0.0" | ||
8 | + minSdkVersion = 21 | ||
9 | + compileSdkVersion = 31 | ||
10 | + targetSdkVersion = 31 | ||
11 | + | ||
12 | + if (System.properties['os.arch'] == "aarch64") { | ||
13 | + // For M1 Users we need to use the NDK 24 which added support for aarch64 | ||
14 | + ndkVersion = "24.0.8215888" | ||
15 | + } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { | ||
16 | + // For Android Users, we need to use NDK 23, otherwise the build will | ||
17 | + // fail due to paths longer than the OS limit | ||
18 | + ndkVersion = "23.1.7779620" | ||
19 | + } else { | ||
20 | + // Otherwise we default to the side-by-side NDK version from AGP. | ||
21 | + ndkVersion = "21.4.7075529" | ||
22 | + } | ||
23 | + } | ||
24 | + repositories { | ||
25 | + google() | ||
26 | + mavenCentral() | ||
27 | + } | ||
28 | + dependencies { | ||
29 | + classpath("com.android.tools.build:gradle:7.0.4") | ||
30 | + classpath("com.facebook.react:react-native-gradle-plugin") | ||
31 | + classpath("de.undercouch:gradle-download-task:4.1.2") | ||
32 | + // NOTE: Do not place your application dependencies here; they belong | ||
33 | + // in the individual module build.gradle files | ||
34 | + } | ||
35 | +} | ||
36 | + | ||
37 | +allprojects { | ||
38 | + repositories { | ||
39 | + maven { | ||
40 | + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm | ||
41 | + url("$rootDir/../node_modules/react-native/android") | ||
42 | + } | ||
43 | + maven { | ||
44 | + // Android JSC is installed from npm | ||
45 | + url("$rootDir/../node_modules/jsc-android/dist") | ||
46 | + } | ||
47 | + mavenCentral { | ||
48 | + // We don't want to fetch react-native from Maven Central as there are | ||
49 | + // older versions over there. | ||
50 | + content { | ||
51 | + excludeGroup "com.facebook.react" | ||
52 | + } | ||
53 | + } | ||
54 | + google() | ||
55 | + maven { url 'https://www.jitpack.io' } | ||
56 | + } | ||
57 | +} |
DetectApp/android/gradle.properties
0 → 100644
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 | +# Automatically convert third-party libraries to use AndroidX | ||
25 | +android.enableJetifier=true | ||
26 | + | ||
27 | +# Version of flipper SDK to use with React Native | ||
28 | +FLIPPER_VERSION=0.125.0 | ||
29 | + | ||
30 | +# Use this property to specify which architecture you want to build. | ||
31 | +# You can also override it from the CLI using | ||
32 | +# ./gradlew <task> -PreactNativeArchitectures=x86_64 | ||
33 | +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 | ||
34 | + | ||
35 | +# Use this property to enable support to the new architecture. | ||
36 | +# This will allow you to use TurboModules and the Fabric render in | ||
37 | +# your application. You should enable this flag either if you want | ||
38 | +# to write custom TurboModules/Fabric components OR use libraries that | ||
39 | +# are providing them. | ||
40 | +newArchEnabled=false |
No preview for this file type
DetectApp/android/gradlew
0 → 100755
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 | +# Use "xargs" to parse quoted args. | ||
209 | +# | ||
210 | +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||
211 | +# | ||
212 | +# In Bash we could simply go: | ||
213 | +# | ||
214 | +# readarray ARGS < <( xargs -n1 <<<"$var" ) && | ||
215 | +# set -- "${ARGS[@]}" "$@" | ||
216 | +# | ||
217 | +# but POSIX shell has neither arrays nor command substitution, so instead we | ||
218 | +# post-process each arg (as a line of input to sed) to backslash-escape any | ||
219 | +# character that might be a shell metacharacter, then use eval to reverse | ||
220 | +# that process (while maintaining the separation between arguments), and wrap | ||
221 | +# the whole thing up as a single "set" statement. | ||
222 | +# | ||
223 | +# This will of course break if any of these variables contains a newline or | ||
224 | +# an unmatched quote. | ||
225 | +# | ||
226 | + | ||
227 | +eval "set -- $( | ||
228 | + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | ||
229 | + xargs -n1 | | ||
230 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | ||
231 | + tr '\n' ' ' | ||
232 | + )" '"$@"' | ||
233 | + | ||
234 | +exec "$JAVACMD" "$@" |
DetectApp/android/gradlew.bat
0 → 100644
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%" == "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%"=="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 | +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||
84 | +exit /b 1 | ||
85 | + | ||
86 | +:mainEnd | ||
87 | +if "%OS%"=="Windows_NT" endlocal | ||
88 | + | ||
89 | +:omega |
DetectApp/android/settings.gradle
0 → 100644
1 | +rootProject.name = 'DetectApp' | ||
2 | +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) | ||
3 | +include ':app' | ||
4 | +includeBuild('../node_modules/react-native-gradle-plugin') | ||
5 | + | ||
6 | +if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { | ||
7 | + include(":ReactAndroid") | ||
8 | + project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') | ||
9 | +} |
DetectApp/app.json
0 → 100644
DetectApp/babel.config.js
0 → 100644
DetectApp/index.js
0 → 100644
This diff is collapsed. Click to expand it.
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<Scheme | ||
3 | + LastUpgradeVersion = "1210" | ||
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 = "DetectApp.app" | ||
19 | + BlueprintName = "DetectApp" | ||
20 | + ReferencedContainer = "container:DetectApp.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 = "DetectAppTests.xctest" | ||
37 | + BlueprintName = "DetectAppTests" | ||
38 | + ReferencedContainer = "container:DetectApp.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 = "DetectApp.app" | ||
59 | + BlueprintName = "DetectApp" | ||
60 | + ReferencedContainer = "container:DetectApp.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 = "DetectApp.app" | ||
76 | + BlueprintName = "DetectApp" | ||
77 | + ReferencedContainer = "container:DetectApp.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> |
DetectApp/ios/DetectApp/AppDelegate.h
0 → 100644
DetectApp/ios/DetectApp/AppDelegate.mm
0 → 100644
1 | +#import "AppDelegate.h" | ||
2 | + | ||
3 | +#import <React/RCTBridge.h> | ||
4 | +#import <React/RCTBundleURLProvider.h> | ||
5 | +#import <React/RCTRootView.h> | ||
6 | + | ||
7 | +#import <React/RCTAppSetupUtils.h> | ||
8 | + | ||
9 | +#if RCT_NEW_ARCH_ENABLED | ||
10 | +#import <React/CoreModulesPlugins.h> | ||
11 | +#import <React/RCTCxxBridgeDelegate.h> | ||
12 | +#import <React/RCTFabricSurfaceHostingProxyRootView.h> | ||
13 | +#import <React/RCTSurfacePresenter.h> | ||
14 | +#import <React/RCTSurfacePresenterBridgeAdapter.h> | ||
15 | +#import <ReactCommon/RCTTurboModuleManager.h> | ||
16 | + | ||
17 | +#import <react/config/ReactNativeConfig.h> | ||
18 | + | ||
19 | +@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> { | ||
20 | + RCTTurboModuleManager *_turboModuleManager; | ||
21 | + RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; | ||
22 | + std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig; | ||
23 | + facebook::react::ContextContainer::Shared _contextContainer; | ||
24 | +} | ||
25 | +@end | ||
26 | +#endif | ||
27 | + | ||
28 | +@implementation AppDelegate | ||
29 | + | ||
30 | +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||
31 | +{ | ||
32 | + RCTAppSetupPrepareApp(application); | ||
33 | + | ||
34 | + RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; | ||
35 | + | ||
36 | +#if RCT_NEW_ARCH_ENABLED | ||
37 | + _contextContainer = std::make_shared<facebook::react::ContextContainer const>(); | ||
38 | + _reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>(); | ||
39 | + _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); | ||
40 | + _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; | ||
41 | + bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; | ||
42 | +#endif | ||
43 | + | ||
44 | + UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"DetectApp", nil); | ||
45 | + | ||
46 | + if (@available(iOS 13.0, *)) { | ||
47 | + rootView.backgroundColor = [UIColor systemBackgroundColor]; | ||
48 | + } else { | ||
49 | + rootView.backgroundColor = [UIColor whiteColor]; | ||
50 | + } | ||
51 | + | ||
52 | + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; | ||
53 | + UIViewController *rootViewController = [UIViewController new]; | ||
54 | + rootViewController.view = rootView; | ||
55 | + self.window.rootViewController = rootViewController; | ||
56 | + [self.window makeKeyAndVisible]; | ||
57 | + return YES; | ||
58 | +} | ||
59 | + | ||
60 | +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | ||
61 | +{ | ||
62 | +#if DEBUG | ||
63 | + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; | ||
64 | +#else | ||
65 | + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; | ||
66 | +#endif | ||
67 | +} | ||
68 | + | ||
69 | +#if RCT_NEW_ARCH_ENABLED | ||
70 | + | ||
71 | +#pragma mark - RCTCxxBridgeDelegate | ||
72 | + | ||
73 | +- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge | ||
74 | +{ | ||
75 | + _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge | ||
76 | + delegate:self | ||
77 | + jsInvoker:bridge.jsCallInvoker]; | ||
78 | + return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); | ||
79 | +} | ||
80 | + | ||
81 | +#pragma mark RCTTurboModuleManagerDelegate | ||
82 | + | ||
83 | +- (Class)getModuleClassFromName:(const char *)name | ||
84 | +{ | ||
85 | + return RCTCoreModulesClassProvider(name); | ||
86 | +} | ||
87 | + | ||
88 | +- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
89 | + jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker | ||
90 | +{ | ||
91 | + return nullptr; | ||
92 | +} | ||
93 | + | ||
94 | +- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
95 | + initParams: | ||
96 | + (const facebook::react::ObjCTurboModule::InitParams &)params | ||
97 | +{ | ||
98 | + return nullptr; | ||
99 | +} | ||
100 | + | ||
101 | +- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass | ||
102 | +{ | ||
103 | + return RCTAppSetupDefaultModuleFromClass(moduleClass); | ||
104 | +} | ||
105 | + | ||
106 | +#endif | ||
107 | + | ||
108 | +@end |
1 | +{ | ||
2 | + "images" : [ | ||
3 | + { | ||
4 | + "idiom" : "iphone", | ||
5 | + "scale" : "2x", | ||
6 | + "size" : "20x20" | ||
7 | + }, | ||
8 | + { | ||
9 | + "idiom" : "iphone", | ||
10 | + "scale" : "3x", | ||
11 | + "size" : "20x20" | ||
12 | + }, | ||
13 | + { | ||
14 | + "idiom" : "iphone", | ||
15 | + "scale" : "2x", | ||
16 | + "size" : "29x29" | ||
17 | + }, | ||
18 | + { | ||
19 | + "idiom" : "iphone", | ||
20 | + "scale" : "3x", | ||
21 | + "size" : "29x29" | ||
22 | + }, | ||
23 | + { | ||
24 | + "idiom" : "iphone", | ||
25 | + "scale" : "2x", | ||
26 | + "size" : "40x40" | ||
27 | + }, | ||
28 | + { | ||
29 | + "idiom" : "iphone", | ||
30 | + "scale" : "3x", | ||
31 | + "size" : "40x40" | ||
32 | + }, | ||
33 | + { | ||
34 | + "idiom" : "iphone", | ||
35 | + "scale" : "2x", | ||
36 | + "size" : "60x60" | ||
37 | + }, | ||
38 | + { | ||
39 | + "idiom" : "iphone", | ||
40 | + "scale" : "3x", | ||
41 | + "size" : "60x60" | ||
42 | + }, | ||
43 | + { | ||
44 | + "idiom" : "ios-marketing", | ||
45 | + "scale" : "1x", | ||
46 | + "size" : "1024x1024" | ||
47 | + } | ||
48 | + ], | ||
49 | + "info" : { | ||
50 | + "author" : "xcode", | ||
51 | + "version" : 1 | ||
52 | + } | ||
53 | +} |
DetectApp/ios/DetectApp/Info.plist
0 → 100644
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>en</string> | ||
7 | + <key>CFBundleDisplayName</key> | ||
8 | + <string>DetectApp</string> | ||
9 | + <key>CFBundleExecutable</key> | ||
10 | + <string>$(EXECUTABLE_NAME)</string> | ||
11 | + <key>CFBundleIdentifier</key> | ||
12 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
13 | + <key>CFBundleInfoDictionaryVersion</key> | ||
14 | + <string>6.0</string> | ||
15 | + <key>CFBundleName</key> | ||
16 | + <string>$(PRODUCT_NAME)</string> | ||
17 | + <key>CFBundlePackageType</key> | ||
18 | + <string>APPL</string> | ||
19 | + <key>CFBundleShortVersionString</key> | ||
20 | + <string>1.0</string> | ||
21 | + <key>CFBundleSignature</key> | ||
22 | + <string>????</string> | ||
23 | + <key>CFBundleVersion</key> | ||
24 | + <string>1</string> | ||
25 | + <key>LSRequiresIPhoneOS</key> | ||
26 | + <true/> | ||
27 | + <key>NSAppTransportSecurity</key> | ||
28 | + <dict> | ||
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>NSLocationWhenInUseUsageDescription</key> | ||
39 | + <string></string> | ||
40 | + <key>UILaunchStoryboardName</key> | ||
41 | + <string>LaunchScreen</string> | ||
42 | + <key>UIRequiredDeviceCapabilities</key> | ||
43 | + <array> | ||
44 | + <string>armv7</string> | ||
45 | + </array> | ||
46 | + <key>UISupportedInterfaceOrientations</key> | ||
47 | + <array> | ||
48 | + <string>UIInterfaceOrientationPortrait</string> | ||
49 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
50 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
51 | + </array> | ||
52 | + <key>UIViewControllerBasedStatusBarAppearance</key> | ||
53 | + <false/> | ||
54 | +</dict> | ||
55 | +</plist> |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | ||
3 | + <device id="retina4_7" orientation="portrait" appearance="light"/> | ||
4 | + <dependencies> | ||
5 | + <deployment identifier="iOS"/> | ||
6 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/> | ||
7 | + <capability name="Safe area layout guides" minToolsVersion="9.0"/> | ||
8 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||
9 | + </dependencies> | ||
10 | + <scenes> | ||
11 | + <!--View Controller--> | ||
12 | + <scene sceneID="EHf-IW-A2E"> | ||
13 | + <objects> | ||
14 | + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | ||
15 | + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | ||
16 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | ||
17 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
18 | + <subviews> | ||
19 | + <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DetectApp" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb"> | ||
20 | + <rect key="frame" x="0.0" y="202" width="375" height="43"/> | ||
21 | + <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/> | ||
22 | + <nil key="highlightedColor"/> | ||
23 | + </label> | ||
24 | + <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="MN2-I3-ftu"> | ||
25 | + <rect key="frame" x="0.0" y="626" width="375" height="21"/> | ||
26 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
27 | + <nil key="highlightedColor"/> | ||
28 | + </label> | ||
29 | + </subviews> | ||
30 | + <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> | ||
31 | + <constraints> | ||
32 | + <constraint firstItem="Bcu-3y-fUS" firstAttribute="bottom" secondItem="MN2-I3-ftu" secondAttribute="bottom" constant="20" id="OZV-Vh-mqD"/> | ||
33 | + <constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/> | ||
34 | + <constraint firstItem="MN2-I3-ftu" firstAttribute="centerX" secondItem="Bcu-3y-fUS" secondAttribute="centerX" id="akx-eg-2ui"/> | ||
35 | + <constraint firstItem="MN2-I3-ftu" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" id="i1E-0Y-4RG"/> | ||
36 | + <constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/> | ||
37 | + <constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" symbolic="YES" id="x7j-FC-K8j"/> | ||
38 | + </constraints> | ||
39 | + <viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/> | ||
40 | + </view> | ||
41 | + </viewController> | ||
42 | + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||
43 | + </objects> | ||
44 | + <point key="canvasLocation" x="52.173913043478265" y="375"/> | ||
45 | + </scene> | ||
46 | + </scenes> | ||
47 | +</document> |
DetectApp/ios/DetectApp/main.m
0 → 100644
1 | +#import <UIKit/UIKit.h> | ||
2 | +#import <XCTest/XCTest.h> | ||
3 | + | ||
4 | +#import <React/RCTLog.h> | ||
5 | +#import <React/RCTRootView.h> | ||
6 | + | ||
7 | +#define TIMEOUT_SECONDS 600 | ||
8 | +#define TEXT_TO_LOOK_FOR @"Welcome to React" | ||
9 | + | ||
10 | +@interface DetectAppTests : XCTestCase | ||
11 | + | ||
12 | +@end | ||
13 | + | ||
14 | +@implementation DetectAppTests | ||
15 | + | ||
16 | +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test | ||
17 | +{ | ||
18 | + if (test(view)) { | ||
19 | + return YES; | ||
20 | + } | ||
21 | + for (UIView *subview in [view subviews]) { | ||
22 | + if ([self findSubviewInView:subview matching:test]) { | ||
23 | + return YES; | ||
24 | + } | ||
25 | + } | ||
26 | + return NO; | ||
27 | +} | ||
28 | + | ||
29 | +- (void)testRendersWelcomeScreen | ||
30 | +{ | ||
31 | + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; | ||
32 | + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; | ||
33 | + BOOL foundElement = NO; | ||
34 | + | ||
35 | + __block NSString *redboxError = nil; | ||
36 | +#ifdef DEBUG | ||
37 | + RCTSetLogFunction( | ||
38 | + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { | ||
39 | + if (level >= RCTLogLevelError) { | ||
40 | + redboxError = message; | ||
41 | + } | ||
42 | + }); | ||
43 | +#endif | ||
44 | + | ||
45 | + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { | ||
46 | + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; | ||
47 | + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; | ||
48 | + | ||
49 | + foundElement = [self findSubviewInView:vc.view | ||
50 | + matching:^BOOL(UIView *view) { | ||
51 | + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { | ||
52 | + return YES; | ||
53 | + } | ||
54 | + return NO; | ||
55 | + }]; | ||
56 | + } | ||
57 | + | ||
58 | +#ifdef DEBUG | ||
59 | + RCTSetLogFunction(RCTDefaultLogFunction); | ||
60 | +#endif | ||
61 | + | ||
62 | + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); | ||
63 | + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); | ||
64 | +} | ||
65 | + | ||
66 | +@end |
DetectApp/ios/DetectAppTests/Info.plist
0 → 100644
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>en</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>BNDL</string> | ||
17 | + <key>CFBundleShortVersionString</key> | ||
18 | + <string>1.0</string> | ||
19 | + <key>CFBundleSignature</key> | ||
20 | + <string>????</string> | ||
21 | + <key>CFBundleVersion</key> | ||
22 | + <string>1</string> | ||
23 | +</dict> | ||
24 | +</plist> |
DetectApp/ios/Podfile
0 → 100644
1 | +require_relative '../node_modules/react-native/scripts/react_native_pods' | ||
2 | +require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' | ||
3 | + | ||
4 | +platform :ios, '11.0' | ||
5 | +install! 'cocoapods', :deterministic_uuids => false | ||
6 | + | ||
7 | +target 'DetectApp' do | ||
8 | + config = use_native_modules! | ||
9 | + | ||
10 | + # Flags change depending on the env values. | ||
11 | + flags = get_default_flags() | ||
12 | + | ||
13 | + use_react_native!( | ||
14 | + :path => config[:reactNativePath], | ||
15 | + # to enable hermes on iOS, change `false` to `true` and then install pods | ||
16 | + :hermes_enabled => flags[:hermes_enabled], | ||
17 | + :fabric_enabled => flags[:fabric_enabled], | ||
18 | + # An absolute path to your application root. | ||
19 | + :app_path => "#{Pod::Config.instance.installation_root}/.." | ||
20 | + ) | ||
21 | + | ||
22 | + target 'DetectAppTests' do | ||
23 | + inherit! :complete | ||
24 | + # Pods for testing | ||
25 | + end | ||
26 | + | ||
27 | + # Enables Flipper. | ||
28 | + # | ||
29 | + # Note that if you have use_frameworks! enabled, Flipper will not work and | ||
30 | + # you should disable the next line. | ||
31 | + use_flipper!() | ||
32 | + | ||
33 | + post_install do |installer| | ||
34 | + react_native_post_install(installer) | ||
35 | + __apply_Xcode_12_5_M1_post_install_workaround(installer) | ||
36 | + end | ||
37 | +end |
DetectApp/ios/Podfile.lock
0 → 100644
This diff is collapsed. Click to expand it.
DetectApp/metro.config.js
0 → 100644
1 | +/** | ||
2 | + * Metro configuration for React Native | ||
3 | + * https://github.com/facebook/react-native | ||
4 | + * | ||
5 | + * @format | ||
6 | + */ | ||
7 | + | ||
8 | +module.exports = { | ||
9 | + transformer: { | ||
10 | + getTransformOptions: async () => ({ | ||
11 | + transform: { | ||
12 | + experimentalImportSupport: false, | ||
13 | + inlineRequires: true, | ||
14 | + }, | ||
15 | + }), | ||
16 | + }, | ||
17 | +}; |
DetectApp/package.json
0 → 100644
1 | +{ | ||
2 | + "name": "detectapp", | ||
3 | + "version": "0.0.1", | ||
4 | + "private": true, | ||
5 | + "scripts": { | ||
6 | + "android": "react-native run-android", | ||
7 | + "ios": "react-native run-ios", | ||
8 | + "start": "react-native start", | ||
9 | + "test": "jest", | ||
10 | + "lint": "eslint . --ext .js,.jsx,.ts,.tsx" | ||
11 | + }, | ||
12 | + "dependencies": { | ||
13 | + "react": "17.0.2", | ||
14 | + "react-native": "0.68.1" | ||
15 | + }, | ||
16 | + "devDependencies": { | ||
17 | + "@babel/core": "^7.12.9", | ||
18 | + "@babel/runtime": "^7.12.5", | ||
19 | + "@react-native-community/eslint-config": "^2.0.0", | ||
20 | + "@types/jest": "^26.0.23", | ||
21 | + "@types/react-native": "^0.67.3", | ||
22 | + "@types/react-test-renderer": "^17.0.1", | ||
23 | + "@typescript-eslint/eslint-plugin": "^5.17.0", | ||
24 | + "@typescript-eslint/parser": "^5.17.0", | ||
25 | + "babel-jest": "^26.6.3", | ||
26 | + "eslint": "^7.32.0", | ||
27 | + "jest": "^26.6.3", | ||
28 | + "metro-react-native-babel-preset": "^0.67.0", | ||
29 | + "react-test-renderer": "17.0.2", | ||
30 | + "typescript": "^4.4.4" | ||
31 | + }, | ||
32 | + "resolutions": { | ||
33 | + "@types/react": "^17" | ||
34 | + }, | ||
35 | + "jest": { | ||
36 | + "preset": "react-native", | ||
37 | + "moduleFileExtensions": [ | ||
38 | + "ts", | ||
39 | + "tsx", | ||
40 | + "js", | ||
41 | + "jsx", | ||
42 | + "json", | ||
43 | + "node" | ||
44 | + ] | ||
45 | + } | ||
46 | +} |
DetectApp/tsconfig.json
0 → 100644
1 | + | ||
2 | +{ | ||
3 | + "compilerOptions": { | ||
4 | + /* Basic Options */ | ||
5 | + "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ | ||
6 | + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ | ||
7 | + "lib": ["es2017"], /* Specify library files to be included in the compilation. */ | ||
8 | + "allowJs": true, /* Allow javascript files to be compiled. */ | ||
9 | + // "checkJs": true, /* Report errors in .js files. */ | ||
10 | + "jsx": "react-native", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||
11 | + // "declaration": true, /* Generates corresponding '.d.ts' file. */ | ||
12 | + // "sourceMap": true, /* Generates corresponding '.map' file. */ | ||
13 | + // "outFile": "./", /* Concatenate and emit output to single file. */ | ||
14 | + // "outDir": "./", /* Redirect output structure to the directory. */ | ||
15 | + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||
16 | + // "removeComments": true, /* Do not emit comments to output. */ | ||
17 | + "noEmit": true, /* Do not emit outputs. */ | ||
18 | + // "incremental": true, /* Enable incremental compilation */ | ||
19 | + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ | ||
20 | + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ | ||
21 | + "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ | ||
22 | + | ||
23 | + /* Strict Type-Checking Options */ | ||
24 | + "strict": true, /* Enable all strict type-checking options. */ | ||
25 | + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ | ||
26 | + // "strictNullChecks": true, /* Enable strict null checks. */ | ||
27 | + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ | ||
28 | + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ | ||
29 | + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ | ||
30 | + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ | ||
31 | + | ||
32 | + /* Additional Checks */ | ||
33 | + // "noUnusedLocals": true, /* Report errors on unused locals. */ | ||
34 | + // "noUnusedParameters": true, /* Report errors on unused parameters. */ | ||
35 | + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ | ||
36 | + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ | ||
37 | + | ||
38 | + /* Module Resolution Options */ | ||
39 | + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||
40 | + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ | ||
41 | + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||
42 | + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||
43 | + // "typeRoots": [], /* List of folders to include type definitions from. */ | ||
44 | + // "types": [], /* Type declaration files to be included in compilation. */ | ||
45 | + "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||
46 | + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||
47 | + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ | ||
48 | + "skipLibCheck": true, /* Skip type checking of declaration files. */ | ||
49 | + "resolveJsonModule": true /* Allows importing modules with a ‘.json’ extension, which is a common practice in node projects. */ | ||
50 | + | ||
51 | + /* Source Map Options */ | ||
52 | + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ | ||
53 | + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ | ||
54 | + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ | ||
55 | + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ | ||
56 | + | ||
57 | + /* Experimental Options */ | ||
58 | + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ | ||
59 | + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ | ||
60 | + }, | ||
61 | + "exclude": [ | ||
62 | + "node_modules", "babel.config.js", "metro.config.js", "jest.config.js" | ||
63 | + ] | ||
64 | +} |
DetectApp/yarn.lock
0 → 100644
This diff could not be displayed because it is too large.
-
Please register or login to post a comment