Repository: mrousavy/react-native-google-nearby-messages Branch: master Commit: 359e21a6a048 Files: 93 Total size: 290.6 KB Directory structure: gitextract_34_7i32c/ ├── .dependabot/ │ └── config.yml ├── .eslintrc.js ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ └── ISSUE_TEMPLATE/ │ ├── ---bug-report.md │ ├── ---question.md │ └── --feature-request.md ├── .gitignore ├── .npmignore ├── .prettierrc.js ├── LICENSE ├── README.md ├── TASKS.md ├── TROUBLESHOOTING.md ├── android/ │ ├── .classpath │ ├── .project │ ├── .settings/ │ │ └── org.eclipse.buildship.core.prefs │ ├── README.md │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ ├── google/ │ │ └── android/ │ │ └── gms/ │ │ └── nearby/ │ │ └── messages/ │ │ └── BetterStrategy.java │ └── mrousavy/ │ └── nearby/ │ ├── GoogleNearbyMessagesModule.kt │ └── GoogleNearbyMessagesPackage.kt ├── example/ │ ├── .buckconfig │ ├── .eslintrc.js │ ├── .flowconfig │ ├── .gitattributes │ ├── .gitignore │ ├── .prettierrc.js │ ├── .watchmanconfig │ ├── App.js │ ├── __tests__/ │ │ └── App-test.js │ ├── android/ │ │ ├── .project │ │ ├── .settings/ │ │ │ └── org.eclipse.buildship.core.prefs │ │ ├── app/ │ │ │ ├── .classpath │ │ │ ├── .project │ │ │ ├── .settings/ │ │ │ │ └── org.eclipse.buildship.core.prefs │ │ │ ├── BUCK │ │ │ ├── build.gradle │ │ │ ├── build_defs.bzl │ │ │ ├── debug.keystore │ │ │ ├── proguard-rules.pro │ │ │ └── src/ │ │ │ ├── debug/ │ │ │ │ └── AndroidManifest.xml │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── example/ │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── res/ │ │ │ └── values/ │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── settings.gradle │ ├── app.json │ ├── babel.config.js │ ├── index.js │ ├── ios/ │ │ ├── Podfile │ │ ├── example/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Base.lproj/ │ │ │ │ └── LaunchScreen.xib │ │ │ ├── Images.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Info.plist │ │ │ └── main.m │ │ ├── example-tvOS/ │ │ │ └── Info.plist │ │ ├── example-tvOSTests/ │ │ │ └── Info.plist │ │ ├── example.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── example-tvOS.xcscheme │ │ │ └── example.xcscheme │ │ ├── example.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ └── exampleTests/ │ │ ├── Info.plist │ │ └── exampleTests.m │ ├── metro.config.js │ └── package.json ├── index.ts ├── ios/ │ ├── GoogleNearbyMessages.swift │ ├── GoogleNearbyMessages.xcodeproj/ │ │ ├── project.pbxproj │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── GoogleNearbyMessages.xcscheme │ ├── GoogleNearbyMessages.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── GoogleNearbyMessagesBridge.h │ └── GoogleNearbyMessagesBridge.m ├── package.json ├── react-native-google-nearby-messages.podspec └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dependabot/config.yml ================================================ version: 1 update_configs: - package_manager: "javascript" directory: "." update_schedule: "daily" ================================================ FILE: .eslintrc.js ================================================ module.exports = { root: true, extends: '@react-native-community', }; ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: mrousavy ko_fi: mrousavy custom: ["https://paypal.me/mrousavy"] ================================================ FILE: .github/ISSUE_TEMPLATE/---bug-report.md ================================================ --- name: "\U0001F41B Bug report" about: Create a report to help us improve title: "[BUG]" labels: bug assignees: '' --- # Bug >>>>> I have read the [Troubleshooting](https://github.com/mrousavy/react-native-google-nearby-messages/blob/master/TROUBLESHOOTING.md) page: [Yes/No] **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **(Optional) Proposed solution** If you have an idea on how one might fix this bug, please describe it here. # Environment **Additional context** Add any other context or screenshots about the feature request here. ``` paste the output of `react-native info` here ``` ```json "react": PASTE_VERSION_HERE, "react-native": PASTE_VERSION_HERE, "react-native-google-nearby-messages": PASTE_VERSION_HERE ``` ================================================ FILE: .github/ISSUE_TEMPLATE/---question.md ================================================ --- name: "\U0001F914 Question" about: You can ask questions here. title: "[QUESTION] " labels: question assignees: '' --- # Question Put extra details for the question here # Environment ``` paste the output of `react-native info` here ``` ```json "react": PASTE_VERSION_HERE, "react-native": PASTE_VERSION_HERE, "react-native-google-nearby-messages": PASTE_VERSION_HERE ``` ================================================ FILE: .github/ISSUE_TEMPLATE/--feature-request.md ================================================ --- name: "✨ Feature request" about: Suggest an idea for this project title: "[FEATURE]" labels: enhancement assignees: '' --- # Problem **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] # Solution **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. # Environment **Additional context** Add any other context or screenshots about the feature request here. ``` paste the output of `react-native info` here ``` ```json "react": PASTE_VERSION_HERE, "react-native": PASTE_VERSION_HERE, "react-native-google-nearby-messages": PASTE_VERSION_HERE ``` ================================================ FILE: .gitignore ================================================ # TypeScript dist/ # OSX # .DS_Store # node.js # node_modules/ npm-debug.log yarn-error.log # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate project.xcworkspace # Android/IntelliJ # build/ .idea .gradle local.properties *.iml # BUCK buck-out/ \.buckd/ *.keystore ================================================ FILE: .npmignore ================================================ img example e2e test circle.yml .npmignore # OSX # .DS_Store # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate project.xcworkspace # Android/IJ # .idea .gradle local.properties *.iml local.properties .idea/workspace.xml .idea/libraries build captures # node.js # node_modules/ npm-debug.log # BUCK buck-out/ \.buckd/ android/app/libs android/keystores/debug.keystore ================================================ FILE: .prettierrc.js ================================================ module.exports = { bracketSpacing: false, jsxBracketSameLine: true, singleQuote: true, trailingComma: 'all', }; ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2020 Marc Rousavy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

react-native-google-nearby-messages

An async **Google Nearby Messages** API Wrapper for **React Native** (Android & iOS), supporting autolinking, custom discovery modes (`broadcast`, `scan`, ..), custom discovery mediums (`bluetooth`, `audio`, ..), awaitable native invokations and React hooks! > Also, this is a good example on how to use _Swift_ in a React Native - Native Module. [![react-native-google-nearby-messages](https://badge.fury.io/js/react-native-google-nearby-messages.svg)](https://badge.fury.io/js/react-native-google-nearby-messages) [![GitHub stars](https://img.shields.io/github/stars/mrousavy/react-native-google-nearby-messages.svg?style=social&label=Star&maxAge=259000)](https://GitHub.com/mrousavy/react-native-google-nearby-messages/stargazers/) [![GitHub followers](https://img.shields.io/github/followers/mrousavy.svg?style=social&label=Follow&maxAge=259000)](https://github.com/mrousavy?tab=followers) Buy Me a Coffee at ko-fi.com ## Install > This packages uses React Native autolinking (> 0.60) ```sh npm i react-native-google-nearby-messages # for iOS cd ios && pod install && cd .. ``` > Note (iOS): Everytime you run `pod install` an entry called `Assets.car` is created in your **Build Phases** -> **[CP] Copy Pods Resources** which causes the build to fail. This is a known bug in the Google **NearbyMessages** pod. A workaround is to manually remove this file everytime you run `pod install`. See [#4 (comment)](https://github.com/mrousavy/react-native-google-nearby-messages/issues/4#issuecomment-649961499) for an automatic fix. Please [create a PR here](https://github.com/mrousavy/react-native-google-nearby-messages/pulls) if you found a better solution for this! ## Usage See the [example app](example/). ### iOS Setup > See: https://developers.google.com/nearby/messages/ios/get-started 1. Add bluetooth permissions (`NSBluetoothPeripheralUsageDescription`, `NSBluetoothAlwaysUsageDescription` for 'ble', and `NSMicrophoneUsageDescription` for 'audio') to `Info.plist` 2. Create your API Key at [the Google Developer Console](https://console.developers.google.com/flows/enableapi?apiid=copresence&keyType=CLIENT_SIDE_IOS&reusekey=true). 3. (Optionally): Add the [react-native-permissions](https://github.com/react-native-community/react-native-permissions) library to check if Bluetooth is available on the device (it's `'unavailable'` on iOS Simulators!) If it's `'unavailable'`, calls to subscribe or publish might crash the app (`EXC_BAD_ACCESS`) so only call if Bluetooth permission is `denied`, `granted` or `blocked`. This library will handle the permission checking for you when you call `publish()` or `subscribe()` for the first time. 4. Pass the generated API Key as a parameter using the `connect` function ### Android Setup > See: https://developers.google.com/nearby/messages/android/get-started 1. Create your API Key at [the Google Developer Console](https://console.developers.google.com/flows/enableapi?apiid=copresence&keyType=CLIENT_SIDE_ANDROID&reusekey=true). 2. Add your generated API Key and Permissions to your `AndroidManifest.xml`: ```xml ... ``` 3. (Optionally): Call `checkBluetoothAvailability()` to ensure that Bluetooth capabilities are available on the current device. 4. Call `connect` without any key. ### Publishing ```ts import { connect, publish, addOnErrorListener } from 'react-native-google-nearby-messages'; const removeListener = addOnErrorListener((kind, message) => console.error(`${kind}: ${message}`)); const disconnect = await connect({ apiKey: GOOGLE_API_KEY }); const unpublish = await publish('hello !'); // later, e.g. in componentWillUnmount() removeListener(); unpublish(); disconnect(); ``` > Make sure to unpublish, disconnect and remove any listeners as they won't be removed automatically! I don't know if that's possible, if so, please create a Pull Request. ### Subscribing ```ts import { connect, subscribe, addOnErrorListener } from 'react-native-google-nearby-messages'; const removeListener = addOnErrorListener((kind, message) => console.error(`${kind}: ${message}`)); const disconnect = await connect({ apiKey: GOOGLE_API_KEY }); const unsubscribe = await subscribe( (m) => { console.log(`new message found: ${m}`); }, (m) => { console.log(`message lost: ${m}`); }); // later, e.g. in componentWillUnmount() removeListener(); unsubscribe(); disconnect(); ``` > Make sure to unpublish, disconnect and remove any listeners as they won't be removed automatically! I don't know if that's possible, if so, please create a Pull Request. ### Bluetooth Availability Check if the user has granted Bluetooth Permissions. This feature is experimental, and strongly differs between iOS and Android. ```ts import { checkBluetoothPermission } from 'react-native-google-nearby-messages'; const hasPermission = await checkBluetoothPermission(); ``` Check if bluetooth is available on this device. This feature is experimental, and strongly differs between iOS and Android. Make sure to use a library like **react-native-permissions** to check if Bluetooth is really available, otherwise your Application might crash with a `EXEC_BAD_ACCESS` error. See [troubleshooting](#troubleshooting) ```ts import { checkBluetoothAvailability } from 'react-native-google-nearby-messages'; const isBluetoothAvailable = await checkBluetoothAvailability(); ``` ### React Hooks This library also provides react hooks for common use cases. In case you're not familiar with hooks, please read the [hooks documentation](https://reactjs.org/docs/hooks-intro.html). When the component unmounts, the hooks automatically stop publishing, subscribing, remove error listeners and disconnect for you. You can also look into the [hooks source code](https://github.com/mrousavy/react-native-google-nearby-messages/blob/master/index.ts#L140-L259) and tweak them for your use case. Make sure to memoize the `NearbyConfig` object using `useMemo`, otherwise the hooks will fall into an infinite loop of re-renders because the config object gets re-created each time and therefore _has changed_. (See: [react useEffect's deps](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects)) #### useNearbyPublication Publishes a message and returns a state which describes the Nearby API status. (e.g.: `connecting`, `published`, `error`, ...) ```ts export default function App() { const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); const nearbyStatus = useNearbyPublication(nearbyConfig, 'Hello from Nearby!'); // ... } ``` #### useNearbySubscription Subscribe to nearby messages and return a state for all messages in an array, as well as a state describing the Nearby API Status. (e.g.: `connecting`, `published`, `error`, ...) ```tsx export default function App() { const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); const { nearbyMessages, nearbyStatus } = useNearbySubscription(nearbyConfig); return ( {item}} /> ); } ``` #### useNearbySearch Search for a specific message using nearby messages. The `isNearby` local specifies whether the string `iPhone 11` could be found using the Nearby API, and the `nearbyStatus` local describes the current status of the Nearby API. (e.g.: `connecting`, `published`, `error`, ...) ```tsx export default function App() { const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); const { isNearby, nearbyStatus } = useNearbySearch(nearbyConfig, 'iPhone 11'); return ( {isNearby ? 'iPhone 11 is nearby!' : 'iPhone 11 is far, far away.'} ); } ``` #### useNearbyErrorCallback Subscribe to any errors emitted from the Nearby API. ```ts export default function App() { useNearbyErrorCallback((kind, message) => { console.log(`Nearby API Error: ${kind}: ${message}`) }); } ``` ## Troubleshooting If you're having any trouble getting the Nearby API working, please make sure you've read [the Troubleshooting Page](./TROUBLESHOOTING.md). If that doesn't help either, [create an issue](https://github.com/mrousavy/react-native-google-nearby-messages/issues). Buy Me a Coffee at ko-fi.com ## Resources * [This medium article](https://teabreak.e-spres-oh.com/swift-in-react-native-the-ultimate-guide-part-1-modules-9bb8d054db03) ================================================ FILE: TASKS.md ================================================ # Tasks/Todos 1. Create `useBluetoothPermission()` hook 2. Create `useBluetoothAvailability()` hook 3. Fix Android ================================================ FILE: TROUBLESHOOTING.md ================================================ # Troubleshooting The library is a rather low-level API, so make sure you roughly understand what each functions does since there are a lot of wrong ways to use the API. ## API Usage Notes * you need to call `connect(...)` before publishing or subscribing * you _can_ call `checkBluetoothPermissions()` and `checkBluetoothAvailability()` before any other calls to make sure bluetooth is available. (Use [react-native-permissions](https://github.com/react-native-community/react-native-permissions) to actually request permissions) * you need to manually call `disconnect(...)` to stop publishing, otherwise nearby subscribers will still see you as nearby even when you e.g. close the app. * it is recommended to use React Hooks, since those are cleaner code and less error-prone. - when you are using hooks, be aware that you can only use a single hook in the same context at a time. (With the exception of the `useNearbyError` hook) This is because the Nearby Messages API is a global/singleton instance, so when you call `connect(...)` twice (which will happen if you have multiple hooks), an error gets thrown. You can write your custom Hooks if you inted on doing more complex logic. * all errors are thrown as Promise rejectors, so make sure you surround your calls with a try/catch. For error events, use the `addOnErrorListener(...)` function or `useNearbyError(...)` hook. ## Troubleshooting If you're still having trouble, be aware of the following: 1. The JS error codes (promise rejectors) should tell you enough information on what went wrong, check [this doc page](https://developers.google.com/android/reference/com/google/android/gms/nearby/messages/NearbyMessagesStatusCodes) on more information about each individual error code. 2. If you are receiving seemingly random promise rejectors, it is likely that the metro bundler has caused some issues with the state cache. Try reloading the App. (pressing r in the metro bundler console) 3. Make sure your device has BLE capabilities and the App has Permission to use those. Include the required Permissions in `Info.plist` and `AndroidManifest.xml`. Also try adding the `INTERNET`, `ACCESS_FINE_LOCATION` and `ACCESS_COARSE_LOCATION` permissions if nothing else works. 4. Make sure your API Key is valid! 5. The Nearby Messages API is available on Android devices with [Google Play services](https://developers.google.com/android/guides/overview) 7.8.0 or higher. Devices running Android 2.3 or higher that have the Google Play Store app automatically receive updates to Google Play services. To check which version of Google Play services is installed on your device, go to **Settings > Apps > Google Play services**. See: [here](https://developers.google.com/nearby/messages/android/get-started) 6. If you're having build problems on iOS, check if your **Build Phases** -> **[CP] Copy Pods Resources** contains the `Assets.car` entry. If yes, remove it. See: [iOS Setup](#ios-setup). You can also add a fix at the top of your Podfile to do this automatically (`install! 'cocoapods', :disable_input_output_paths => true`), but this greatly increases your build time. See: [#4 (comment)](https://github.com/mrousavy/react-native-google-nearby-messages/issues/4#issuecomment-649961499) and [#8422 (CocoaPods/CodoaPods)](https://github.com/CocoaPods/CocoaPods/issues/8122) 7. On the iOS Simulator the App may crash (`EXC_BAD_ACCESS`) when trying to use the API. This is because the Simulator does not have Bluetooth functionality, and I don't think I can generally detect this before calling connect/subscribe/publish. Make sure to check if bluetooth is available using a library like [react-native-permissions](https://github.com/react-native-community/react-native-permissions). You don't have to request permission, as the react-native-google-nearby-messages library does that for you on subscribe/publish calls. Only call this library when react-native-permissions check returns anything else than `unavailable`. 8. If you're having the build error `duplicate symbol 'google::RemoveLogSink(google::LogSink*)'` on iOS, include a small `post_install` "patcher" script in your Podfile: ```ruby def rename_logging_functions(installer) puts "Renaming logging functions" root = File.dirname(installer.pods_project.path) Dir.chdir(root); Dir.glob("**/*.{h,cc,cpp,in}") {|filename| filepath = root + "/" + filename text = File.read(filepath) addText = text.gsub!(/(? ================================================ FILE: android/.project ================================================ android Project android created by Buildship. org.eclipse.jdt.core.javabuilder org.eclipse.buildship.core.gradleprojectbuilder org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature ================================================ FILE: android/.settings/org.eclipse.buildship.core.prefs ================================================ arguments= auto.sync=false build.scans.enabled=false connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.project.dir= eclipse.preferences.version=1 gradle.user.home= java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home jvm.arguments= offline.mode=false override.workspace.settings=true show.console.view=true show.executions.view=true ================================================ FILE: android/README.md ================================================ README ====== If you want to publish the lib as a maven dependency, follow these steps before publishing a new version to npm: 1. Be sure to have the Android [SDK](https://developer.android.com/studio/index.html) and [NDK](https://developer.android.com/ndk/guides/index.html) installed 2. Be sure to have a `local.properties` file in this folder that points to the Android SDK and NDK ``` ndk.dir=/Users/{username}/Library/Android/sdk/ndk-bundle sdk.dir=/Users/{username}/Library/Android/sdk ``` 3. Delete the `maven` folder 4. Run `./gradlew installArchives` 5. Verify that latest set of generated files is in the maven folder with the correct version number ================================================ FILE: android/build.gradle ================================================ // android/build.gradle // based on: // // * https://github.com/facebook/react-native/blob/0.60-stable/template/android/build.gradle // original location: // - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/build.gradle // // * https://github.com/facebook/react-native/blob/0.60-stable/template/android/app/build.gradle // original location: // - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/app/build.gradle def DEFAULT_COMPILE_SDK_VERSION = 28 def DEFAULT_BUILD_TOOLS_VERSION = '28.0.3' def DEFAULT_MIN_SDK_VERSION = 16 def DEFAULT_TARGET_SDK_VERSION = 28 def safeExtGet(prop, fallback) { rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback } apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'maven' buildscript { ext.kotlin_version = '1.3.72' // The Android Gradle plugin is only required when opening the android folder stand-alone. // This avoids unnecessary downloads and potential conflicts when the library is included as a // module dependency in an application project. // ref: https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies if (project == rootProject) { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' } } repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'com.android.library' apply plugin: 'maven' android { compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION) buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION) defaultConfig { minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION) targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION) versionCode 1 versionName "1.0" } lintOptions { abortOnError false } } repositories { // ref: https://www.baeldung.com/maven-local-repository mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } maven { // Android JSC is installed from npm url "$rootDir/../node_modules/jsc-android/dist" } google() jcenter() } dependencies { //noinspection GradleDynamicVersion implementation 'com.facebook.react:react-native:+' // From node_modules implementation 'com.google.android.gms:play-services-nearby:17.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } def configureReactNativePom(def pom) { def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text) pom.project { name packageJson.title artifactId packageJson.name version = packageJson.version group = "com.reactlibrary" description packageJson.description url packageJson.repository.baseUrl licenses { license { name packageJson.license url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename distribution 'repo' } } developers { developer { id packageJson.author.username name packageJson.author.name } } } } afterEvaluate { project -> // some Gradle build hooks ref: // https://www.oreilly.com/library/view/gradle-beyond-the/9781449373801/ch03.html task androidJavadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs classpath += files(android.bootClasspath) classpath += files(project.getConfigurations().getByName('compile').asList()) include '**/*.java' } task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) { classifier = 'javadoc' from androidJavadoc.destinationDir } task androidSourcesJar(type: Jar) { classifier = 'sources' from android.sourceSets.main.java.srcDirs include '**/*.java' } android.libraryVariants.all { variant -> def name = variant.name.capitalize() def javaCompileTask = variant.javaCompileProvider.get() task "jar${name}"(type: Jar, dependsOn: javaCompileTask) { from javaCompileTask.destinationDir } } artifacts { archives androidSourcesJar archives androidJavadocJar } task installArchives(type: Upload) { configuration = configurations.archives repositories.mavenDeployer { // Deploy to react-native-event-bridge/maven, ready to publish to npm repository url: "file://${projectDir}/../android/maven" configureReactNativePom pom } } } ================================================ FILE: android/gradle/wrapper/gradle-wrapper.properties ================================================ #Tue Jun 02 19:19:02 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip ================================================ FILE: android/gradlew ================================================ #!/usr/bin/env sh ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=$((i+1)) done case $i in (0) set -- ;; (1) set -- "$args0" ;; (2) set -- "$args0" "$args1" ;; (3) set -- "$args0" "$args1" "$args2" ;; (4) set -- "$args0" "$args1" "$args2" "$args3" ;; (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi exec "$JAVACMD" "$@" ================================================ FILE: android/gradlew.bat ================================================ @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS= @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: android/src/main/AndroidManifest.xml ================================================ ================================================ FILE: android/src/main/java/com/google/android/gms/nearby/messages/BetterStrategy.java ================================================ // // This is the source code of the Google Nearby Messages Strategy Java file (com.google.android.gms.nearby.messages.Strategy). // Apparently they forgot to add a discovery medium setter functions, so I just added that here. // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.google.android.gms.nearby.messages; import com.google.android.gms.common.internal.Preconditions; import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Class; import javax.annotation.concurrent.Immutable; @Immutable @Class( creator = "StrategyCreator" ) public class BetterStrategy { public static final int DISCOVERY_MEDIUM_DEFAULT = -1; public static final int DISCOVERY_MEDIUM_BLE = 2; public static final int DISCOVERY_MEDIUM_AUDIO = 4; public static class Builder { private int discoveryMode = Strategy.DISCOVERY_MODE_DEFAULT; private int ttlSeconds = 300; private int distanceType = Strategy.DISTANCE_TYPE_DEFAULT; private int discoveryMedium = DISCOVERY_MEDIUM_DEFAULT; private int zzfy = 0; public Builder() { } public BetterStrategy.Builder setDiscoveryMode(int var1) { this.discoveryMode = var1; return this; } public BetterStrategy.Builder setDiscoveryMedium(int var1) { this.discoveryMedium = var1; return this; } public BetterStrategy.Builder setTtlSeconds(int var1) { Preconditions.checkArgument(var1 == 2147483647 || var1 > 0 && var1 <= 86400, "mTtlSeconds(%d) must either be TTL_SECONDS_INFINITE, or it must be between 1 and TTL_SECONDS_MAX(%d) inclusive", new Object[]{var1, 86400}); this.ttlSeconds = var1; return this; } public BetterStrategy.Builder setDistanceType(int var1) { this.distanceType = var1; return this; } public Strategy build() { if (this.discoveryMedium == DISCOVERY_MEDIUM_BLE && this.distanceType == Strategy.DISTANCE_TYPE_EARSHOT) { throw new IllegalStateException("Cannot set EARSHOT with BLE only mode."); } else { return new Strategy(2, 0, this.ttlSeconds, this.distanceType, false, this.discoveryMedium, this.discoveryMode, 0); } } } } ================================================ FILE: android/src/main/java/com/mrousavy/nearby/GoogleNearbyMessagesModule.kt ================================================ package com.mrousavy.nearby import android.Manifest import android.bluetooth.BluetoothAdapter import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.util.Log import androidx.core.content.ContextCompat import com.facebook.react.bridge.* import com.facebook.react.modules.core.DeviceEventManagerModule import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.api.ApiException import com.google.android.gms.nearby.Nearby import com.google.android.gms.nearby.messages.* import java.util.* val defaultDiscoveryModes = Strategy.DISCOVERY_MODE_BROADCAST or Strategy.DISCOVERY_MODE_SCAN val defaultDiscoveryMediums = BetterStrategy.DISCOVERY_MEDIUM_BLE val defaultPermissions = NearbyPermissions.DEFAULT class GoogleNearbyMessagesModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), LifecycleEventListener { private enum class EventType(private val _type: String) { MESSAGE_FOUND("MESSAGE_FOUND"), MESSAGE_LOST("MESSAGE_LOST"), BLUETOOTH_ERROR("BLUETOOTH_ERROR"), PERMISSION_ERROR("PERMISSION_ERROR"), // doesn't exist on Android MESSAGE_NO_DATA_ERROR("MESSAGE_NO_DATA_ERROR"); override fun toString(): String { return _type } } private var _messagesClient: MessagesClient? = null private var _publishedMessage: Message? = null private var _isSubscribed = false private var _listener: MessageListener? = null private var _subscribeOptions: SubscribeOptions? = null private var _publishOptions: PublishOptions? = null private val isMinimumAndroidVersion: Boolean get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH private val context: Context? get() = currentActivity @ReactMethod fun connect(discoveryModes: ReadableArray, discoveryMediums: ReadableArray, promise: Promise) { Log.d(name, "GNM_BLE: Connecting...") if (!isMinimumAndroidVersion) { promise.reject(Exception("UNSUPPORTED_ERROR: Current Android version is too low: ${Build.VERSION.SDK_INT}")) return } if (!isGooglePlayServicesAvailable(true)) { promise.reject(Exception("UNSUPPORTED_ERROR: Google Play Services are not available on this device.")) return } if (BluetoothAdapter.getDefaultAdapter() == null) { promise.reject(Exception("UNSUPPORTED_ERROR: No default Bluetooth adapter could be found.")) return } _listener = object : MessageListener() { override fun onFound(message: Message) { handleOnFound(message) } override fun onLost(message: Message) { handleOnLost(message) } } val mediums = parseDiscoveryMediums(discoveryMediums) val modes = parseDiscoveryModes(discoveryModes) val permissions = parsePermissionOptions(discoveryMediums) _messagesClient = Nearby.getMessagesClient(context!!, MessagesOptions.Builder().setPermissions(permissions).build()) _messagesClient!!.registerStatusCallback(object : StatusCallback() { override fun onPermissionChanged(permissionGranted: Boolean) { super.onPermissionChanged(permissionGranted) if (!permissionGranted) emitErrorEvent(EventType.PERMISSION_ERROR, "Bluetooth Permission denied!") } }) _subscribeOptions = SubscribeOptions.Builder() .setStrategy(BetterStrategy.Builder().setDiscoveryMedium(mediums).setDiscoveryMode(modes).setTtlSeconds(Strategy.TTL_SECONDS_INFINITE).build()) .setCallback(object : SubscribeCallback() { override fun onExpired() { super.onExpired() Log.i(name, "GNM_BLE: No longer subscribing") _isSubscribed = false emitErrorEvent(EventType.BLUETOOTH_ERROR, "Subscribe expired!") } }).build() _publishOptions = PublishOptions.Builder() .setStrategy(BetterStrategy.Builder().setDiscoveryMedium(mediums).setDiscoveryMode(modes).setTtlSeconds(Strategy.TTL_SECONDS_MAX).build()) .setCallback(object : PublishCallback() { override fun onExpired() { super.onExpired() Log.i(name, "GNM_BLE: No longer publishing") _publishedMessage = null emitErrorEvent(EventType.BLUETOOTH_ERROR, "Publish expired!") } }).build() _isSubscribed = false Log.d(name, "GNM_BLE: Connected with discoveryMediums $mediums, permissions $permissions and discoveryModes $modes!") promise.resolve(null) } @ReactMethod fun disconnect() { if (_messagesClient != null) { if (_isSubscribed) _messagesClient!!.unsubscribe(_listener!!) if (_publishedMessage != null) _messagesClient!!.unpublish(_publishedMessage!!) } _listener = null _subscribeOptions = null _publishOptions = null _isSubscribed = false _publishedMessage = null _messagesClient = null } @ReactMethod fun subscribe(promise: Promise) { Log.d(name, "GNM_BLE: Subscribing...") if (_messagesClient != null) { if (_isSubscribed) { promise.reject(Exception("An existing callback is already subscribed to the Google Nearby Messages API! Please unsubscribe before subscribing again!")) } else { _messagesClient!!.subscribe(_listener!!, _subscribeOptions!!).addOnCompleteListener { task -> Log.d(name, "GNM_BLE: Subscribed! Successful: ${task.isSuccessful}") if (task.isSuccessful) { _isSubscribed = true promise.resolve(null) } else { _isSubscribed = false val e = task.exception if (e != null) promise.reject(mapApiException(e)) else promise.reject(Exception("The task was not successful, but no Exception was thrown.")) } } } } else { promise.reject(Exception("The Messages Client was null. Call connect() before using subscribe or publish!")) } } @ReactMethod fun unsubscribe(promise: Promise) { Log.d(name, "GNM_BLE: Unsubscribing...") if (_messagesClient != null) { _messagesClient!!.unsubscribe(_listener!!).addOnCompleteListener { task -> Log.d(name, "GNM_BLE: Unsubscribed! Successful: ${task.isSuccessful}") if (task.isSuccessful) { _isSubscribed = false promise.resolve(null) } else { val e = task.exception if (e != null) promise.reject(mapApiException(e)) else promise.reject(Exception("The task was not successful, but no Exception was thrown.")) } } } else { promise.reject(Exception("The Messages Client was null. Did the GoogleNearbyMessagesModule native constructor fail to execute?")) } } @ReactMethod fun publish(message: String, promise: Promise) { if (_messagesClient != null) { if (_publishedMessage != null) { promise.reject(Exception("There is an active published message! Call unpublish first!")) } else { _publishedMessage = Message(message.toByteArray()) _messagesClient!!.publish(_publishedMessage!!, _publishOptions!!).addOnCompleteListener { task -> Log.d(name, "GNM_BLE: Published! Successful: ${task.isSuccessful}") if (task.isSuccessful) { promise.resolve(null) } else { _publishedMessage = null val e = task.exception if (e != null) promise.reject(mapApiException(e)) else promise.reject(Exception("The task was not successful, but no Exception was thrown.")) } } } } else { promise.reject(Exception("The Messages Client was null. Did the GoogleNearbyMessagesModule native constructor fail to execute?")) } } @ReactMethod fun unpublish(promise: Promise) { if (_messagesClient != null) { if (_publishedMessage != null) { _messagesClient!!.unpublish(_publishedMessage!!).addOnCompleteListener { task -> Log.d(name, "GNM_BLE: Unpublished! Successful: ${task.isSuccessful}") if (task.isSuccessful) { _publishedMessage = null promise.resolve(null) } else { val e = task.exception if (e != null) promise.reject(mapApiException(e)) else promise.reject(Exception("The task was not successful, but no Exception was thrown.")) } } } } else { promise.reject(Exception("The Messages Client was null. Did the GoogleNearbyMessagesModule native constructor fail to execute?")) } } @ReactMethod fun checkBluetoothPermission(promise: Promise) { val granted = ContextCompat.checkSelfPermission(reactApplicationContext, Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED val grantedAdmin = ContextCompat.checkSelfPermission(reactApplicationContext, Manifest.permission.BLUETOOTH_ADMIN) == PackageManager.PERMISSION_GRANTED promise.resolve(granted && grantedAdmin) } @ReactMethod fun checkBluetoothAvailability(promise: Promise) { val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() if (bluetoothAdapter == null) { promise.resolve(false) } else { val isPlayServicesAvailable = isGooglePlayServicesAvailable(true) promise.resolve(isPlayServicesAvailable && isMinimumAndroidVersion) } } // Google Nearby Messages API Callbacks fun handleOnFound(message: Message) { if (message.content != null) { val messageString = String(message.content) Log.d(name, "GNM_BLE: Found message: $messageString") emitMessageEvent(EventType.MESSAGE_FOUND, messageString) } else { emitMessageEvent(EventType.MESSAGE_NO_DATA_ERROR, "message has no data!") } } fun handleOnLost(message: Message) { if (message.content != null) { val messageString = String(message.content) Log.d(name, "GNM_BLE: Lost message: $messageString") emitMessageEvent(EventType.MESSAGE_LOST, messageString) } else { emitMessageEvent(EventType.MESSAGE_NO_DATA_ERROR, "message has no data!") } } private fun isGooglePlayServicesAvailable(showErrorDialog: Boolean): Boolean { val googleApi = GoogleApiAvailability.getInstance() val availability = googleApi.isGooglePlayServicesAvailable(context) val result = availability == ConnectionResult.SUCCESS if (!result && showErrorDialog && googleApi.isUserResolvableError(availability)) { googleApi.getErrorDialog(currentActivity, availability, PLAY_SERVICES_RESOLUTION_REQUEST).show() } return result } // React Native Lifecycle Methods override fun onHostResume() { Log.d(name, "GNM_BLE: onHostResume") // TODO: On Host Resume? I think the Nearby API automatically manages this using the context } override fun onHostPause() { Log.d(name, "GNM_BLE: onHostPause") // TODO: On Host Pause? I think the Nearby API automatically manages this using the context } override fun onHostDestroy() { Log.d(name, "GNM_BLE: onHostDestroy") // TODO: Does this fire twice? (Because of onCatalystInstanceDestroy, and maybe Nearby API onHostDestroy...) disconnect() } override fun onCatalystInstanceDestroy() { Log.d(name, "GNM_BLE: onCatalystInstanceDestroy") disconnect() } override fun getName(): String { return "GoogleNearbyMessages" } private fun mapApiException(e: Exception): Exception { val apiException = if (e is ApiException) e else null return if (apiException != null) { val descriptor = errorCodeToDescriptor(apiException.statusCode) Exception(apiException.statusCode.toString() + ": " + descriptor + ". See: https://developers.google.com/android/reference/com/google/android/gms/nearby/messages/NearbyMessagesStatusCodes") } else { e } } /** * Map API error code to descriptor - See: https://developers.google.com/android/reference/com/google/android/gms/nearby/messages/NearbyMessagesStatusCodes * @param errorCode The code to map. * @return A descriptor for the error code. Or null. */ private fun errorCodeToDescriptor(errorCode: Int): String { return when (errorCode) { 2802 -> "APP_NOT_OPTED_IN" 2804 -> "APP_QUOTA_LIMIT_REACHED" 2821 -> "BLE_ADVERTISING_UNSUPPORTED" 2822 -> "BLE_SCANNING_UNSUPPORTED" 2820 -> "BLUETOOTH_OFF" 2803 -> "DISALLOWED_CALLING_CONTEXT" 2806 -> "FORBIDDEN" 2807 -> "MISSING_PERMISSIONS" 2805 -> "NOT_AUTHORIZED" 2801 -> "TOO_MANY_PENDING_INTENTS" else -> "UNKNOWN_ERROR" } } private fun parseDiscoveryModes(discoveryModes: ReadableArray): Int { var discoveryMode = 0 val list = discoveryModes.toArrayList() if (list.size == 0) return defaultDiscoveryModes for (mode in list) { val modeLower = mode.toString().toLowerCase(Locale.ROOT) when (modeLower) { "broadcast" -> discoveryMode = discoveryMode or Strategy.DISCOVERY_MODE_BROADCAST "scan" -> discoveryMode = discoveryMode or Strategy.DISCOVERY_MODE_SCAN } } return discoveryMode } // TODO: I don't know if that's parsing the right values. There are no docs for this. // TODO: Strategy.java has zze() which maps BLE-only to 2. But are the other ones correct? Ultrasound is 4, here it is 6?? private fun parseDiscoveryMediums(discoveryMediums: ReadableArray): Int { var discoveryMedium = 0 val list = discoveryMediums.toArrayList() if (list.size == 0) return defaultDiscoveryMediums for (medium in list) { val mediumLower = medium.toString().toLowerCase(Locale.ROOT) when (mediumLower) { "ble" -> discoveryMedium = discoveryMedium or BetterStrategy.DISCOVERY_MEDIUM_BLE "audio" -> discoveryMedium = discoveryMedium or BetterStrategy.DISCOVERY_MEDIUM_AUDIO // only supported on android, these are not tested!! "bluetooth" -> discoveryMedium = discoveryMedium or NearbyPermissions.BLUETOOTH "default" -> discoveryMedium = discoveryMedium or BetterStrategy.DISCOVERY_MEDIUM_DEFAULT "none" -> discoveryMedium = discoveryMedium or NearbyPermissions.NONE } } return discoveryMedium } private fun parsePermissionOptions(discoveryMediums: ReadableArray): Int { var permissions = 0 val list = discoveryMediums.toArrayList() if (list.size == 0) return defaultPermissions for (medium in list) { val mediumLower = medium.toString().toLowerCase(Locale.ROOT) when (mediumLower) { "ble" -> permissions = permissions or NearbyPermissions.BLE "audio" -> permissions = permissions or NearbyPermissions.MICROPHONE // only supported on android, these are not tested!! "bluetooth" -> permissions = permissions or NearbyPermissions.BLUETOOTH "default" -> permissions = permissions or NearbyPermissions.DEFAULT "none" -> permissions = permissions or NearbyPermissions.NONE } } return permissions } // React Native Event Emitters private fun emitMessageEvent(event: EventType, message: String) { val params = Arguments.createMap() params.putString("message", message) val context = reactApplicationContext context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit(event.toString(), params) } private fun emitErrorEvent(event: EventType, message: String?) { val params = Arguments.createMap() if (message != null) { params.putString("message", message) } val context = reactApplicationContext context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit(event.toString(), params) } companion object { private const val PLAY_SERVICES_RESOLUTION_REQUEST = 9000 } init { reactContext.addLifecycleEventListener(this) } } ================================================ FILE: android/src/main/java/com/mrousavy/nearby/GoogleNearbyMessagesPackage.kt ================================================ package com.mrousavy.nearby import com.facebook.react.ReactPackage import com.facebook.react.bridge.JavaScriptModule import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager import java.util.* class GoogleNearbyMessagesPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List { return Arrays.asList(GoogleNearbyMessagesModule(reactContext)) } fun createJSModules(): List>? { // deprecated in react native 0.47 return null } override fun createViewManagers(reactContext: ReactApplicationContext): List> { return emptyList() } } ================================================ FILE: example/.buckconfig ================================================ [android] target = Google Inc.:Google APIs:23 [maven_repositories] central = https://repo1.maven.org/maven2 ================================================ FILE: example/.eslintrc.js ================================================ module.exports = { root: true, extends: '@react-native-community', }; ================================================ FILE: example/.flowconfig ================================================ [ignore] ; We fork some components by platform .*/*[.]android.js ; Ignore "BUCK" generated dirs /\.buckd/ ; Ignore polyfills node_modules/react-native/Libraries/polyfills/.* ; These should not be required directly ; require from fbjs/lib instead: require('fbjs/lib/warning') node_modules/warning/.* ; Flow doesn't support platforms .*/Libraries/Utilities/LoadingView.js [untyped] .*/node_modules/@react-native-community/cli/.*/.* [include] [libs] node_modules/react-native/interface.js node_modules/react-native/flow/ [options] emoji=true esproposal.optional_chaining=enable esproposal.nullish_coalescing=enable module.file_ext=.js module.file_ext=.json module.file_ext=.ios.js munge_underscores=true module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' suppress_type=$FlowIssue suppress_type=$FlowFixMe suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeState suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError [lints] sketchy-null-number=warn sketchy-null-mixed=warn sketchy-number=warn untyped-type-import=warn nonstrict-import=warn deprecated-type=warn unsafe-getters-setters=warn inexact-spread=warn unnecessary-invariant=warn signature-verification-failure=warn deprecated-utility=error [strict] deprecated-type nonstrict-import sketchy-null unclear-type unsafe-getters-setters untyped-import untyped-type-import [version] ^0.113.0 ================================================ FILE: example/.gitattributes ================================================ *.pbxproj -text ================================================ FILE: example/.gitignore ================================================ # OSX # .DS_Store # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate # Android/IntelliJ # build/ .idea .gradle local.properties *.iml # node.js # node_modules/ npm-debug.log yarn-error.log # BUCK buck-out/ \.buckd/ *.keystore !debug.keystore # fastlane # # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the # screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/ */fastlane/report.xml */fastlane/Preview.html */fastlane/screenshots # Bundle artifact *.jsbundle # CocoaPods /ios/Pods/ ================================================ FILE: example/.prettierrc.js ================================================ module.exports = { bracketSpacing: false, jsxBracketSameLine: true, singleQuote: true, trailingComma: 'all', }; ================================================ FILE: example/.watchmanconfig ================================================ {} ================================================ FILE: example/App.js ================================================ /** * Sample React Native App * * adapted from App.js generated by the following command: * * react-native init example * * https://github.com/facebook/react-native */ import React, {useState, useCallback, useEffect} from 'react'; import {StyleSheet, Text, View, Alert} from 'react-native'; import { connect, publish, subscribe, checkBluetoothPermission, checkBluetoothAvailability, useNearbyErrorCallback, disconnect, } from 'react-native-google-nearby-messages'; import {getDeviceName} from 'react-native-device-info'; const API_KEY = ''; export default function App() { const [nearbyMessage, setNearbyMessage] = useState(''); useNearbyErrorCallback( useCallback((kind, message) => { Alert.alert(kind, message); }, []), ); const _connect = useCallback(async () => { console.log('Connecting...'); await connect({ apiKey: API_KEY, discoveryModes: ['broadcast', 'scan'], discoveryMediums: ['ble'], }); console.log('Connected!'); return () => disconnect(); }, []); const _publish = useCallback(async () => { const deviceName = await getDeviceName(); console.log(`Publishing "${deviceName}"...`); await publish(deviceName); console.log(`Published "${deviceName}"!`); }, []); const _subscribe = useCallback(async () => { console.log('Subscribing...'); await subscribe( (m) => { setNearbyMessage(m); console.log(`Found: ${JSON.stringify(m)}`); }, (m) => { setNearbyMessage(''); console.log(`Lost: ${JSON.stringify(m)}`); }, ); console.log('Subscribed!'); }, []); const _checkPermissions = useCallback(async () => { const permission = await checkBluetoothPermission(); const available = await checkBluetoothAvailability(); Alert.alert( 'Bluetooth Permissions:', `Granted: ${permission}, Available: ${available}`, ); }, []); useEffect(() => { const start = async () => { try { await _checkPermissions(); await _connect(); await _subscribe(); await _publish(); } catch (e) { Alert.alert( 'Unknown error occured while connecting!', JSON.stringify(e.message ?? e), ); } }; start(); return () => disconnect(); }, [_connect, _subscribe, _publish, _checkPermissions]); return ( ☆GoogleNearbyMessages example☆ Nearby Message: {nearbyMessage} ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, }); ================================================ FILE: example/__tests__/App-test.js ================================================ /** * @format */ import 'react-native'; import React from 'react'; import App from '../App'; // Note: test renderer must be required after react-native. import renderer from 'react-test-renderer'; it('renders correctly', () => { renderer.create(); }); ================================================ FILE: example/android/.project ================================================ example Project android created by Buildship. org.eclipse.buildship.core.gradleprojectbuilder org.eclipse.buildship.core.gradleprojectnature ================================================ FILE: example/android/.settings/org.eclipse.buildship.core.prefs ================================================ arguments= auto.sync=false build.scans.enabled=false connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.project.dir= eclipse.preferences.version=1 gradle.user.home= java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home jvm.arguments= offline.mode=false override.workspace.settings=true show.console.view=true show.executions.view=true ================================================ FILE: example/android/app/.classpath ================================================ ================================================ FILE: example/android/app/.project ================================================ app Project app created by Buildship. org.eclipse.jdt.core.javabuilder org.eclipse.buildship.core.gradleprojectbuilder org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature ================================================ FILE: example/android/app/.settings/org.eclipse.buildship.core.prefs ================================================ arguments= auto.sync=false build.scans.enabled=false connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.3)) connection.project.dir=.. eclipse.preferences.version=1 gradle.user.home= java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home jvm.arguments= offline.mode=false override.workspace.settings=true show.console.view=true show.executions.view=true ================================================ FILE: example/android/app/BUCK ================================================ # To learn about Buck see [Docs](https://buckbuild.com/). # To run your application with Buck: # - install Buck # - `npm start` - to start the packager # - `cd android` # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck # - `buck install -r android/app` - compile, install and run application # load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") lib_deps = [] create_aar_targets(glob(["libs/*.aar"])) create_jar_targets(glob(["libs/*.jar"])) android_library( name = "all-libs", exported_deps = lib_deps, ) android_library( name = "app-code", srcs = glob([ "src/main/java/**/*.java", ]), deps = [ ":all-libs", ":build_config", ":res", ], ) android_build_config( name = "build_config", package = "com.example", ) android_resource( name = "res", package = "com.example", res = "src/main/res", ) android_binary( name = "app", keystore = "//android/keystores:debug", manifest = "src/main/AndroidManifest.xml", package_type = "debug", deps = [ ":app-code", ], ) ================================================ FILE: example/android/app/build.gradle ================================================ apply plugin: "com.android.application" import com.android.build.OutputFile /** * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets * and bundleReleaseJsAndAssets). * These basically call `react-native bundle` with the correct arguments during the Android build * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the * bundle directly from the development server. Below you can see all the possible configurations * and their defaults. If you decide to add a configuration block, make sure to add it before the * `apply from: "../../node_modules/react-native/react.gradle"` line. * * project.ext.react = [ * // the name of the generated asset file containing your JS bundle * bundleAssetName: "index.android.bundle", * * // the entry file for bundle generation. If none specified and * // "index.android.js" exists, it will be used. Otherwise "index.js" is * // default. Can be overridden with ENTRY_FILE environment variable. * entryFile: "index.android.js", * * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format * bundleCommand: "ram-bundle", * * // whether to bundle JS and assets in debug mode * bundleInDebug: false, * * // whether to bundle JS and assets in release mode * bundleInRelease: true, * * // whether to bundle JS and assets in another build variant (if configured). * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants * // The configuration property can be in the following formats * // 'bundleIn${productFlavor}${buildType}' * // 'bundleIn${buildType}' * // bundleInFreeDebug: true, * // bundleInPaidRelease: true, * // bundleInBeta: true, * * // whether to disable dev mode in custom build variants (by default only disabled in release) * // for example: to disable dev mode in the staging build type (if configured) * devDisabledInStaging: true, * // The configuration property can be in the following formats * // 'devDisabledIn${productFlavor}${buildType}' * // 'devDisabledIn${buildType}' * * // the root of your project, i.e. where "package.json" lives * root: "../../", * * // where to put the JS bundle asset in debug mode * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", * * // where to put the JS bundle asset in release mode * jsBundleDirRelease: "$buildDir/intermediates/assets/release", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in debug mode * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", * * // where to put drawable resources / React Native assets, e.g. the ones you use via * // require('./image.png')), in release mode * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", * * // by default the gradle tasks are skipped if none of the JS files or assets change; this means * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to * // date; if you have any other folders that you want to ignore for performance reasons (gradle * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ * // for example, you might want to remove it from here. * inputExcludes: ["android/**", "ios/**"], * * // override which node gets called and with what additional arguments * nodeExecutableAndArgs: ["node"], * * // supply additional arguments to the packager * extraPackagerArgs: [] * ] */ project.ext.react = [ enableHermes: false, // clean and rebuild if changing ] apply from: "../../node_modules/react-native/react.gradle" /** * Set this to true to create two separate APKs instead of one: * - An APK that only works on ARM devices * - An APK that only works on x86 devices * The advantage is the size of the APK is reduced by about 4MB. * Upload all the APKs to the Play Store and people will download * the correct one based on the CPU architecture of their device. */ def enableSeparateBuildPerCPUArchitecture = false /** * Run Proguard to shrink the Java bytecode in release builds. */ def enableProguardInReleaseBuilds = false /** * The preferred build flavor of JavaScriptCore. * * For example, to use the international variant, you can use: * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ def jscFlavor = 'org.webkit:android-jsc:+' /** * Whether to enable the Hermes VM. * * This should be set on project.ext.react and mirrored here. If it is not set * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode * and the benefits of using Hermes will therefore be sharply reduced. */ def enableHermes = project.ext.react.get("enableHermes", false); android { compileSdkVersion rootProject.ext.compileSdkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { applicationId "com.example" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } signingConfigs { debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } } buildTypes { debug { signingConfig signingConfigs.debug } release { // Caution! In production, you need to generate your own keystore file. // see https://facebook.github.io/react-native/docs/signed-apk-android. signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } packagingOptions { pickFirst "lib/armeabi-v7a/libc++_shared.so" pickFirst "lib/arm64-v8a/libc++_shared.so" pickFirst "lib/x86/libc++_shared.so" pickFirst "lib/x86_64/libc++_shared.so" } // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // https://developer.android.com/studio/build/configure-apk-splits.html def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) //noinspection GradleDynamicVersion implementation "com.facebook.react:react-native:+" // From node_modules implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" if (enableHermes) { def hermesPath = "../../node_modules/hermes-engine/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") releaseImplementation files(hermesPath + "hermes-release.aar") } else { implementation jscFlavor } } // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { from configurations.compile into 'libs' } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) ================================================ FILE: example/android/app/build_defs.bzl ================================================ """Helper definitions to glob .aar and .jar targets""" def create_aar_targets(aarfiles): for aarfile in aarfiles: name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] lib_deps.append(":" + name) android_prebuilt_aar( name = name, aar = aarfile, ) def create_jar_targets(jarfiles): for jarfile in jarfiles: name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] lib_deps.append(":" + name) prebuilt_jar( name = name, binary_jar = jarfile, ) ================================================ FILE: example/android/app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: ================================================ FILE: example/android/app/src/debug/AndroidManifest.xml ================================================ ================================================ FILE: example/android/app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: example/android/app/src/main/java/com/example/MainActivity.java ================================================ package com.example; import com.facebook.react.ReactActivity; public class MainActivity extends ReactActivity { /** * Returns the name of the main component registered from JavaScript. This is used to schedule * rendering of the component. */ @Override protected String getMainComponentName() { return "example"; } } ================================================ FILE: example/android/app/src/main/java/com/example/MainApplication.java ================================================ package com.example; import android.app.Application; import android.content.Context; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.soloader.SoLoader; import java.lang.reflect.InvocationTargetException; import java.util.List; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List packages = new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); return packages; } @Override protected String getJSMainModuleName() { return "index"; } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); } } ================================================ FILE: example/android/app/src/main/res/values/strings.xml ================================================ example ================================================ FILE: example/android/app/src/main/res/values/styles.xml ================================================ ================================================ FILE: example/android/build.gradle ================================================ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { buildToolsVersion = "28.0.3" minSdkVersion = 16 compileSdkVersion = 28 targetSdkVersion = 28 } repositories { google() jcenter() } dependencies { classpath('com.android.tools.build:gradle:4.0.0') // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url("$rootDir/../node_modules/react-native/android") } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } google() jcenter() maven { url 'https://www.jitpack.io' } } } ================================================ FILE: example/android/gradle/wrapper/gradle-wrapper.properties ================================================ #Fri Jun 26 13:32:42 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip ================================================ FILE: example/android/gradle.properties ================================================ # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true ================================================ FILE: example/android/gradlew ================================================ #!/usr/bin/env sh # # Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin or MSYS, switch paths to Windows format before running java if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=$((i+1)) done case $i in (0) set -- ;; (1) set -- "$args0" ;; (2) set -- "$args0" "$args1" ;; (3) set -- "$args0" "$args1" "$args2" ;; (4) set -- "$args0" "$args1" "$args2" "$args3" ;; (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi exec "$JAVACMD" "$@" ================================================ FILE: example/android/gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: example/android/settings.gradle ================================================ rootProject.name = 'example' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' ================================================ FILE: example/app.json ================================================ { "name": "example", "displayName": "example" } ================================================ FILE: example/babel.config.js ================================================ module.exports = { presets: ['module:metro-react-native-babel-preset'], }; ================================================ FILE: example/index.js ================================================ /** * @format */ import {AppRegistry} from 'react-native'; import App from './App'; import {name as appName} from './app.json'; AppRegistry.registerComponent(appName, () => App); ================================================ FILE: example/ios/Podfile ================================================ platform :ios, '9.0' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' target 'example' do # Pods for example pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" pod 'React', :path => '../node_modules/react-native/' pod 'React-Core', :path => '../node_modules/react-native/' pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon" pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' target 'exampleTests' do inherit! :complete # Pods for testing end use_native_modules! end target 'example-tvOS' do # Pods for example-tvOS target 'example-tvOSTests' do inherit! :search_paths # Pods for testing end end ================================================ FILE: example/ios/example/AppDelegate.h ================================================ #import #import @interface AppDelegate : UIResponder @property (nonatomic, strong) UIWindow *window; @end ================================================ FILE: example/ios/example/AppDelegate.m ================================================ #import "AppDelegate.h" #import #import #import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"example" initialProperties:nil]; rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [UIViewController new]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; return YES; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } @end ================================================ FILE: example/ios/example/Base.lproj/LaunchScreen.xib ================================================ ================================================ FILE: example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, { "idiom" : "iphone", "size" : "60x60", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: example/ios/example/Images.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: example/ios/example/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName example CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS NSAppTransportSecurity NSAllowsArbitraryLoads NSExceptionDomains localhost NSExceptionAllowsInsecureHTTPLoads NSBluetoothAlwaysUsageDescription always NSBluetoothPeripheralUsageDescription peripheral NSLocationWhenInUseUsageDescription location when in usage UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance ================================================ FILE: example/ios/example/main.m ================================================ #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: example/ios/example-tvOS/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS NSAppTransportSecurity NSExceptionDomains localhost NSExceptionAllowsInsecureHTTPLoads NSLocationWhenInUseUsageDescription UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance ================================================ FILE: example/ios/example-tvOSTests/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 ================================================ FILE: example/ios/example.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2DCD954D1E0B4F2C00145EB5 /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; }; 83145B14818C64F5DCE4BB55 /* libPods-example-exampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 81FDB34E48327DC2214491D3 /* libPods-example-exampleTests.a */; }; 8DEFC0686C9180B55CAC7D57 /* libPods-example-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A57658E4C5BA5F797506396C /* libPods-example-tvOS.a */; }; DE811789C736F4C583D0CC02 /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C1CC64997001FE3E149AAB19 /* libPods-example.a */; }; FA1301B0BA8E31768777727E /* libPods-example-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7BF1FA09EDAF601D86A70AD6 /* libPods-example-tvOSTests.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = example; }; 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; remoteInfo = "example-tvOS"; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00E356EE1AD99517003FC87E /* exampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* exampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleTests.m; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = ""; }; 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = ""; }; 23C585B7052D8E3B7A5F95A4 /* Pods-example-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOS.release.xcconfig"; path = "Target Support Files/Pods-example-tvOS/Pods-example-tvOS.release.xcconfig"; sourceTree = ""; }; 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "example-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 30A0AFF5950781BF4C453DF0 /* Pods-example-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-example-tvOSTests/Pods-example-tvOSTests.debug.xcconfig"; sourceTree = ""; }; 50F2F58E897B5DF7C17E8055 /* Pods-example-exampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-exampleTests.release.xcconfig"; path = "Target Support Files/Pods-example-exampleTests/Pods-example-exampleTests.release.xcconfig"; sourceTree = ""; }; 607E9FFFF1E7166FFD453206 /* Pods-example-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-example-tvOS/Pods-example-tvOS.debug.xcconfig"; sourceTree = ""; }; 7520FB023C3ABE06CF612657 /* Pods-example-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-example-tvOSTests/Pods-example-tvOSTests.release.xcconfig"; sourceTree = ""; }; 7BF1FA09EDAF601D86A70AD6 /* libPods-example-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 81FDB34E48327DC2214491D3 /* libPods-example-exampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-exampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 8AD4AD2A61DFB716A2759526 /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = ""; }; A57658E4C5BA5F797506396C /* libPods-example-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; C1CC64997001FE3E149AAB19 /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; F3A1C63AD29058936B7AC9F5 /* Pods-example-exampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-exampleTests.debug.xcconfig"; path = "Target Support Files/Pods-example-exampleTests/Pods-example-exampleTests.debug.xcconfig"; sourceTree = ""; }; FBD4AC223C782118043878F4 /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 00E356EB1AD99517003FC87E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 83145B14818C64F5DCE4BB55 /* libPods-example-exampleTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( DE811789C736F4C583D0CC02 /* libPods-example.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8DEFC0686C9180B55CAC7D57 /* libPods-example-tvOS.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( FA1301B0BA8E31768777727E /* libPods-example-tvOSTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 00E356EF1AD99517003FC87E /* exampleTests */ = { isa = PBXGroup; children = ( 00E356F21AD99517003FC87E /* exampleTests.m */, 00E356F01AD99517003FC87E /* Supporting Files */, ); path = exampleTests; sourceTree = ""; }; 00E356F01AD99517003FC87E /* Supporting Files */ = { isa = PBXGroup; children = ( 00E356F11AD99517003FC87E /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; }; 13B07FAE1A68108700A75B9A /* example */ = { isa = PBXGroup; children = ( 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 13B07FB71A68108700A75B9A /* main.m */, ); name = example; sourceTree = ""; }; 2A0C98DA8AA79993EA97AC0E /* Pods */ = { isa = PBXGroup; children = ( FBD4AC223C782118043878F4 /* Pods-example.debug.xcconfig */, 8AD4AD2A61DFB716A2759526 /* Pods-example.release.xcconfig */, F3A1C63AD29058936B7AC9F5 /* Pods-example-exampleTests.debug.xcconfig */, 50F2F58E897B5DF7C17E8055 /* Pods-example-exampleTests.release.xcconfig */, 607E9FFFF1E7166FFD453206 /* Pods-example-tvOS.debug.xcconfig */, 23C585B7052D8E3B7A5F95A4 /* Pods-example-tvOS.release.xcconfig */, 30A0AFF5950781BF4C453DF0 /* Pods-example-tvOSTests.debug.xcconfig */, 7520FB023C3ABE06CF612657 /* Pods-example-tvOSTests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, C1CC64997001FE3E149AAB19 /* libPods-example.a */, 81FDB34E48327DC2214491D3 /* libPods-example-exampleTests.a */, A57658E4C5BA5F797506396C /* libPods-example-tvOS.a */, 7BF1FA09EDAF601D86A70AD6 /* libPods-example-tvOSTests.a */, ); name = Frameworks; sourceTree = ""; }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( ); name = Libraries; sourceTree = ""; }; 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( 13B07FAE1A68108700A75B9A /* example */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* exampleTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, 2A0C98DA8AA79993EA97AC0E /* Pods */, ); indentWidth = 2; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; children = ( 13B07F961A680F5B00A75B9A /* example.app */, 00E356EE1AD99517003FC87E /* exampleTests.xctest */, 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */, 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */, ); name = Products; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 00E356ED1AD99517003FC87E /* exampleTests */ = { isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */; buildPhases = ( B5ECE3C5DBF1CC50EA73077B /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, 3B79C42599EEB3CF8653413F /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( 00E356F51AD99517003FC87E /* PBXTargetDependency */, ); name = exampleTests; productName = exampleTests; productReference = 00E356EE1AD99517003FC87E /* exampleTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 13B07F861A680F5B00A75B9A /* example */ = { isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; buildPhases = ( 95088169E73655D79F7CF6E1 /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 7B5AC7E3CA8F0E54E4E446A2 /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( ); name = example; productName = example; productReference = 13B07F961A680F5B00A75B9A /* example.app */; productType = "com.apple.product-type.application"; }; 2D02E47A1E0B4A5D006451C7 /* example-tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */; buildPhases = ( 4A03753EE45F25E193210CE8 /* [CP] Check Pods Manifest.lock */, FD10A7F122414F3F0027D42C /* Start Packager */, 2D02E4771E0B4A5D006451C7 /* Sources */, 2D02E4781E0B4A5D006451C7 /* Frameworks */, 2D02E4791E0B4A5D006451C7 /* Resources */, 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, ); buildRules = ( ); dependencies = ( ); name = "example-tvOS"; productName = "example-tvOS"; productReference = 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */; productType = "com.apple.product-type.application"; }; 2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */ = { isa = PBXNativeTarget; buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */; buildPhases = ( AE4524233C639EAEE8E2B116 /* [CP] Check Pods Manifest.lock */, 2D02E48C1E0B4A5D006451C7 /* Sources */, 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 2D02E48E1E0B4A5D006451C7 /* Resources */, ); buildRules = ( ); dependencies = ( 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, ); name = "example-tvOSTests"; productName = "example-tvOSTests"; productReference = 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1130; TargetAttributes = { 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; TestTargetID = 13B07F861A680F5B00A75B9A; }; 13B07F861A680F5B00A75B9A = { DevelopmentTeam = CJW62Q77E7; LastSwiftMigration = 1120; }; 2D02E47A1E0B4A5D006451C7 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; }; 2D02E48F1E0B4A5D006451C7 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; TestTargetID = 2D02E47A1E0B4A5D006451C7; }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* example */, 00E356ED1AD99517003FC87E /* exampleTests */, 2D02E47A1E0B4A5D006451C7 /* example-tvOS */, 2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 00E356EC1AD99517003FC87E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F8E1A680F5B00A75B9A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4791E0B4A5D006451C7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48E1E0B4A5D006451C7 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Bundle React Native code and images"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Bundle React Native Code And Images"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; 3B79C42599EEB3CF8653413F /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-example-exampleTests/Pods-example-exampleTests-resources.sh", "${PODS_ROOT}/NearbyMessages/Resources/resources/GNSSharedResources.bundle", "${PODS_ROOT}/NearbyMessages/Resources/resources/ic_expand_more.xcassets", "${PODS_ROOT}/NearbyMessages/Resources/resources/ic_nearby_48pt.xcassets", ); name = "[CP] Copy Pods Resources"; outputPaths = ( "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GNSSharedResources.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example-exampleTests/Pods-example-exampleTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; 4A03753EE45F25E193210CE8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-example-tvOS-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 7B5AC7E3CA8F0E54E4E446A2 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh", "${PODS_ROOT}/NearbyMessages/Resources/resources/GNSSharedResources.bundle", "${PODS_ROOT}/NearbyMessages/Resources/resources/ic_expand_more.xcassets", "${PODS_ROOT}/NearbyMessages/Resources/resources/ic_nearby_48pt.xcassets", ); name = "[CP] Copy Pods Resources"; outputPaths = ( "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GNSSharedResources.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n"; showEnvVarsInLog = 0; }; 95088169E73655D79F7CF6E1 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-example-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; AE4524233C639EAEE8E2B116 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-example-tvOSTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; B5ECE3C5DBF1CC50EA73077B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-example-exampleTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); name = "Start Packager"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; showEnvVarsInLog = 0; }; FD10A7F122414F3F0027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); name = "Start Packager"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 00E356EA1AD99517003FC87E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 00E356F31AD99517003FC87E /* exampleTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 13B07F871A680F5B00A75B9A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E4771E0B4A5D006451C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 2D02E48C1E0B4A5D006451C7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 2DCD954D1E0B4F2C00145EB5 /* exampleTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 13B07F861A680F5B00A75B9A /* example */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2D02E47A1E0B4A5D006451C7 /* example-tvOS */; targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { isa = PBXVariantGroup; children = ( 13B07FB21A68108700A75B9A /* Base */, ); name = LaunchScreen.xib; path = example; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F3A1C63AD29058936B7AC9F5 /* Pods-example-exampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); INFOPLIST_FILE = exampleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-lc++", "$(inherited)", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example"; }; name = Debug; }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 50F2F58E897B5DF7C17E8055 /* Pods-example-exampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = exampleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-lc++", "$(inherited)", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example"; }; name = Release; }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = FBD4AC223C782118043878F4 /* Pods-example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = CJW62Q77E7; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "FB_SONARKIT_ENABLED=1", ); INFOPLIST_FILE = example/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mrousavy.react-native-nearby-example"; PRODUCT_NAME = example; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 8AD4AD2A61DFB716A2759526 /* Pods-example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = CJW62Q77E7; INFOPLIST_FILE = example/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "com.mrousavy.react-native-nearby-example"; PRODUCT_NAME = example; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; 2D02E4971E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 607E9FFFF1E7166FFD453206 /* Pods-example-tvOS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "example-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.example-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Debug; }; 2D02E4981E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 23C585B7052D8E3B7A5F95A4 /* Pods-example-tvOS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "example-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.example-tvOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; name = Release; }; 2D02E4991E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 30A0AFF5950781BF4C453DF0 /* Pods-example-tvOSTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "example-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.example-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; }; name = Debug; }; 2D02E49A1E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7520FB023C3ABE06CF612657 /* Pods-example-tvOSTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "example-tvOSTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.example-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS"; TVOS_DEPLOYMENT_TARGET = 10.1; }; name = Release; }; 83CBBA201A601CBA00E9B192 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 83CBBA211A601CBA00E9B192 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 00E356F61AD99517003FC87E /* Debug */, 00E356F71AD99517003FC87E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = { isa = XCConfigurationList; buildConfigurations = ( 13B07F941A680F5B00A75B9A /* Debug */, 13B07F951A680F5B00A75B9A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 2D02E4971E0B4A5E006451C7 /* Debug */, 2D02E4981E0B4A5E006451C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 2D02E4991E0B4A5E006451C7 /* Debug */, 2D02E49A1E0B4A5E006451C7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = { isa = XCConfigurationList; buildConfigurations = ( 83CBBA201A601CBA00E9B192 /* Debug */, 83CBBA211A601CBA00E9B192 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; } ================================================ FILE: example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme ================================================ ================================================ FILE: example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme ================================================ ================================================ FILE: example/ios/example.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: example/ios/example.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ PreviewsEnabled ================================================ FILE: example/ios/exampleTests/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 ================================================ FILE: example/ios/exampleTests/exampleTests.m ================================================ #import #import #import #import #define TIMEOUT_SECONDS 600 #define TEXT_TO_LOOK_FOR @"Welcome to React" @interface exampleTests : XCTestCase @end @implementation exampleTests - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test { if (test(view)) { return YES; } for (UIView *subview in [view subviews]) { if ([self findSubviewInView:subview matching:test]) { return YES; } } return NO; } - (void)testRendersWelcomeScreen { UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; BOOL foundElement = NO; __block NSString *redboxError = nil; #ifdef DEBUG RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { if (level >= RCTLogLevelError) { redboxError = message; } }); #endif while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { return YES; } return NO; }]; } #ifdef DEBUG RCTSetLogFunction(RCTDefaultLogFunction); #endif XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); } @end ================================================ FILE: example/metro.config.js ================================================ // metro.config.js // // with multiple workarounds for this issue with symlinks: // https://github.com/facebook/metro/issues/1 // // with thanks to @johnryan () // for the pointers to multiple workaround solutions here: // https://github.com/facebook/metro/issues/1#issuecomment-541642857 // // see also this discussion: // https://github.com/brodybits/create-react-native-module/issues/232 const path = require('path') module.exports = { // workaround for an issue with symlinks encountered starting with // metro@0.55 / React Native 0.61 // (not needed with React Native 0.60 / metro@0.54) resolver: { extraNodeModules: new Proxy( {}, { get: (_, name) => path.resolve('.', 'node_modules', name) } ) }, // quick workaround for another issue with symlinks watchFolders: ['.', '..'] } ================================================ FILE: example/package.json ================================================ { "name": "example", "version": "0.0.1", "private": true, "scripts": { "android": "react-native run-android", "ios": "react-native run-ios", "start": "react-native start", "test": "jest", "lint": "eslint ." }, "dependencies": { "react": "16.11.0", "react-native": "0.62.2", "react-native-device-info": "^5.6.1", "react-native-google-nearby-messages": "link:../" }, "devDependencies": { "@babel/core": "^7.10.2", "@babel/runtime": "^7.10.2", "@react-native-community/eslint-config": "^1.1.0", "babel-jest": "^26.0.1", "eslint": "^7.1.0", "jest": "^26.0.1", "metro-react-native-babel-preset": "^0.59.0", "react-test-renderer": "16.11.0" }, "jest": { "preset": "react-native" } } ================================================ FILE: index.ts ================================================ import { NativeModules, NativeEventEmitter, Platform } from 'react-native'; import { useEffect, useState, useCallback, useReducer } from 'react'; const { GoogleNearbyMessages } = NativeModules; const nearbyEventEmitter = new NativeEventEmitter(GoogleNearbyMessages); /** * The error descriptor used to distinguish between error events */ export type ErrorType = 'BLUETOOTH_ERROR' | 'PERMISSION_ERROR' | 'MESSAGE_NO_DATA_ERROR'; /** * Used to distinguish any event emitted by the library. */ export type EventType = 'MESSAGE_FOUND' | 'MESSAGE_LOST' | ErrorType; /** * Discovery Modes for the publish and subscribe API. * * * `'broadcast'`: To discover which devices are nearby, broadcast a pairing code for others to scan. * * * `'scan'`: To discover which devices are nearby, scan for other devices' pairing codes. * * * Use both (`['broadcast', 'scan']`) to combine broadcasting and scanning. */ export type DiscoveryMode = 'broadcast' | 'scan'; /** * Discovery Mediums for the publish and subscribe API. * * * `'ble'`: Use Bluetooth Low Energy as a publish/subscribe medium. * * * `'audio'`: Use Microphone and Speakers as a publish/subscribe medium. * * * Use both (`['ble', 'audio']`) to combine bluetooth and audio. * * Note that on Android the values `'bluetooth'`, `'none'` and `'default'` are also accepted, but aren't guaranteed to work. */ export type DiscoveryMedium = 'ble' | 'audio'; /** * The config used for the Nearby API connect function. */ export interface NearbyConfig { /** * The Google API key to use (only required on iOS) - @see https://console.developers.google.com/flows/enableapi?apiid=copresence&keyType=CLIENT_SIDE_IOS&reusekey=true */ apiKey?: string; /** * _(optional)_ The modes used for discovering nearby devices (e.g.: Bluetooth Pairing codes). When `undefined`, the default discovery modes are used. * * @default ['broadcast', 'scan'] */ discoveryModes?: DiscoveryMode[]; /** * _(optional)_ The mediums used for publishing and subscribing. When `undefined`, the default discovery mediums are used. * * Note that on Android the values `'bluetooth'`, `'none'` and `'default'` are also accepted, but aren't guaranteed to work. * * @default ['ble'] */ discoveryMediums?: DiscoveryMedium[]; } interface BridgeMessageEvent { message?: string; } interface BridgeErrorEvent { message?: string; } /** * Initialize and connect the Google Nearby Messages API * @param config The Nearby API configuration object to use. Default: `{ discoveryModes: ['broadcast', 'scan'], discoveryMediums: ['ble'] }` * @returns An unsubscriber function to disconnect the Google Nearby Messages API * @example * const disconnect = await connect(API_KEY, ['broadcast', 'scan'], ['ble', 'audio']); * // ... * disconnect(); */ export async function connect(config: NearbyConfig): Promise<() => void> { let { apiKey, discoveryMediums, discoveryModes } = config; if (discoveryModes == null || discoveryModes.length === 0) { discoveryModes = ['broadcast', 'scan']; } if (discoveryMediums == null || discoveryMediums.length === 0) { discoveryMediums = ['ble']; } if (Platform.OS === 'ios') { if (apiKey == null) throw new Error('API Key is required on iOS!'); await GoogleNearbyMessages.connect(apiKey, discoveryModes, discoveryMediums); } else { await GoogleNearbyMessages.connect(discoveryModes, discoveryMediums); } return () => GoogleNearbyMessages.disconnect(); } /** * Disconnect the Google Nearby Messages API. Also removes any existing subscriptions or publications. */ export function disconnect(): void { GoogleNearbyMessages.disconnect(); } /** * Subscribe to nearby message events. Use onMessageFound and onMessageLost to receive callbacks for found and lost messages. Always call unsubscribe() to stop publishing. * @param onMessageFound (Optional) A function to call when a new message has been found * @param onMessageLost (Optional) A function to call when an existing message has been lost * @returns A function to unsubscribe the subscription and remove the event emitters if supplied. * @example * const unsubscribe = await subscribe( * (m) => console.log(`found: ${m}`), * (m) => console.log(`lost: ${m}`) * ); * // ... * unsubscribe(); */ export async function subscribe(onMessageFound?: (message?: string) => void, onMessageLost?: (message?: string) => void): Promise<() => void> { await GoogleNearbyMessages.subscribe(); const onMessageFoundUnsubscribe = onMessageFound ? onEvent('MESSAGE_FOUND', onMessageFound) : undefined; const onMessageLostUnsubscribe = onMessageLost ? onEvent('MESSAGE_LOST', onMessageLost) : undefined; return () => { if (onMessageFoundUnsubscribe) onMessageFoundUnsubscribe(); if (onMessageLostUnsubscribe) onMessageLostUnsubscribe(); unsubscribe(); }; } /** * Unsubscribe the current subscription. Also removes all event listeners for `MESSAGE_FOUND` and `MESSAGE_LOST`. */ export function unsubscribe(): void { GoogleNearbyMessages.unsubscribe(); removeAllListeners('MESSAGE_FOUND'); removeAllListeners('MESSAGE_LOST'); } /** * Publish/Broadcast a new message. Always call unpublish() to stop publishing. * @param message The message to broadcast. * @returns An unsubscriber function to unpublish the currently published message. * @example * const unpublish = await publish('test'); * // ... * await unpublish(); */ export async function publish(message: string): Promise<() => Promise> { await GoogleNearbyMessages.publish(message); return () => unpublish(); } /** * Stop publishing the last message. Can only call after @see publish has been called. */ export function unpublish(): Promise { return GoogleNearbyMessages.unpublish(); } /** * Checks if the app is allowed to use the Bluetooth API. * * **On Android**, this function checks if both `BLUETOOTH` and `BLUETOOTH_ADMIN` permissions are granted in the ContextCompat. * * **On iOS**, this function checks if the User has given Bluetooth Permission using the CoreBluetooth API (`CBManager.authorization`). If not yet asked, a "grant permission?" dialog will pop up. */ export function checkBluetoothPermission(): Promise { return GoogleNearbyMessages.checkBluetoothPermission(); } /** * Checks if the device supports the Bluetooth operations required by Google Nearby Messages (BLE Publishing and Subscribing) * * **On Android**, this function checks if a `BluetoothAdapter` can be found, and if the Google Play Services are available (required for Google Nearby API). * * **On iOS**, this function powers on the `CBCentralManager` and returns `true` if it was successfully turned on. If no callback was sent within `10` seconds, a timeout error will be thrown. */ export function checkBluetoothAvailability(): Promise { return GoogleNearbyMessages.checkBluetoothAvailability(); } /** * Subscribe to any errors. * @param callback The function to call when an error occurs. `kind` is the Error Type. e.g.: User turns Bluetooth off, callback gets called with ('BLUETOOTH_ERROR', "Bluetooth is powered off/unavailable!"). */ export function addOnErrorListener(callback: (kind: ErrorType, message?: string) => void): () => void { const listeners = [ onErrorEvent('BLUETOOTH_ERROR', (m) => callback('BLUETOOTH_ERROR', m)), onErrorEvent('PERMISSION_ERROR', (m) => callback('PERMISSION_ERROR', m)), onErrorEvent('MESSAGE_NO_DATA_ERROR', (m) => callback('MESSAGE_NO_DATA_ERROR', m)), ]; return () => { listeners.map(l => l()); }; } function onEvent(event: EventType, callback: (message?: string) => void): () => void { const subscription = nearbyEventEmitter.addListener(event, (data: BridgeMessageEvent) => callback(data.message)); return () => subscription.remove(); } function onErrorEvent(event: ErrorType, callback: (message?: string) => void): () => void { const subscription = nearbyEventEmitter.addListener(event, (data: BridgeErrorEvent) => callback(data.message)); return () => subscription.remove(); } function removeAllListeners(event: EventType): void { nearbyEventEmitter.removeAllListeners(event); } // MARK: React Hooks /** * The current status of the Google Nearby API (used in hooks) */ export type NearbyStatus = 'disconnected' | 'connecting' | 'published' | 'subscribed' | 'error' | 'denied' | 'unavailable'; /** * The state of a current Subscription. (used in hooks) */ export interface SubscriptionState { nearbyMessages: string[]; nearbyStatus: NearbyStatus; } /** * The state of a current Subscription-Search. (used in hooks) */ export interface SearchState { isNearby: boolean; nearbyStatus: NearbyStatus; } /** * Publish a simple message and return the current status of the nearby API. * * Also calls `checkBluetoothAvailability()` and `checkBluetoothPermission()`. * @param config The Nearby API configuration object to use. **Warning: Use `useMemo(..)` for the Object, otherwise you get an infinite loop of re-renders!** * @param message The message to publish * @returns The current status of the Nearby API * @example * export default function App() { * const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); * const nearbyStatus = useNearbyPublication(nearbyConfig, 'Hello from Nearby!'); * // ... * } */ export function useNearbyPublication(config: NearbyConfig, message: string): NearbyStatus { const [nearbyStatus, setNearbyStatus] = useState('connecting'); useEffect(() => { const start = async () => { try { const available = await checkBluetoothAvailability(); if (!available) { setNearbyStatus('unavailable'); return; } const permission = await checkBluetoothPermission(); if (!permission) { setNearbyStatus('denied'); return; } await connect(config); await publish(message); setNearbyStatus('published'); } catch (e) { setNearbyStatus('error'); } }; start(); const removeListener = addOnErrorListener((kind, message) => { console.log(`[NEARBY] Error: ${kind}: ${message}`); setNearbyStatus('error'); }); return () => { removeListener(); unpublish(); disconnect(); setNearbyStatus('disconnected'); }; }, [setNearbyStatus, config, message, setNearbyStatus]); return nearbyStatus; } interface ReducerPayload { addMessages?: string[]; removeMessages?: string[]; } function reducer(messages: string[], payload: ReducerPayload): string[] { const removeIndices = payload.removeMessages?.map((removeMessage) => messages.findIndex((message) => removeMessage === message)); removeIndices?.forEach((i) => { if (i > -1) messages.splice(i, 1); }); payload.addMessages?.forEach((u) => { if (messages.indexOf(u) === -1) messages.push(u); }); return [...messages]; } /** * Subscribe to nearby messages and return an instance of the `SubscriptionState` object. * * Also calls `checkBluetoothAvailability()` and `checkBluetoothPermission()`. * @param config The Nearby API configuration object to use. **Warning: Use `useMemo(..)` for the Object, otherwise you get an infinite loop of re-renders!** * @returns A state of all nearby messages * @example * export default function App() { * const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); * const { nearbyMessages, nearbyStatus } = useNearbySubscription(nearbyConfig); * return ( * {item}} * /> * ); * } */ export function useNearbySubscription(config: NearbyConfig): SubscriptionState { const [nearbyMessages, dispatch] = useReducer(reducer, []); const [nearbyStatus, setNearbyStatus] = useState('connecting'); const messageFound = useCallback((message) => { dispatch({ addMessages: [message] }); }, [dispatch]); const messageLost = useCallback((message) => { dispatch({ removeMessages: [message] }); }, [dispatch]); useEffect(() => { const start = async () => { try { const available = await checkBluetoothAvailability(); if (!available) { setNearbyStatus('unavailable'); return; } const permission = await checkBluetoothPermission(); if (!permission) { setNearbyStatus('denied'); return; } await connect(config); await subscribe(messageFound, messageLost); setNearbyStatus('subscribed'); } catch (e) { setNearbyStatus('error'); } }; start(); const removeListener = addOnErrorListener((kind, message) => { console.log(`[NEARBY] Error: ${kind}: ${message}`); setNearbyStatus('error'); }); return () => { removeListener(); unpublish(); disconnect(); setNearbyStatus('disconnected'); }; }, [config, messageFound, messageLost, setNearbyStatus]); return { nearbyMessages, nearbyStatus }; } /** * Search for a specific message using the nearby messages API. Returns an instance of the `SearchState` interface. * * Also calls `checkBluetoothAvailability()` and `checkBluetoothPermission()`. * @param config The Nearby API configuration object to use. **Warning: Use `useMemo(..)` for the Object, otherwise you get an infinite loop of re-renders!** * @param searchFor The string to perform the nearby search for * @returns A state whether the message has been found or not. * @example * export default function App() { * const nearbyConfig = useMemo(() => ({ apiKey: GOOGLE_API_KEY }), []); * const { isNearby, nearbyStatus } = useNearbySearch(nearbyConfig, 'iPhone 11'); * return ( * {isNearby ? 'iPhone 11 is nearby!' : 'iPhone 11 is far, far away.'} * ); * } */ export function useNearbySearch(config: NearbyConfig, searchFor: string): SearchState { const [isNearby, setIsNearby] = useState(false); const [nearbyStatus, setNearbyStatus] = useState('connecting'); const messageFound = useCallback((message) => { if (message === searchFor) setIsNearby(true); }, [searchFor, setIsNearby]); const messageLost = useCallback((message) => { if (message === searchFor) setIsNearby(false); }, [searchFor, setIsNearby]); useEffect(() => { const start = async () => { try { const available = await checkBluetoothAvailability(); if (!available) { setNearbyStatus('unavailable'); return; } const permission = await checkBluetoothPermission(); if (!permission) { setNearbyStatus('denied'); return; } await connect(config); await subscribe(messageFound, messageLost); setNearbyStatus('subscribed'); } catch (e) { setNearbyStatus('error'); } }; start(); const removeListener = addOnErrorListener((kind, message) => { console.log(`[NEARBY] Error: ${kind}: ${message}`); setNearbyStatus('error'); }); return () => { removeListener(); unsubscribe(); disconnect(); setNearbyStatus('disconnected'); }; }, [config, messageFound, messageLost, setNearbyStatus]); return { isNearby, nearbyStatus }; } /** * Add an error listener which automatically disposes when the component unmounts. * @param callback The function to call when an error occurs. */ export function useNearbyErrorCallback(callback: (kind: ErrorType, message?: string) => void) { useEffect(() => addOnErrorListener(callback), [callback]) } ================================================ FILE: ios/GoogleNearbyMessages.swift ================================================ // // GoogleNearbyMessages.swift // GoogleNearbyMessages // // Created by Marc Rousavy on 02.06.20. // Copyright © 2020 Facebook. All rights reserved. // import Foundation import CoreBluetooth let defaultDiscoveryModes: GNSDiscoveryMode = [.broadcast, .scan] let defaultDiscoveryMediums: GNSDiscoveryMediums = .BLE @objc(NearbyMessages) class NearbyMessages: RCTEventEmitter { enum EventType: String, CaseIterable { case MESSAGE_FOUND case MESSAGE_LOST case BLUETOOTH_ERROR case PERMISSION_ERROR case MESSAGE_NO_DATA_ERROR } enum GoogleNearbyMessagesError: Error, LocalizedError { case permissionError(permissionName: String) case runtimeError(message: String) public var errorDescription: String? { switch self { case .permissionError(permissionName: let permissionName): return "Permission has been denied! Denied Permission: \(permissionName). Make sure to include NSBluetoothPeripheralUsageDescription in your Info.plist!" case .runtimeError(message: let message): return message } } } private var messageManager: GNSMessageManager? = nil private var currentPublication: GNSPublication? = nil private var currentSubscription: GNSSubscription? = nil private var discoveryModes: GNSDiscoveryMode? = nil private var discoveryMediums: GNSDiscoveryMediums? = nil // workaround objects for checkBluetoothAvailability private var tempBluetoothManager: CBCentralManager? = nil private var tempBluetoothManagerDelegate: CBCentralManagerDelegate? = nil private var didCallback = false @objc(connect:discoveryModes:discoveryMediums:resolver:rejecter:) func connect(_ apiKey: String, discoveryModes: Array, discoveryMediums: Array, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { print("GNM_BLE: Connecting...") //GNSMessageManager.setDebugLoggingEnabled(true) self.discoveryMediums = parseDiscoveryMediums(discoveryMediums) self.discoveryModes = parseDiscoveryModes(discoveryModes) self.messageManager = GNSMessageManager(apiKey: apiKey, paramsBlock: { (params: GNSMessageManagerParams?) in guard let params = params else { return } params.microphonePermissionErrorHandler = { (hasError: Bool) in if (hasError) { self.sendEvent(withName: EventType.PERMISSION_ERROR.rawValue, body: [ "message": "Microphone Permission denied!" ]) } } params.bluetoothPowerErrorHandler = { (hasError: Bool) in if (hasError) { self.sendEvent(withName: EventType.BLUETOOTH_ERROR.rawValue, body: [ "message": "Bluetooth is powered off/unavailable!" ]) } } params.bluetoothPermissionErrorHandler = { (hasError: Bool) in if (hasError) { self.sendEvent(withName: EventType.PERMISSION_ERROR.rawValue, body: [ "message": "Bluetooth Permission denied!" ]) } } }) resolve(nil) } @objc func disconnect() -> Void { print("GNM_BLE: Disconnecting...") // TODO: is setting nil enough garbage collection? no need for CFRetain, CFRelease, or CFAutorelease? self.currentSubscription = nil self.currentPublication = nil self.messageManager = nil } @objc(publish:resolver:rejecter:) func publish(_ message: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { print("GNM_BLE: Publishing...") do { if (self.messageManager == nil) { throw GoogleNearbyMessagesError.runtimeError(message: "Google Nearby Messages is not connected! Call connect() before any other calls.") } self.currentPublication = self.messageManager!.publication(with: GNSMessage(content: message.data(using: .utf8)), paramsBlock: { (params: GNSPublicationParams?) in guard let params = params else { return } params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in guard let params = params else { return } params.discoveryMediums = self.discoveryMediums ?? defaultDiscoveryMediums params.discoveryMode = self.discoveryModes ?? defaultDiscoveryModes }) }) resolve(nil) } catch { reject("GOOGLE_NEARBY_MESSAGES_ERROR_PUBLISH", error.localizedDescription, error) } } @objc(subscribe:rejecter:) func unpublish(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { print("GNM_BLE: Unpublishing...") self.currentPublication = nil resolve(nil) } @objc(subscribe:rejecter:) func subscribe(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { print("GNM_BLE: Subscribing...") do { if (self.messageManager == nil) { throw GoogleNearbyMessagesError.runtimeError(message: "Google Nearby Messages is not connected! Call connect() before any other calls.") } self.currentSubscription = self.messageManager!.subscription( messageFoundHandler: { (message: GNSMessage?) in guard let data = message?.content else { self.sendEvent(withName: EventType.MESSAGE_NO_DATA_ERROR.rawValue, body: [ "message": "Message does not have any Data!" ] ) return } print("GNM_BLE: Found message!") self.sendEvent(withName: EventType.MESSAGE_FOUND.rawValue, body: [ "message": String(data: data, encoding: .utf8) ]); }, messageLostHandler: { (message: GNSMessage?) in guard let data = message?.content else { self.sendEvent(withName: EventType.MESSAGE_NO_DATA_ERROR.rawValue, body: [ "message": "Message does not have any Data!" ] ) return } print("GNM_BLE: Lost message!") self.sendEvent(withName: EventType.MESSAGE_LOST.rawValue, body: [ "message": String(data: data, encoding: .utf8) ]); }, paramsBlock: { (params: GNSSubscriptionParams?) in guard let params = params else { return } params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in guard let params = params else { return } params.discoveryMediums = self.discoveryMediums ?? defaultDiscoveryMediums params.discoveryMode = self.discoveryModes ?? defaultDiscoveryModes }) }) resolve(nil) } catch { reject("GOOGLE_NEARBY_MESSAGES_ERROR_SUBSCRIBE", error.localizedDescription, error) } } @objc func unsubscribe() -> Void { print("GNM_BLE: Unsubscribing...") self.currentSubscription = nil } @objc(checkBluetoothPermission:rejecter:) func checkBluetoothPermission(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { print("GNM_BLE: Checking Bluetooth Permissions...") let hasBluetoothPermission = self.hasBluetoothPermission() resolve(hasBluetoothPermission) } @objc(checkBluetoothAvailability:rejecter:) func checkBluetoothAvailability(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void { if (self.tempBluetoothManager != nil || self.tempBluetoothManagerDelegate != nil) { let error = GoogleNearbyMessagesError.runtimeError(message: "Another Bluetooth availability check is already in progress!") reject("GOOGLE_NEARBY_MESSAGES_CHECKBLUETOOTH_ERROR", error.localizedDescription, error) return } self.didCallback = false class BluetoothManagerDelegate : NSObject, CBCentralManagerDelegate { private var promiseResolver: RCTPromiseResolveBlock private weak var parentReference: NearbyMessages? init(resolver: @escaping RCTPromiseResolveBlock, parentReference: NearbyMessages) { self.promiseResolver = resolver self.parentReference = parentReference } func centralManagerDidUpdateState(_ central: CBCentralManager) { guard let parent = parentReference else { return } if (!parent.didCallback) { parent.didCallback = true print("GNM_BLE: CBCentralManager did update state with \(central.state.rawValue)") self.promiseResolver(central.state == .poweredOn) parent.tempBluetoothManager = nil parent.tempBluetoothManagerDelegate = nil } } } tempBluetoothManagerDelegate = BluetoothManagerDelegate(resolver: resolve, parentReference: self) tempBluetoothManager = CBCentralManager(delegate: tempBluetoothManagerDelegate, queue: nil) DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(10)) { if (!self.didCallback) { self.didCallback = true let error = GoogleNearbyMessagesError.runtimeError(message: "The CBCentralManager (Bluetooth) did not power on after 10 seconds. Cancelled execution.") reject("GOOGLE_NEARBY_MESSAGES_CHECKBLUETOOTH_TIMEOUT", error.localizedDescription, error) self.tempBluetoothManager = nil self.tempBluetoothManagerDelegate = nil } } } func hasBluetoothPermission() -> Bool { if #available(iOS 13.1, *) { return CBCentralManager.authorization == .allowedAlways } else if #available(iOS 13.0, *) { return CBCentralManager().authorization == .allowedAlways } // Before iOS 13, Bluetooth permissions are not required return true } override func supportedEvents() -> [String]! { return EventType.allCases.map { (event: EventType) -> String in return event.rawValue } } @objc override static func requiresMainQueueSetup() -> Bool { // init on main thread, audio doesn't work on background thread. return true } // Called when the UIView gets destroyed (e.g. App reload) @objc override func invalidate() { print("GNM_BLE: invalidate") disconnect() } func parseDiscoveryMediums(_ discoveryMediums: Array) -> GNSDiscoveryMediums { var mediums = GNSDiscoveryMediums() for medium in discoveryMediums { let mediumLower = medium.lowercased switch (mediumLower) { case "ble": mediums.insert(.BLE) break case "audio": mediums.insert(.audio) break default: break } } return mediums.isEmpty ? defaultDiscoveryMediums : mediums } func parseDiscoveryModes(_ discoveryModes: Array) -> GNSDiscoveryMode { var modes = GNSDiscoveryMode() for mode in discoveryModes { let modeLower = mode.lowercased switch (modeLower) { case "broadcast": modes.insert(.broadcast) break case "scan": modes.insert(.scan) break default: break } } return modes.isEmpty ? defaultDiscoveryModes : modes } } ================================================ FILE: ios/GoogleNearbyMessages.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ B89424862486AF5900F22052 /* GoogleNearbyMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = B89424852486AF5900F22052 /* GoogleNearbyMessages.swift */; }; B89426132486B5E200F22052 /* GoogleNearbyMessagesBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = B89426122486B5E200F22052 /* GoogleNearbyMessagesBridge.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 58B511D91A9E6C8500147676 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = "include/$(PRODUCT_NAME)"; dstSubfolderSpec = 16; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 134814201AA4EA6300B7C361 /* libGoogleNearbyMessages.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGoogleNearbyMessages.a; sourceTree = BUILT_PRODUCTS_DIR; }; B89424842486AF5800F22052 /* GoogleNearbyMessagesBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoogleNearbyMessagesBridge.h; sourceTree = ""; }; B89424852486AF5900F22052 /* GoogleNearbyMessages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleNearbyMessages.swift; sourceTree = ""; }; B894248A2486B0CC00F22052 /* RCTImageLoader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageLoader.h; sourceTree = ""; }; B894248B2486B0CC00F22052 /* RCTImageStoreManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageStoreManager.h; sourceTree = ""; }; B894248C2486B0CC00F22052 /* RCTPlatform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPlatform.h; sourceTree = ""; }; B894248D2486B0CC00F22052 /* RCTImageEditingManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTImageEditingManager.m; sourceTree = ""; }; B894248E2486B0CC00F22052 /* CoreModulesPlugins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreModulesPlugins.h; sourceTree = ""; }; B894248F2486B0CC00F22052 /* BUCK */ = {isa = PBXFileReference; lastKnownFileType = text; path = BUCK; sourceTree = ""; }; B89424902486B0CC00F22052 /* RCTExceptionsManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTExceptionsManager.h; sourceTree = ""; }; B89424912486B0CC00F22052 /* RCTPlatform.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTPlatform.mm; sourceTree = ""; }; B89424922486B0CC00F22052 /* RCTImageEditingManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageEditingManager.h; sourceTree = ""; }; B89424932486B0CC00F22052 /* RCTExceptionsManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTExceptionsManager.mm; sourceTree = ""; }; B89424942486B0CC00F22052 /* RCTImageLoader.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTImageLoader.mm; sourceTree = ""; }; B89424952486B0CC00F22052 /* RCTImageStoreManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTImageStoreManager.m; sourceTree = ""; }; B89424962486B0CC00F22052 /* CoreModulesPlugins.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CoreModulesPlugins.mm; sourceTree = ""; }; B89424972486B0CC00F22052 /* React-CoreModules.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = "React-CoreModules.podspec"; sourceTree = ""; }; B89424992486B0CC00F22052 /* RCTUIUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTUIUtils.m; sourceTree = ""; }; B894249A2486B0CC00F22052 /* RCTUIUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUIUtils.h; sourceTree = ""; }; B894249C2486B0CC00F22052 /* RCTNativeModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTNativeModule.mm; sourceTree = ""; }; B894249D2486B0CC00F22052 /* RCTCxxUtils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTCxxUtils.mm; sourceTree = ""; }; B894249E2486B0CC00F22052 /* RCTNativeModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTNativeModule.h; sourceTree = ""; }; B894249F2486B0CC00F22052 /* RCTCxxMethod.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTCxxMethod.h; sourceTree = ""; }; B89424A02486B0CC00F22052 /* RCTCxxModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTCxxModule.mm; sourceTree = ""; }; B89424A12486B0CC00F22052 /* DispatchMessageQueueThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DispatchMessageQueueThread.h; sourceTree = ""; }; B89424A22486B0CC00F22052 /* RCTCxxUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTCxxUtils.h; sourceTree = ""; }; B89424A32486B0CC00F22052 /* RCTCxxMethod.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTCxxMethod.mm; sourceTree = ""; }; B89424A42486B0CC00F22052 /* RCTCxxModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTCxxModule.h; sourceTree = ""; }; B89424A62486B0CC00F22052 /* RCTObjcExecutor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTObjcExecutor.h; sourceTree = ""; }; B89424A72486B0CC00F22052 /* NSDataBigString.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NSDataBigString.mm; sourceTree = ""; }; B89424A82486B0CC00F22052 /* RCTCxxBridge.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTCxxBridge.mm; sourceTree = ""; }; B89424A92486B0CC00F22052 /* JSCExecutorFactory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSCExecutorFactory.h; sourceTree = ""; }; B89424AA2486B0CC00F22052 /* NSDataBigString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSDataBigString.h; sourceTree = ""; }; B89424AB2486B0CC00F22052 /* RCTMessageThread.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTMessageThread.mm; sourceTree = ""; }; B89424AC2486B0CC00F22052 /* RCTMessageThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMessageThread.h; sourceTree = ""; }; B89424AD2486B0CC00F22052 /* RCTCxxBridgeDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTCxxBridgeDelegate.h; sourceTree = ""; }; B89424AE2486B0CC00F22052 /* JSCExecutorFactory.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = JSCExecutorFactory.mm; sourceTree = ""; }; B89424AF2486B0CC00F22052 /* RCTObjcExecutor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTObjcExecutor.mm; sourceTree = ""; }; B89424B02486B0CC00F22052 /* third-party.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "third-party.xcconfig"; sourceTree = ""; }; B89424B22486B0CC00F22052 /* RCTInspector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTInspector.h; sourceTree = ""; }; B89424B32486B0CC00F22052 /* RCTInspector.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTInspector.mm; sourceTree = ""; }; B89424B42486B0CC00F22052 /* RCTInspectorPackagerConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTInspectorPackagerConnection.m; sourceTree = ""; }; B89424B52486B0CC00F22052 /* RCTInspectorPackagerConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTInspectorPackagerConnection.h; sourceTree = ""; }; B89424B72486B0CC00F22052 /* RCTPackagerClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPackagerClient.h; sourceTree = ""; }; B89424B82486B0CC00F22052 /* RCTPackagerConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPackagerConnection.h; sourceTree = ""; }; B89424B92486B0CC00F22052 /* RCTInspectorDevServerHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTInspectorDevServerHelper.h; sourceTree = ""; }; B89424BA2486B0CC00F22052 /* RCTDevLoadingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDevLoadingView.m; sourceTree = ""; }; B89424BB2486B0CC00F22052 /* RCTDevMenu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDevMenu.m; sourceTree = ""; }; B89424BC2486B0CC00F22052 /* RCTInspectorDevServerHelper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTInspectorDevServerHelper.mm; sourceTree = ""; }; B89424BD2486B0CC00F22052 /* RCTPackagerClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPackagerClient.m; sourceTree = ""; }; B89424BE2486B0CC00F22052 /* RCTPackagerConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTPackagerConnection.mm; sourceTree = ""; }; B89424BF2486B0CC00F22052 /* RCTDevLoadingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDevLoadingView.h; sourceTree = ""; }; B89424C02486B0CC00F22052 /* RCTDevMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDevMenu.h; sourceTree = ""; }; B89424C12486B0CC00F22052 /* React-RCTFabric.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = "React-RCTFabric.podspec"; sourceTree = ""; }; B89424C32486B0CC00F22052 /* RCTImageResponseObserverProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageResponseObserverProxy.h; sourceTree = ""; }; B89424C42486B0CC00F22052 /* RCTSurfaceRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceRegistry.h; sourceTree = ""; }; B89424C62486B0CC00F22052 /* UIView+ComponentViewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+ComponentViewProtocol.h"; sourceTree = ""; }; B89424C72486B0CC00F22052 /* RCTMountingManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMountingManager.h; sourceTree = ""; }; B89424C82486B0CC00F22052 /* RCTMountingManagerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMountingManagerDelegate.h; sourceTree = ""; }; B89424C92486B0CC00F22052 /* RCTComponentViewFactory.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTComponentViewFactory.mm; sourceTree = ""; }; B89424CA2486B0CC00F22052 /* RCTComponentViewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponentViewProtocol.h; sourceTree = ""; }; B89424CB2486B0CC00F22052 /* RCTMountingManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTMountingManager.mm; sourceTree = ""; }; B89424CE2486B0CC00F22052 /* RCTPullToRefreshViewComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPullToRefreshViewComponentView.h; sourceTree = ""; }; B89424CF2486B0CC00F22052 /* RCTEnhancedScrollView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTEnhancedScrollView.mm; sourceTree = ""; }; B89424D02486B0CC00F22052 /* RCTPullToRefreshViewComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTPullToRefreshViewComponentView.mm; sourceTree = ""; }; B89424D12486B0CC00F22052 /* RCTEnhancedScrollView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTEnhancedScrollView.h; sourceTree = ""; }; B89424D22486B0CC00F22052 /* RCTScrollViewComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTScrollViewComponentView.mm; sourceTree = ""; }; B89424D32486B0CC00F22052 /* RCTScrollViewComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollViewComponentView.h; sourceTree = ""; }; B89424D52486B0CC00F22052 /* RCTSliderComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSliderComponentView.h; sourceTree = ""; }; B89424D62486B0CC00F22052 /* RCTSliderComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSliderComponentView.mm; sourceTree = ""; }; B89424D82486B0CC00F22052 /* RCTImageComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTImageComponentView.mm; sourceTree = ""; }; B89424D92486B0CC00F22052 /* RCTImageComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageComponentView.h; sourceTree = ""; }; B89424DB2486B0CC00F22052 /* RCTActivityIndicatorViewComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTActivityIndicatorViewComponentView.h; sourceTree = ""; }; B89424DC2486B0CC00F22052 /* RCTActivityIndicatorViewComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTActivityIndicatorViewComponentView.mm; sourceTree = ""; }; B89424DE2486B0CC00F22052 /* RCTUnimplementedNativeComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTUnimplementedNativeComponentView.mm; sourceTree = ""; }; B89424DF2486B0CC00F22052 /* RCTUnimplementedNativeComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUnimplementedNativeComponentView.h; sourceTree = ""; }; B89424E12486B0CC00F22052 /* RCTViewComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTViewComponentView.h; sourceTree = ""; }; B89424E22486B0CC00F22052 /* RCTViewComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTViewComponentView.mm; sourceTree = ""; }; B89424E42486B0CC00F22052 /* RCTSwitchComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSwitchComponentView.mm; sourceTree = ""; }; B89424E52486B0CC00F22052 /* RCTSwitchComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSwitchComponentView.h; sourceTree = ""; }; B89424E72486B0CC00F22052 /* RCTRootComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootComponentView.h; sourceTree = ""; }; B89424E82486B0CC00F22052 /* RCTRootComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTRootComponentView.mm; sourceTree = ""; }; B89424EA2486B0CC00F22052 /* RCTParagraphComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTParagraphComponentView.mm; sourceTree = ""; }; B89424EB2486B0CC00F22052 /* RCTParagraphComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTParagraphComponentView.h; sourceTree = ""; }; B89424ED2486B0CC00F22052 /* RCTFabricModalHostViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFabricModalHostViewController.mm; sourceTree = ""; }; B89424EE2486B0CC00F22052 /* RCTModalHostViewComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModalHostViewComponentView.h; sourceTree = ""; }; B89424EF2486B0CC00F22052 /* RCTModalHostViewComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTModalHostViewComponentView.mm; sourceTree = ""; }; B89424F02486B0CC00F22052 /* RCTFabricModalHostViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFabricModalHostViewController.h; sourceTree = ""; }; B89424F12486B0CC00F22052 /* RCTComponentViewRegistry.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTComponentViewRegistry.mm; sourceTree = ""; }; B89424F22486B0CC00F22052 /* UIView+ComponentViewProtocol.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UIView+ComponentViewProtocol.mm"; sourceTree = ""; }; B89424F32486B0CC00F22052 /* RCTComponentViewFactory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponentViewFactory.h; sourceTree = ""; }; B89424F42486B0CC00F22052 /* RCTComponentViewRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponentViewRegistry.h; sourceTree = ""; }; B89424F52486B0CC00F22052 /* RCTPrimitives.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPrimitives.h; sourceTree = ""; }; B89424F62486B0CC00F22052 /* RCTSurfacePresenter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfacePresenter.mm; sourceTree = ""; }; B89424F82486B0CC00F22052 /* RCTFabricSurfaceHostingProxyRootView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFabricSurfaceHostingProxyRootView.mm; sourceTree = ""; }; B89424F92486B0CC00F22052 /* RCTFabricSurface.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFabricSurface.mm; sourceTree = ""; }; B89424FA2486B0CC00F22052 /* RCTFabricSurfaceHostingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFabricSurfaceHostingView.h; sourceTree = ""; }; B89424FB2486B0CC00F22052 /* RCTFabricSurface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFabricSurface.h; sourceTree = ""; }; B89424FC2486B0CC00F22052 /* RCTFabricSurfaceHostingProxyRootView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFabricSurfaceHostingProxyRootView.h; sourceTree = ""; }; B89424FD2486B0CC00F22052 /* RCTFabricSurfaceHostingView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFabricSurfaceHostingView.mm; sourceTree = ""; }; B89424FF2486B0CC00F22052 /* RuntimeEventBeat.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RuntimeEventBeat.mm; sourceTree = ""; }; B89425002486B0CC00F22052 /* MainRunLoopEventBeat.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MainRunLoopEventBeat.mm; sourceTree = ""; }; B89425012486B0CC00F22052 /* RuntimeEventBeat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RuntimeEventBeat.h; sourceTree = ""; }; B89425022486B0CC00F22052 /* MainRunLoopEventBeat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainRunLoopEventBeat.h; sourceTree = ""; }; B89425032486B0CC00F22052 /* RCTGenericDelegateSplitter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTGenericDelegateSplitter.mm; sourceTree = ""; }; B89425042486B0CC00F22052 /* RCTGenericDelegateSplitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTGenericDelegateSplitter.h; sourceTree = ""; }; B89425052486B0CC00F22052 /* RCTImageResponseDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageResponseDelegate.h; sourceTree = ""; }; B89425062486B0CD00F22052 /* RCTTouchableComponentViewProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTouchableComponentViewProtocol.h; sourceTree = ""; }; B89425072486B0CD00F22052 /* RCTConversions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTConversions.h; sourceTree = ""; }; B89425082486B0CD00F22052 /* RCTSurfacePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfacePresenter.h; sourceTree = ""; }; B89425092486B0CD00F22052 /* RCTImageResponseObserverProxy.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTImageResponseObserverProxy.mm; sourceTree = ""; }; B894250A2486B0CD00F22052 /* RCTSurfaceRegistry.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceRegistry.mm; sourceTree = ""; }; B894250B2486B0CD00F22052 /* RCTScheduler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScheduler.h; sourceTree = ""; }; B894250C2486B0CD00F22052 /* RCTSurfaceTouchHandler.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceTouchHandler.mm; sourceTree = ""; }; B894250D2486B0CD00F22052 /* RCTSurfaceTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceTouchHandler.h; sourceTree = ""; }; B894250E2486B0CD00F22052 /* RCTScheduler.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTScheduler.mm; sourceTree = ""; }; B89425102486B0CD00F22052 /* RCTFPSGraph.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTFPSGraph.m; sourceTree = ""; }; B89425112486B0CD00F22052 /* RCTProfileTrampoline-arm.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = "RCTProfileTrampoline-arm.S"; sourceTree = ""; }; B89425122486B0CD00F22052 /* RCTProfileTrampoline-i386.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = "RCTProfileTrampoline-i386.S"; sourceTree = ""; }; B89425132486B0CD00F22052 /* RCTProfile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTProfile.m; sourceTree = ""; }; B89425142486B0CD00F22052 /* RCTProfileTrampoline-arm64.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = "RCTProfileTrampoline-arm64.S"; sourceTree = ""; }; B89425152486B0CD00F22052 /* RCTProfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTProfile.h; sourceTree = ""; }; B89425162486B0CD00F22052 /* RCTFPSGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFPSGraph.h; sourceTree = ""; }; B89425172486B0CD00F22052 /* RCTMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMacros.h; sourceTree = ""; }; B89425182486B0CD00F22052 /* RCTPerfMonitor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPerfMonitor.m; sourceTree = ""; }; B89425192486B0CD00F22052 /* RCTProfileTrampoline-x86_64.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = "RCTProfileTrampoline-x86_64.S"; sourceTree = ""; }; B894251B2486B0CD00F22052 /* RCTFollyConvert.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFollyConvert.mm; sourceTree = ""; }; B894251C2486B0CD00F22052 /* RCTFollyConvert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFollyConvert.h; sourceTree = ""; }; B894251E2486B0CD00F22052 /* RCTDevSettings.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTDevSettings.mm; sourceTree = ""; }; B894251F2486B0CD00F22052 /* RCTStatusBarManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTStatusBarManager.m; sourceTree = ""; }; B89425202486B0CD00F22052 /* RCTLayoutAnimationGroup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTLayoutAnimationGroup.h; sourceTree = ""; }; B89425212486B0CD00F22052 /* RCTKeyboardObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTKeyboardObserver.m; sourceTree = ""; }; B89425222486B0CD00F22052 /* RCTSurfacePresenterStub.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSurfacePresenterStub.m; sourceTree = ""; }; B89425232486B0CD00F22052 /* RCTTVNavigationEventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTVNavigationEventEmitter.h; sourceTree = ""; }; B89425242486B0CD00F22052 /* RCTAsyncLocalStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAsyncLocalStorage.m; sourceTree = ""; }; B89425252486B0CD00F22052 /* RCTSourceCode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSourceCode.m; sourceTree = ""; }; B89425262486B0CD00F22052 /* RCTUIManagerUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTUIManagerUtils.m; sourceTree = ""; }; B89425272486B0CD00F22052 /* RCTAccessibilityManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAccessibilityManager.m; sourceTree = ""; }; B89425282486B0CD00F22052 /* RCTClipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTClipboard.h; sourceTree = ""; }; B89425292486B0CD00F22052 /* RCTUIManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUIManager.h; sourceTree = ""; }; B894252A2486B0CD00F22052 /* RCTRedBox.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRedBox.m; sourceTree = ""; }; B894252B2486B0CD00F22052 /* RCTAlertManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAlertManager.m; sourceTree = ""; }; B894252C2486B0CD00F22052 /* RCTI18nUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTI18nUtil.m; sourceTree = ""; }; B894252D2486B0CD00F22052 /* RCTTiming.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTiming.h; sourceTree = ""; }; B894252E2486B0CD00F22052 /* RCTI18nManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTI18nManager.m; sourceTree = ""; }; B894252F2486B0CD00F22052 /* RCTEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTEventEmitter.m; sourceTree = ""; }; B89425302486B0CD00F22052 /* RCTAppState.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAppState.m; sourceTree = ""; }; B89425312486B0CD00F22052 /* RCTRedBoxExtraDataViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRedBoxExtraDataViewController.m; sourceTree = ""; }; B89425322486B0CD00F22052 /* RCTDevSettings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDevSettings.h; sourceTree = ""; }; B89425332486B0CD00F22052 /* RCTLayoutAnimation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTLayoutAnimation.h; sourceTree = ""; }; B89425342486B0CD00F22052 /* RCTDeviceInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDeviceInfo.m; sourceTree = ""; }; B89425352486B0CD00F22052 /* RCTSurfacePresenterStub.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfacePresenterStub.h; sourceTree = ""; }; B89425362486B0CD00F22052 /* RCTLayoutAnimationGroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTLayoutAnimationGroup.m; sourceTree = ""; }; B89425372486B0CD00F22052 /* RCTKeyboardObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTKeyboardObserver.h; sourceTree = ""; }; B89425382486B0CD00F22052 /* RCTStatusBarManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTStatusBarManager.h; sourceTree = ""; }; B89425392486B0CD00F22052 /* RCTClipboard.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTClipboard.m; sourceTree = ""; }; B894253A2486B0CD00F22052 /* RCTUIManagerUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUIManagerUtils.h; sourceTree = ""; }; B894253B2486B0CD00F22052 /* RCTAccessibilityManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAccessibilityManager.h; sourceTree = ""; }; B894253C2486B0CD00F22052 /* RCTUIManagerObserverCoordinator.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTUIManagerObserverCoordinator.mm; sourceTree = ""; }; B894253D2486B0CD00F22052 /* RCTSourceCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSourceCode.h; sourceTree = ""; }; B894253E2486B0CD00F22052 /* RCTAsyncLocalStorage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAsyncLocalStorage.h; sourceTree = ""; }; B894253F2486B0CD00F22052 /* RCTTVNavigationEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTVNavigationEventEmitter.m; sourceTree = ""; }; B89425402486B0CD00F22052 /* RCTI18nManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTI18nManager.h; sourceTree = ""; }; B89425412486B0CD00F22052 /* RCTTiming.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTiming.m; sourceTree = ""; }; B89425422486B0CD00F22052 /* RCTAlertManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAlertManager.h; sourceTree = ""; }; B89425432486B0CD00F22052 /* RCTRedBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRedBox.h; sourceTree = ""; }; B89425442486B0CD00F22052 /* RCTI18nUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTI18nUtil.h; sourceTree = ""; }; B89425452486B0CD00F22052 /* RCTUIManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTUIManager.m; sourceTree = ""; }; B89425462486B0CD00F22052 /* RCTDeviceInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDeviceInfo.h; sourceTree = ""; }; B89425472486B0CD00F22052 /* RCTUIManagerObserverCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUIManagerObserverCoordinator.h; sourceTree = ""; }; B89425482486B0CD00F22052 /* RCTLayoutAnimation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTLayoutAnimation.m; sourceTree = ""; }; B89425492486B0CD00F22052 /* RCTRedBoxExtraDataViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRedBoxExtraDataViewController.h; sourceTree = ""; }; B894254A2486B0CD00F22052 /* RCTAppState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAppState.h; sourceTree = ""; }; B894254B2486B0CD00F22052 /* RCTEventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTEventEmitter.h; sourceTree = ""; }; B894254D2486B0CD00F22052 /* RCTViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTViewManager.h; sourceTree = ""; }; B894254E2486B0CD00F22052 /* RCTShadowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTShadowView.h; sourceTree = ""; }; B89425502486B0CD00F22052 /* RCTSafeAreaShadowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSafeAreaShadowView.m; sourceTree = ""; }; B89425512486B0CD00F22052 /* RCTSafeAreaView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSafeAreaView.h; sourceTree = ""; }; B89425522486B0CD00F22052 /* RCTSafeAreaViewLocalData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSafeAreaViewLocalData.h; sourceTree = ""; }; B89425532486B0CD00F22052 /* RCTSafeAreaViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSafeAreaViewManager.m; sourceTree = ""; }; B89425542486B0CD00F22052 /* RCTSafeAreaView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSafeAreaView.m; sourceTree = ""; }; B89425552486B0CD00F22052 /* RCTSafeAreaShadowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSafeAreaShadowView.h; sourceTree = ""; }; B89425562486B0CD00F22052 /* RCTSafeAreaViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSafeAreaViewManager.h; sourceTree = ""; }; B89425572486B0CD00F22052 /* RCTSafeAreaViewLocalData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSafeAreaViewLocalData.m; sourceTree = ""; }; B89425582486B0CD00F22052 /* UIView+React.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+React.m"; sourceTree = ""; }; B89425592486B0CD00F22052 /* RCTView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTView.m; sourceTree = ""; }; B894255B2486B0CD00F22052 /* RCTScrollContentShadowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollContentShadowView.h; sourceTree = ""; }; B894255C2486B0CD00F22052 /* RCTScrollContentViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTScrollContentViewManager.m; sourceTree = ""; }; B894255D2486B0CD00F22052 /* RCTScrollView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTScrollView.m; sourceTree = ""; }; B894255E2486B0CD00F22052 /* RCTScrollContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTScrollContentView.m; sourceTree = ""; }; B894255F2486B0CD00F22052 /* RCTScrollViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTScrollViewManager.m; sourceTree = ""; }; B89425602486B0CD00F22052 /* RCTScrollContentShadowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTScrollContentShadowView.m; sourceTree = ""; }; B89425612486B0CD00F22052 /* RCTScrollView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollView.h; sourceTree = ""; }; B89425622486B0CD00F22052 /* RCTScrollContentViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollContentViewManager.h; sourceTree = ""; }; B89425632486B0CD00F22052 /* RCTScrollViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollViewManager.h; sourceTree = ""; }; B89425642486B0CD00F22052 /* RCTScrollableProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollableProtocol.h; sourceTree = ""; }; B89425652486B0CD00F22052 /* RCTScrollContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTScrollContentView.h; sourceTree = ""; }; B89425662486B0CD00F22052 /* RCTShadowView+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTShadowView+Internal.h"; sourceTree = ""; }; B89425672486B0CD00F22052 /* RCTSlider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSlider.m; sourceTree = ""; }; B89425682486B0CD00F22052 /* RCTSegmentedControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSegmentedControl.m; sourceTree = ""; }; B89425692486B0CD00F22052 /* RCTLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTLayout.m; sourceTree = ""; }; B894256A2486B0CD00F22052 /* RCTSliderManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSliderManager.m; sourceTree = ""; }; B894256B2486B0CD00F22052 /* RCTProgressViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTProgressViewManager.m; sourceTree = ""; }; B894256C2486B0CD00F22052 /* RCTConvert+Transform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+Transform.h"; sourceTree = ""; }; B894256D2486B0CD00F22052 /* RCTComponentData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTComponentData.m; sourceTree = ""; }; B894256E2486B0CD00F22052 /* RCTMaskedViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTMaskedViewManager.m; sourceTree = ""; }; B894256F2486B0CD00F22052 /* RCTModalManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModalManager.h; sourceTree = ""; }; B89425702486B0CD00F22052 /* RCTShadowView+Layout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTShadowView+Layout.m"; sourceTree = ""; }; B89425712486B0CD00F22052 /* RCTFont.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFont.h; sourceTree = ""; }; B89425722486B0CD00F22052 /* RCTRefreshControlManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRefreshControlManager.h; sourceTree = ""; }; B89425732486B0CD00F22052 /* RCTModalHostView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTModalHostView.m; sourceTree = ""; }; B89425742486B0CD00F22052 /* RCTBorderDrawing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTBorderDrawing.m; sourceTree = ""; }; B89425752486B0CD00F22052 /* RCTWrapperViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTWrapperViewController.m; sourceTree = ""; }; B89425762486B0CD00F22052 /* RCTModalHostViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTModalHostViewController.m; sourceTree = ""; }; B89425772486B0CD00F22052 /* RCTRefreshControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRefreshControl.h; sourceTree = ""; }; B89425782486B0CD00F22052 /* RCTSwitch.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSwitch.m; sourceTree = ""; }; B89425792486B0CD00F22052 /* RCTConvert+CoreLocation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+CoreLocation.h"; sourceTree = ""; }; B894257A2486B0CD00F22052 /* RCTDatePicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDatePicker.h; sourceTree = ""; }; B894257B2486B0CD00F22052 /* RCTMaskedView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTMaskedView.m; sourceTree = ""; }; B894257C2486B0CD00F22052 /* RCTDatePickerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDatePickerManager.m; sourceTree = ""; }; B894257D2486B0CD00F22052 /* RCTComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponent.h; sourceTree = ""; }; B894257E2486B0CD00F22052 /* RCTSwitchManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSwitchManager.h; sourceTree = ""; }; B894257F2486B0CD00F22052 /* RCTModalHostViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModalHostViewManager.h; sourceTree = ""; }; B89425802486B0CD00F22052 /* RCTPickerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPickerManager.h; sourceTree = ""; }; B89425812486B0CD00F22052 /* RCTTVView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTVView.h; sourceTree = ""; }; B89425822486B0CD00F22052 /* RCTPicker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPicker.m; sourceTree = ""; }; B89425832486B0CD00F22052 /* RCTSegmentedControlManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSegmentedControlManager.m; sourceTree = ""; }; B89425842486B0CD00F22052 /* RCTAnimationType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAnimationType.h; sourceTree = ""; }; B89425852486B0CD00F22052 /* RCTActivityIndicatorView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTActivityIndicatorView.m; sourceTree = ""; }; B89425862486B0CD00F22052 /* RCTActivityIndicatorViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTActivityIndicatorViewManager.m; sourceTree = ""; }; B89425872486B0CD00F22052 /* RCTRootShadowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootShadowView.h; sourceTree = ""; }; B89425882486B0CD00F22052 /* RCTPointerEvents.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPointerEvents.h; sourceTree = ""; }; B89425892486B0CD00F22052 /* RCTConvert+Transform.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+Transform.m"; sourceTree = ""; }; B894258A2486B0CD00F22052 /* RCTProgressViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTProgressViewManager.h; sourceTree = ""; }; B894258B2486B0CD00F22052 /* RCTSliderManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSliderManager.h; sourceTree = ""; }; B894258C2486B0CD00F22052 /* RCTSegmentedControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSegmentedControl.h; sourceTree = ""; }; B894258D2486B0CD00F22052 /* RCTLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTLayout.h; sourceTree = ""; }; B894258E2486B0CD00F22052 /* RCTSlider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSlider.h; sourceTree = ""; }; B894258F2486B0CD00F22052 /* RCTShadowView+Internal.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTShadowView+Internal.m"; sourceTree = ""; }; B89425902486B0CD00F22052 /* RCTView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTView.h; sourceTree = ""; }; B89425912486B0CD00F22052 /* RCTBorderStyle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBorderStyle.h; sourceTree = ""; }; B89425922486B0CD00F22052 /* UIView+React.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+React.h"; sourceTree = ""; }; B89425932486B0CD00F22052 /* RCTShadowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTShadowView.m; sourceTree = ""; }; B89425942486B0CD00F22052 /* RCTViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTViewManager.m; sourceTree = ""; }; B89425952486B0CD00F22052 /* RCTWrapperViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTWrapperViewController.h; sourceTree = ""; }; B89425962486B0CD00F22052 /* RCTModalHostViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModalHostViewController.h; sourceTree = ""; }; B89425972486B0CD00F22052 /* RCTRefreshControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRefreshControl.m; sourceTree = ""; }; B89425982486B0CD00F22052 /* RCTBorderDrawing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBorderDrawing.h; sourceTree = ""; }; B89425992486B0CD00F22052 /* RCTModalHostView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModalHostView.h; sourceTree = ""; }; B894259A2486B0CD00F22052 /* RCTRefreshControlManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRefreshControlManager.m; sourceTree = ""; }; B894259B2486B0CD00F22052 /* RCTModalManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTModalManager.m; sourceTree = ""; }; B894259C2486B0CD00F22052 /* RCTShadowView+Layout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTShadowView+Layout.h"; sourceTree = ""; }; B894259D2486B0CD00F22052 /* RCTMaskedViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMaskedViewManager.h; sourceTree = ""; }; B894259E2486B0CD00F22052 /* RCTComponentData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponentData.h; sourceTree = ""; }; B894259F2486B0CD00F22052 /* RCTFont.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTFont.mm; sourceTree = ""; }; B89425A02486B0CD00F22052 /* RCTDatePickerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDatePickerManager.h; sourceTree = ""; }; B89425A12486B0CD00F22052 /* RCTDatePicker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDatePicker.m; sourceTree = ""; }; B89425A22486B0CD00F22052 /* RCTMaskedView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMaskedView.h; sourceTree = ""; }; B89425A32486B0CD00F22052 /* RCTAutoInsetsProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAutoInsetsProtocol.h; sourceTree = ""; }; B89425A42486B0CD00F22052 /* RCTConvert+CoreLocation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+CoreLocation.m"; sourceTree = ""; }; B89425A52486B0CD00F22052 /* RCTSwitch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSwitch.h; sourceTree = ""; }; B89425A62486B0CD00F22052 /* UIView+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+Private.h"; sourceTree = ""; }; B89425A72486B0CD00F22052 /* RCTRootShadowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRootShadowView.m; sourceTree = ""; }; B89425A82486B0CD00F22052 /* RCTActivityIndicatorViewManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTActivityIndicatorViewManager.h; sourceTree = ""; }; B89425A92486B0CD00F22052 /* RCTActivityIndicatorView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTActivityIndicatorView.h; sourceTree = ""; }; B89425AA2486B0CD00F22052 /* RCTSegmentedControlManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSegmentedControlManager.h; sourceTree = ""; }; B89425AB2486B0CD00F22052 /* RCTPicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPicker.h; sourceTree = ""; }; B89425AC2486B0CD00F22052 /* RCTTVView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTVView.m; sourceTree = ""; }; B89425AD2486B0CD00F22052 /* RCTPickerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPickerManager.m; sourceTree = ""; }; B89425AE2486B0CD00F22052 /* RCTModalHostViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTModalHostViewManager.m; sourceTree = ""; }; B89425AF2486B0CD00F22052 /* RCTSwitchManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSwitchManager.m; sourceTree = ""; }; B89425B02486B0CD00F22052 /* RCTTextDecorationLineType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTextDecorationLineType.h; sourceTree = ""; }; B89425B22486B0CD00F22052 /* RCTURLRequestHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTURLRequestHandler.h; sourceTree = ""; }; B89425B32486B0CD00F22052 /* RCTTouchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTouchHandler.m; sourceTree = ""; }; B89425B42486B0CD00F22052 /* RCTReloadCommand.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTReloadCommand.m; sourceTree = ""; }; B89425B52486B0CD00F22052 /* RCTCxxConvert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTCxxConvert.h; sourceTree = ""; }; B89425B62486B0CD00F22052 /* RCTUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTUtils.h; sourceTree = ""; }; B89425B72486B0CD00F22052 /* RCTErrorInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTErrorInfo.h; sourceTree = ""; }; B89425B82486B0CD00F22052 /* RCTComponentEvent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTComponentEvent.m; sourceTree = ""; }; B89425B92486B0CD00F22052 /* RCTVersion.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTVersion.m; sourceTree = ""; }; B89425BA2486B0CD00F22052 /* RCTWeakProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTWeakProxy.h; sourceTree = ""; }; B89425BB2486B0CD00F22052 /* RCTBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridge.h; sourceTree = ""; }; B89425BC2486B0CD00F22052 /* RCTManagedPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTManagedPointer.h; sourceTree = ""; }; B89425BD2486B0CD00F22052 /* RCTBridgeModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeModule.h; sourceTree = ""; }; B89425BE2486B0CD00F22052 /* RCTModuleData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTModuleData.mm; sourceTree = ""; }; B89425BF2486B0CD00F22052 /* RCTJavaScriptExecutor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTJavaScriptExecutor.h; sourceTree = ""; }; B89425C02486B0CD00F22052 /* RCTFrameUpdate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTFrameUpdate.m; sourceTree = ""; }; B89425C12486B0CD00F22052 /* RCTMultipartDataTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMultipartDataTask.h; sourceTree = ""; }; B89425C22486B0CD00F22052 /* RCTPerformanceLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPerformanceLogger.h; sourceTree = ""; }; B89425C32486B0CD00F22052 /* RCTJSStackFrame.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTJSStackFrame.m; sourceTree = ""; }; B89425C42486B0CD00F22052 /* RCTRootContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRootContentView.m; sourceTree = ""; }; B89425C52486B0CD00F22052 /* RCTMultipartStreamReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTMultipartStreamReader.h; sourceTree = ""; }; B89425C62486B0CD00F22052 /* RCTJavaScriptLoader.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTJavaScriptLoader.mm; sourceTree = ""; }; B89425C72486B0CD00F22052 /* RCTTouchEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTouchEvent.h; sourceTree = ""; }; B89425C82486B0CD00F22052 /* RCTDisplayLink.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTDisplayLink.m; sourceTree = ""; }; B89425C92486B0CD00F22052 /* RCTRootViewInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootViewInternal.h; sourceTree = ""; }; B89425CA2486B0CD00F22052 /* RCTTVRemoteHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTVRemoteHandler.h; sourceTree = ""; }; B89425CB2486B0CD00F22052 /* RCTParserUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTParserUtils.h; sourceTree = ""; }; B89425CC2486B0CD00F22052 /* RCTRootViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootViewDelegate.h; sourceTree = ""; }; B89425CD2486B0CD00F22052 /* RCTModuleMethod.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModuleMethod.h; sourceTree = ""; }; B89425CE2486B0CD00F22052 /* RCTRootView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTRootView.m; sourceTree = ""; }; B89425CF2486B0CD00F22052 /* RCTBundleURLProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBundleURLProvider.h; sourceTree = ""; }; B89425D02486B0CD00F22052 /* RCTImageSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTImageSource.m; sourceTree = ""; }; B89425D12486B0CD00F22052 /* RCTBridgeDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeDelegate.h; sourceTree = ""; }; B89425D22486B0CD00F22052 /* RCTURLRequestDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTURLRequestDelegate.h; sourceTree = ""; }; B89425D32486B0CD00F22052 /* RCTKeyCommands.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTKeyCommands.m; sourceTree = ""; }; B89425D52486B0CD00F22052 /* RCTSurfaceRootView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceRootView.h; sourceTree = ""; }; B89425D62486B0CD00F22052 /* RCTSurfaceStage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSurfaceStage.m; sourceTree = ""; }; B89425D72486B0CD00F22052 /* RCTSurfaceView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceView.mm; sourceTree = ""; }; B89425D82486B0CD00F22052 /* RCTSurfaceRootShadowView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTSurfaceRootShadowView.m; sourceTree = ""; }; B89425D92486B0CD00F22052 /* RCTSurfaceDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceDelegate.h; sourceTree = ""; }; B89425DB2486B0CD00F22052 /* RCTSurfaceSizeMeasureMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceSizeMeasureMode.h; sourceTree = ""; }; B89425DC2486B0CD00F22052 /* RCTSurfaceSizeMeasureMode.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceSizeMeasureMode.mm; sourceTree = ""; }; B89425DD2486B0CD00F22052 /* RCTSurfaceHostingProxyRootView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceHostingProxyRootView.mm; sourceTree = ""; }; B89425DE2486B0CD00F22052 /* RCTSurfaceHostingView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceHostingView.mm; sourceTree = ""; }; B89425DF2486B0CD00F22052 /* RCTSurfaceHostingProxyRootView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceHostingProxyRootView.h; sourceTree = ""; }; B89425E02486B0CD00F22052 /* RCTSurfaceHostingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceHostingView.h; sourceTree = ""; }; B89425E12486B0CD00F22052 /* RCTSurface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurface.h; sourceTree = ""; }; B89425E22486B0CD00F22052 /* RCTSurfaceRootView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceRootView.mm; sourceTree = ""; }; B89425E32486B0CD00F22052 /* RCTSurfaceView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceView.h; sourceTree = ""; }; B89425E42486B0CD00F22052 /* RCTSurfaceRootShadowViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceRootShadowViewDelegate.h; sourceTree = ""; }; B89425E52486B0CD00F22052 /* RCTSurfaceRootShadowView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceRootShadowView.h; sourceTree = ""; }; B89425E62486B0CD00F22052 /* RCTSurfaceStage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceStage.h; sourceTree = ""; }; B89425E72486B0CD00F22052 /* RCTSurfaceView+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTSurfaceView+Internal.h"; sourceTree = ""; }; B89425E82486B0CD00F22052 /* RCTSurface.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurface.mm; sourceTree = ""; }; B89425E92486B0CD00F22052 /* RCTEventDispatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTEventDispatcher.h; sourceTree = ""; }; B89425EA2486B0CD00F22052 /* RCTJavaScriptLoader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTJavaScriptLoader.h; sourceTree = ""; }; B89425EB2486B0CD00F22052 /* RCTModuleData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTModuleData.h; sourceTree = ""; }; B89425EC2486B0CD00F22052 /* RCTConvert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTConvert.h; sourceTree = ""; }; B89425ED2486B0CD00F22052 /* RCTModuleMethod.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTModuleMethod.mm; sourceTree = ""; }; B89425EE2486B0CD00F22052 /* RCTAssert.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTAssert.m; sourceTree = ""; }; B89425EF2486B0CD00F22052 /* RCTLog.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTLog.mm; sourceTree = ""; }; B89425F02486B0CD00F22052 /* RCTNullability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTNullability.h; sourceTree = ""; }; B89425F12486B0CD00F22052 /* RCTVersion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTVersion.h; sourceTree = ""; }; B89425F22486B0CD00F22052 /* RCTWeakProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTWeakProxy.m; sourceTree = ""; }; B89425F32486B0CD00F22052 /* RCTComponentEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTComponentEvent.h; sourceTree = ""; }; B89425F42486B0CD00F22052 /* RCTErrorInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTErrorInfo.m; sourceTree = ""; }; B89425F52486B0CD00F22052 /* RCTUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTUtils.m; sourceTree = ""; }; B89425F62486B0CD00F22052 /* RCTCxxConvert.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTCxxConvert.m; sourceTree = ""; }; B89425F72486B0CD00F22052 /* RCTInvalidating.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTInvalidating.h; sourceTree = ""; }; B89425F82486B0CD00F22052 /* RCTReloadCommand.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTReloadCommand.h; sourceTree = ""; }; B89425F92486B0CD00F22052 /* RCTTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTTouchHandler.h; sourceTree = ""; }; B89425FA2486B0CD00F22052 /* RCTTouchEvent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTouchEvent.m; sourceTree = ""; }; B89425FB2486B0CD00F22052 /* RCTDisplayLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDisplayLink.h; sourceTree = ""; }; B89425FC2486B0CD00F22052 /* RCTBridgeMethod.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeMethod.h; sourceTree = ""; }; B89425FD2486B0CD00F22052 /* RCTMultipartStreamReader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTMultipartStreamReader.m; sourceTree = ""; }; B89425FE2486B0CD00F22052 /* RCTRootContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootContentView.h; sourceTree = ""; }; B89425FF2486B0CD00F22052 /* RCTPerformanceLogger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPerformanceLogger.m; sourceTree = ""; }; B89426002486B0CD00F22052 /* RCTJSStackFrame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTJSStackFrame.h; sourceTree = ""; }; B89426012486B0CD00F22052 /* RCTMultipartDataTask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTMultipartDataTask.m; sourceTree = ""; }; B89426022486B0CD00F22052 /* RCTFrameUpdate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTFrameUpdate.h; sourceTree = ""; }; B89426032486B0CD00F22052 /* RCTBridge+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTBridge+Private.h"; sourceTree = ""; }; B89426042486B0CD00F22052 /* RCTBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTBridge.m; sourceTree = ""; }; B89426052486B0CD00F22052 /* RCTBundleURLProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTBundleURLProvider.m; sourceTree = ""; }; B89426062486B0CD00F22052 /* RCTRootView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTRootView.h; sourceTree = ""; }; B89426072486B0CD00F22052 /* RCTErrorCustomizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTErrorCustomizer.h; sourceTree = ""; }; B89426082486B0CD00F22052 /* RCTParserUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTParserUtils.m; sourceTree = ""; }; B89426092486B0CD00F22052 /* RCTLog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTLog.h; sourceTree = ""; }; B894260A2486B0CD00F22052 /* RCTTVRemoteHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTTVRemoteHandler.m; sourceTree = ""; }; B894260B2486B0CD00F22052 /* RCTManagedPointer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTManagedPointer.mm; sourceTree = ""; }; B894260C2486B0CD00F22052 /* RCTDefines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTDefines.h; sourceTree = ""; }; B894260D2486B0CD00F22052 /* RCTAssert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTAssert.h; sourceTree = ""; }; B894260E2486B0CD00F22052 /* RCTConvert.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTConvert.m; sourceTree = ""; }; B894260F2486B0CD00F22052 /* RCTEventDispatcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTEventDispatcher.m; sourceTree = ""; }; B89426102486B0CD00F22052 /* RCTKeyCommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTKeyCommands.h; sourceTree = ""; }; B89426112486B0CD00F22052 /* RCTImageSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTImageSource.h; sourceTree = ""; }; B89426122486B5E200F22052 /* GoogleNearbyMessagesBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoogleNearbyMessagesBridge.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 58B511D81A9E6C8500147676 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 134814211AA4EA7D00B7C361 /* Products */ = { isa = PBXGroup; children = ( 134814201AA4EA6300B7C361 /* libGoogleNearbyMessages.a */, ); name = Products; sourceTree = ""; }; 58B511D21A9E6C8500147676 = { isa = PBXGroup; children = ( B89426122486B5E200F22052 /* GoogleNearbyMessagesBridge.m */, B89424852486AF5900F22052 /* GoogleNearbyMessages.swift */, 134814211AA4EA7D00B7C361 /* Products */, B89424842486AF5800F22052 /* GoogleNearbyMessagesBridge.h */, B89424872486B0CC00F22052 /* Frameworks */, ); sourceTree = ""; }; B89424872486B0CC00F22052 /* Frameworks */ = { isa = PBXGroup; children = ( B89424882486B0CC00F22052 /* React */, ); name = Frameworks; sourceTree = ""; }; B89424882486B0CC00F22052 /* React */ = { isa = PBXGroup; children = ( B89424892486B0CC00F22052 /* CoreModules */, B89424982486B0CC00F22052 /* UIUtils */, B894249B2486B0CC00F22052 /* CxxModule */, B89424A52486B0CC00F22052 /* CxxBridge */, B89424B02486B0CC00F22052 /* third-party.xcconfig */, B89424B12486B0CC00F22052 /* Inspector */, B89424B62486B0CC00F22052 /* DevSupport */, B89424C12486B0CC00F22052 /* React-RCTFabric.podspec */, B89424C22486B0CC00F22052 /* Fabric */, B894250F2486B0CD00F22052 /* Profiler */, B894251A2486B0CD00F22052 /* CxxUtils */, B894251D2486B0CD00F22052 /* Modules */, B894254C2486B0CD00F22052 /* Views */, B89425B12486B0CD00F22052 /* Base */, ); name = React; path = "../node_modules/react-native/React"; sourceTree = ""; }; B89424892486B0CC00F22052 /* CoreModules */ = { isa = PBXGroup; children = ( B894248A2486B0CC00F22052 /* RCTImageLoader.h */, B894248B2486B0CC00F22052 /* RCTImageStoreManager.h */, B894248C2486B0CC00F22052 /* RCTPlatform.h */, B894248D2486B0CC00F22052 /* RCTImageEditingManager.m */, B894248E2486B0CC00F22052 /* CoreModulesPlugins.h */, B894248F2486B0CC00F22052 /* BUCK */, B89424902486B0CC00F22052 /* RCTExceptionsManager.h */, B89424912486B0CC00F22052 /* RCTPlatform.mm */, B89424922486B0CC00F22052 /* RCTImageEditingManager.h */, B89424932486B0CC00F22052 /* RCTExceptionsManager.mm */, B89424942486B0CC00F22052 /* RCTImageLoader.mm */, B89424952486B0CC00F22052 /* RCTImageStoreManager.m */, B89424962486B0CC00F22052 /* CoreModulesPlugins.mm */, B89424972486B0CC00F22052 /* React-CoreModules.podspec */, ); path = CoreModules; sourceTree = ""; }; B89424982486B0CC00F22052 /* UIUtils */ = { isa = PBXGroup; children = ( B89424992486B0CC00F22052 /* RCTUIUtils.m */, B894249A2486B0CC00F22052 /* RCTUIUtils.h */, ); path = UIUtils; sourceTree = ""; }; B894249B2486B0CC00F22052 /* CxxModule */ = { isa = PBXGroup; children = ( B894249C2486B0CC00F22052 /* RCTNativeModule.mm */, B894249D2486B0CC00F22052 /* RCTCxxUtils.mm */, B894249E2486B0CC00F22052 /* RCTNativeModule.h */, B894249F2486B0CC00F22052 /* RCTCxxMethod.h */, B89424A02486B0CC00F22052 /* RCTCxxModule.mm */, B89424A12486B0CC00F22052 /* DispatchMessageQueueThread.h */, B89424A22486B0CC00F22052 /* RCTCxxUtils.h */, B89424A32486B0CC00F22052 /* RCTCxxMethod.mm */, B89424A42486B0CC00F22052 /* RCTCxxModule.h */, ); path = CxxModule; sourceTree = ""; }; B89424A52486B0CC00F22052 /* CxxBridge */ = { isa = PBXGroup; children = ( B89424A62486B0CC00F22052 /* RCTObjcExecutor.h */, B89424A72486B0CC00F22052 /* NSDataBigString.mm */, B89424A82486B0CC00F22052 /* RCTCxxBridge.mm */, B89424A92486B0CC00F22052 /* JSCExecutorFactory.h */, B89424AA2486B0CC00F22052 /* NSDataBigString.h */, B89424AB2486B0CC00F22052 /* RCTMessageThread.mm */, B89424AC2486B0CC00F22052 /* RCTMessageThread.h */, B89424AD2486B0CC00F22052 /* RCTCxxBridgeDelegate.h */, B89424AE2486B0CC00F22052 /* JSCExecutorFactory.mm */, B89424AF2486B0CC00F22052 /* RCTObjcExecutor.mm */, ); path = CxxBridge; sourceTree = ""; }; B89424B12486B0CC00F22052 /* Inspector */ = { isa = PBXGroup; children = ( B89424B22486B0CC00F22052 /* RCTInspector.h */, B89424B32486B0CC00F22052 /* RCTInspector.mm */, B89424B42486B0CC00F22052 /* RCTInspectorPackagerConnection.m */, B89424B52486B0CC00F22052 /* RCTInspectorPackagerConnection.h */, ); path = Inspector; sourceTree = ""; }; B89424B62486B0CC00F22052 /* DevSupport */ = { isa = PBXGroup; children = ( B89424B72486B0CC00F22052 /* RCTPackagerClient.h */, B89424B82486B0CC00F22052 /* RCTPackagerConnection.h */, B89424B92486B0CC00F22052 /* RCTInspectorDevServerHelper.h */, B89424BA2486B0CC00F22052 /* RCTDevLoadingView.m */, B89424BB2486B0CC00F22052 /* RCTDevMenu.m */, B89424BC2486B0CC00F22052 /* RCTInspectorDevServerHelper.mm */, B89424BD2486B0CC00F22052 /* RCTPackagerClient.m */, B89424BE2486B0CC00F22052 /* RCTPackagerConnection.mm */, B89424BF2486B0CC00F22052 /* RCTDevLoadingView.h */, B89424C02486B0CC00F22052 /* RCTDevMenu.h */, ); path = DevSupport; sourceTree = ""; }; B89424C22486B0CC00F22052 /* Fabric */ = { isa = PBXGroup; children = ( B89424C32486B0CC00F22052 /* RCTImageResponseObserverProxy.h */, B89424C42486B0CC00F22052 /* RCTSurfaceRegistry.h */, B89424C52486B0CC00F22052 /* Mounting */, B89424F52486B0CC00F22052 /* RCTPrimitives.h */, B89424F62486B0CC00F22052 /* RCTSurfacePresenter.mm */, B89424F72486B0CC00F22052 /* Surface */, B89424FE2486B0CC00F22052 /* Utils */, B89425052486B0CC00F22052 /* RCTImageResponseDelegate.h */, B89425062486B0CD00F22052 /* RCTTouchableComponentViewProtocol.h */, B89425072486B0CD00F22052 /* RCTConversions.h */, B89425082486B0CD00F22052 /* RCTSurfacePresenter.h */, B89425092486B0CD00F22052 /* RCTImageResponseObserverProxy.mm */, B894250A2486B0CD00F22052 /* RCTSurfaceRegistry.mm */, B894250B2486B0CD00F22052 /* RCTScheduler.h */, B894250C2486B0CD00F22052 /* RCTSurfaceTouchHandler.mm */, B894250D2486B0CD00F22052 /* RCTSurfaceTouchHandler.h */, B894250E2486B0CD00F22052 /* RCTScheduler.mm */, ); path = Fabric; sourceTree = ""; }; B89424C52486B0CC00F22052 /* Mounting */ = { isa = PBXGroup; children = ( B89424C62486B0CC00F22052 /* UIView+ComponentViewProtocol.h */, B89424C72486B0CC00F22052 /* RCTMountingManager.h */, B89424C82486B0CC00F22052 /* RCTMountingManagerDelegate.h */, B89424C92486B0CC00F22052 /* RCTComponentViewFactory.mm */, B89424CA2486B0CC00F22052 /* RCTComponentViewProtocol.h */, B89424CB2486B0CC00F22052 /* RCTMountingManager.mm */, B89424CC2486B0CC00F22052 /* ComponentViews */, B89424F12486B0CC00F22052 /* RCTComponentViewRegistry.mm */, B89424F22486B0CC00F22052 /* UIView+ComponentViewProtocol.mm */, B89424F32486B0CC00F22052 /* RCTComponentViewFactory.h */, B89424F42486B0CC00F22052 /* RCTComponentViewRegistry.h */, ); path = Mounting; sourceTree = ""; }; B89424CC2486B0CC00F22052 /* ComponentViews */ = { isa = PBXGroup; children = ( B89424CD2486B0CC00F22052 /* ScrollView */, B89424D42486B0CC00F22052 /* Slider */, B89424D72486B0CC00F22052 /* Image */, B89424DA2486B0CC00F22052 /* ActivityIndicator */, B89424DD2486B0CC00F22052 /* UnimplementedComponent */, B89424E02486B0CC00F22052 /* View */, B89424E32486B0CC00F22052 /* Switch */, B89424E62486B0CC00F22052 /* Root */, B89424E92486B0CC00F22052 /* Text */, B89424EC2486B0CC00F22052 /* Modal */, ); path = ComponentViews; sourceTree = ""; }; B89424CD2486B0CC00F22052 /* ScrollView */ = { isa = PBXGroup; children = ( B89424CE2486B0CC00F22052 /* RCTPullToRefreshViewComponentView.h */, B89424CF2486B0CC00F22052 /* RCTEnhancedScrollView.mm */, B89424D02486B0CC00F22052 /* RCTPullToRefreshViewComponentView.mm */, B89424D12486B0CC00F22052 /* RCTEnhancedScrollView.h */, B89424D22486B0CC00F22052 /* RCTScrollViewComponentView.mm */, B89424D32486B0CC00F22052 /* RCTScrollViewComponentView.h */, ); path = ScrollView; sourceTree = ""; }; B89424D42486B0CC00F22052 /* Slider */ = { isa = PBXGroup; children = ( B89424D52486B0CC00F22052 /* RCTSliderComponentView.h */, B89424D62486B0CC00F22052 /* RCTSliderComponentView.mm */, ); path = Slider; sourceTree = ""; }; B89424D72486B0CC00F22052 /* Image */ = { isa = PBXGroup; children = ( B89424D82486B0CC00F22052 /* RCTImageComponentView.mm */, B89424D92486B0CC00F22052 /* RCTImageComponentView.h */, ); path = Image; sourceTree = ""; }; B89424DA2486B0CC00F22052 /* ActivityIndicator */ = { isa = PBXGroup; children = ( B89424DB2486B0CC00F22052 /* RCTActivityIndicatorViewComponentView.h */, B89424DC2486B0CC00F22052 /* RCTActivityIndicatorViewComponentView.mm */, ); path = ActivityIndicator; sourceTree = ""; }; B89424DD2486B0CC00F22052 /* UnimplementedComponent */ = { isa = PBXGroup; children = ( B89424DE2486B0CC00F22052 /* RCTUnimplementedNativeComponentView.mm */, B89424DF2486B0CC00F22052 /* RCTUnimplementedNativeComponentView.h */, ); path = UnimplementedComponent; sourceTree = ""; }; B89424E02486B0CC00F22052 /* View */ = { isa = PBXGroup; children = ( B89424E12486B0CC00F22052 /* RCTViewComponentView.h */, B89424E22486B0CC00F22052 /* RCTViewComponentView.mm */, ); path = View; sourceTree = ""; }; B89424E32486B0CC00F22052 /* Switch */ = { isa = PBXGroup; children = ( B89424E42486B0CC00F22052 /* RCTSwitchComponentView.mm */, B89424E52486B0CC00F22052 /* RCTSwitchComponentView.h */, ); path = Switch; sourceTree = ""; }; B89424E62486B0CC00F22052 /* Root */ = { isa = PBXGroup; children = ( B89424E72486B0CC00F22052 /* RCTRootComponentView.h */, B89424E82486B0CC00F22052 /* RCTRootComponentView.mm */, ); path = Root; sourceTree = ""; }; B89424E92486B0CC00F22052 /* Text */ = { isa = PBXGroup; children = ( B89424EA2486B0CC00F22052 /* RCTParagraphComponentView.mm */, B89424EB2486B0CC00F22052 /* RCTParagraphComponentView.h */, ); path = Text; sourceTree = ""; }; B89424EC2486B0CC00F22052 /* Modal */ = { isa = PBXGroup; children = ( B89424ED2486B0CC00F22052 /* RCTFabricModalHostViewController.mm */, B89424EE2486B0CC00F22052 /* RCTModalHostViewComponentView.h */, B89424EF2486B0CC00F22052 /* RCTModalHostViewComponentView.mm */, B89424F02486B0CC00F22052 /* RCTFabricModalHostViewController.h */, ); path = Modal; sourceTree = ""; }; B89424F72486B0CC00F22052 /* Surface */ = { isa = PBXGroup; children = ( B89424F82486B0CC00F22052 /* RCTFabricSurfaceHostingProxyRootView.mm */, B89424F92486B0CC00F22052 /* RCTFabricSurface.mm */, B89424FA2486B0CC00F22052 /* RCTFabricSurfaceHostingView.h */, B89424FB2486B0CC00F22052 /* RCTFabricSurface.h */, B89424FC2486B0CC00F22052 /* RCTFabricSurfaceHostingProxyRootView.h */, B89424FD2486B0CC00F22052 /* RCTFabricSurfaceHostingView.mm */, ); path = Surface; sourceTree = ""; }; B89424FE2486B0CC00F22052 /* Utils */ = { isa = PBXGroup; children = ( B89424FF2486B0CC00F22052 /* RuntimeEventBeat.mm */, B89425002486B0CC00F22052 /* MainRunLoopEventBeat.mm */, B89425012486B0CC00F22052 /* RuntimeEventBeat.h */, B89425022486B0CC00F22052 /* MainRunLoopEventBeat.h */, B89425032486B0CC00F22052 /* RCTGenericDelegateSplitter.mm */, B89425042486B0CC00F22052 /* RCTGenericDelegateSplitter.h */, ); path = Utils; sourceTree = ""; }; B894250F2486B0CD00F22052 /* Profiler */ = { isa = PBXGroup; children = ( B89425102486B0CD00F22052 /* RCTFPSGraph.m */, B89425112486B0CD00F22052 /* RCTProfileTrampoline-arm.S */, B89425122486B0CD00F22052 /* RCTProfileTrampoline-i386.S */, B89425132486B0CD00F22052 /* RCTProfile.m */, B89425142486B0CD00F22052 /* RCTProfileTrampoline-arm64.S */, B89425152486B0CD00F22052 /* RCTProfile.h */, B89425162486B0CD00F22052 /* RCTFPSGraph.h */, B89425172486B0CD00F22052 /* RCTMacros.h */, B89425182486B0CD00F22052 /* RCTPerfMonitor.m */, B89425192486B0CD00F22052 /* RCTProfileTrampoline-x86_64.S */, ); path = Profiler; sourceTree = ""; }; B894251A2486B0CD00F22052 /* CxxUtils */ = { isa = PBXGroup; children = ( B894251B2486B0CD00F22052 /* RCTFollyConvert.mm */, B894251C2486B0CD00F22052 /* RCTFollyConvert.h */, ); path = CxxUtils; sourceTree = ""; }; B894251D2486B0CD00F22052 /* Modules */ = { isa = PBXGroup; children = ( B894251E2486B0CD00F22052 /* RCTDevSettings.mm */, B894251F2486B0CD00F22052 /* RCTStatusBarManager.m */, B89425202486B0CD00F22052 /* RCTLayoutAnimationGroup.h */, B89425212486B0CD00F22052 /* RCTKeyboardObserver.m */, B89425222486B0CD00F22052 /* RCTSurfacePresenterStub.m */, B89425232486B0CD00F22052 /* RCTTVNavigationEventEmitter.h */, B89425242486B0CD00F22052 /* RCTAsyncLocalStorage.m */, B89425252486B0CD00F22052 /* RCTSourceCode.m */, B89425262486B0CD00F22052 /* RCTUIManagerUtils.m */, B89425272486B0CD00F22052 /* RCTAccessibilityManager.m */, B89425282486B0CD00F22052 /* RCTClipboard.h */, B89425292486B0CD00F22052 /* RCTUIManager.h */, B894252A2486B0CD00F22052 /* RCTRedBox.m */, B894252B2486B0CD00F22052 /* RCTAlertManager.m */, B894252C2486B0CD00F22052 /* RCTI18nUtil.m */, B894252D2486B0CD00F22052 /* RCTTiming.h */, B894252E2486B0CD00F22052 /* RCTI18nManager.m */, B894252F2486B0CD00F22052 /* RCTEventEmitter.m */, B89425302486B0CD00F22052 /* RCTAppState.m */, B89425312486B0CD00F22052 /* RCTRedBoxExtraDataViewController.m */, B89425322486B0CD00F22052 /* RCTDevSettings.h */, B89425332486B0CD00F22052 /* RCTLayoutAnimation.h */, B89425342486B0CD00F22052 /* RCTDeviceInfo.m */, B89425352486B0CD00F22052 /* RCTSurfacePresenterStub.h */, B89425362486B0CD00F22052 /* RCTLayoutAnimationGroup.m */, B89425372486B0CD00F22052 /* RCTKeyboardObserver.h */, B89425382486B0CD00F22052 /* RCTStatusBarManager.h */, B89425392486B0CD00F22052 /* RCTClipboard.m */, B894253A2486B0CD00F22052 /* RCTUIManagerUtils.h */, B894253B2486B0CD00F22052 /* RCTAccessibilityManager.h */, B894253C2486B0CD00F22052 /* RCTUIManagerObserverCoordinator.mm */, B894253D2486B0CD00F22052 /* RCTSourceCode.h */, B894253E2486B0CD00F22052 /* RCTAsyncLocalStorage.h */, B894253F2486B0CD00F22052 /* RCTTVNavigationEventEmitter.m */, B89425402486B0CD00F22052 /* RCTI18nManager.h */, B89425412486B0CD00F22052 /* RCTTiming.m */, B89425422486B0CD00F22052 /* RCTAlertManager.h */, B89425432486B0CD00F22052 /* RCTRedBox.h */, B89425442486B0CD00F22052 /* RCTI18nUtil.h */, B89425452486B0CD00F22052 /* RCTUIManager.m */, B89425462486B0CD00F22052 /* RCTDeviceInfo.h */, B89425472486B0CD00F22052 /* RCTUIManagerObserverCoordinator.h */, B89425482486B0CD00F22052 /* RCTLayoutAnimation.m */, B89425492486B0CD00F22052 /* RCTRedBoxExtraDataViewController.h */, B894254A2486B0CD00F22052 /* RCTAppState.h */, B894254B2486B0CD00F22052 /* RCTEventEmitter.h */, ); path = Modules; sourceTree = ""; }; B894254C2486B0CD00F22052 /* Views */ = { isa = PBXGroup; children = ( B894254D2486B0CD00F22052 /* RCTViewManager.h */, B894254E2486B0CD00F22052 /* RCTShadowView.h */, B894254F2486B0CD00F22052 /* SafeAreaView */, B89425582486B0CD00F22052 /* UIView+React.m */, B89425592486B0CD00F22052 /* RCTView.m */, B894255A2486B0CD00F22052 /* ScrollView */, B89425662486B0CD00F22052 /* RCTShadowView+Internal.h */, B89425672486B0CD00F22052 /* RCTSlider.m */, B89425682486B0CD00F22052 /* RCTSegmentedControl.m */, B89425692486B0CD00F22052 /* RCTLayout.m */, B894256A2486B0CD00F22052 /* RCTSliderManager.m */, B894256B2486B0CD00F22052 /* RCTProgressViewManager.m */, B894256C2486B0CD00F22052 /* RCTConvert+Transform.h */, B894256D2486B0CD00F22052 /* RCTComponentData.m */, B894256E2486B0CD00F22052 /* RCTMaskedViewManager.m */, B894256F2486B0CD00F22052 /* RCTModalManager.h */, B89425702486B0CD00F22052 /* RCTShadowView+Layout.m */, B89425712486B0CD00F22052 /* RCTFont.h */, B89425722486B0CD00F22052 /* RCTRefreshControlManager.h */, B89425732486B0CD00F22052 /* RCTModalHostView.m */, B89425742486B0CD00F22052 /* RCTBorderDrawing.m */, B89425752486B0CD00F22052 /* RCTWrapperViewController.m */, B89425762486B0CD00F22052 /* RCTModalHostViewController.m */, B89425772486B0CD00F22052 /* RCTRefreshControl.h */, B89425782486B0CD00F22052 /* RCTSwitch.m */, B89425792486B0CD00F22052 /* RCTConvert+CoreLocation.h */, B894257A2486B0CD00F22052 /* RCTDatePicker.h */, B894257B2486B0CD00F22052 /* RCTMaskedView.m */, B894257C2486B0CD00F22052 /* RCTDatePickerManager.m */, B894257D2486B0CD00F22052 /* RCTComponent.h */, B894257E2486B0CD00F22052 /* RCTSwitchManager.h */, B894257F2486B0CD00F22052 /* RCTModalHostViewManager.h */, B89425802486B0CD00F22052 /* RCTPickerManager.h */, B89425812486B0CD00F22052 /* RCTTVView.h */, B89425822486B0CD00F22052 /* RCTPicker.m */, B89425832486B0CD00F22052 /* RCTSegmentedControlManager.m */, B89425842486B0CD00F22052 /* RCTAnimationType.h */, B89425852486B0CD00F22052 /* RCTActivityIndicatorView.m */, B89425862486B0CD00F22052 /* RCTActivityIndicatorViewManager.m */, B89425872486B0CD00F22052 /* RCTRootShadowView.h */, B89425882486B0CD00F22052 /* RCTPointerEvents.h */, B89425892486B0CD00F22052 /* RCTConvert+Transform.m */, B894258A2486B0CD00F22052 /* RCTProgressViewManager.h */, B894258B2486B0CD00F22052 /* RCTSliderManager.h */, B894258C2486B0CD00F22052 /* RCTSegmentedControl.h */, B894258D2486B0CD00F22052 /* RCTLayout.h */, B894258E2486B0CD00F22052 /* RCTSlider.h */, B894258F2486B0CD00F22052 /* RCTShadowView+Internal.m */, B89425902486B0CD00F22052 /* RCTView.h */, B89425912486B0CD00F22052 /* RCTBorderStyle.h */, B89425922486B0CD00F22052 /* UIView+React.h */, B89425932486B0CD00F22052 /* RCTShadowView.m */, B89425942486B0CD00F22052 /* RCTViewManager.m */, B89425952486B0CD00F22052 /* RCTWrapperViewController.h */, B89425962486B0CD00F22052 /* RCTModalHostViewController.h */, B89425972486B0CD00F22052 /* RCTRefreshControl.m */, B89425982486B0CD00F22052 /* RCTBorderDrawing.h */, B89425992486B0CD00F22052 /* RCTModalHostView.h */, B894259A2486B0CD00F22052 /* RCTRefreshControlManager.m */, B894259B2486B0CD00F22052 /* RCTModalManager.m */, B894259C2486B0CD00F22052 /* RCTShadowView+Layout.h */, B894259D2486B0CD00F22052 /* RCTMaskedViewManager.h */, B894259E2486B0CD00F22052 /* RCTComponentData.h */, B894259F2486B0CD00F22052 /* RCTFont.mm */, B89425A02486B0CD00F22052 /* RCTDatePickerManager.h */, B89425A12486B0CD00F22052 /* RCTDatePicker.m */, B89425A22486B0CD00F22052 /* RCTMaskedView.h */, B89425A32486B0CD00F22052 /* RCTAutoInsetsProtocol.h */, B89425A42486B0CD00F22052 /* RCTConvert+CoreLocation.m */, B89425A52486B0CD00F22052 /* RCTSwitch.h */, B89425A62486B0CD00F22052 /* UIView+Private.h */, B89425A72486B0CD00F22052 /* RCTRootShadowView.m */, B89425A82486B0CD00F22052 /* RCTActivityIndicatorViewManager.h */, B89425A92486B0CD00F22052 /* RCTActivityIndicatorView.h */, B89425AA2486B0CD00F22052 /* RCTSegmentedControlManager.h */, B89425AB2486B0CD00F22052 /* RCTPicker.h */, B89425AC2486B0CD00F22052 /* RCTTVView.m */, B89425AD2486B0CD00F22052 /* RCTPickerManager.m */, B89425AE2486B0CD00F22052 /* RCTModalHostViewManager.m */, B89425AF2486B0CD00F22052 /* RCTSwitchManager.m */, B89425B02486B0CD00F22052 /* RCTTextDecorationLineType.h */, ); path = Views; sourceTree = ""; }; B894254F2486B0CD00F22052 /* SafeAreaView */ = { isa = PBXGroup; children = ( B89425502486B0CD00F22052 /* RCTSafeAreaShadowView.m */, B89425512486B0CD00F22052 /* RCTSafeAreaView.h */, B89425522486B0CD00F22052 /* RCTSafeAreaViewLocalData.h */, B89425532486B0CD00F22052 /* RCTSafeAreaViewManager.m */, B89425542486B0CD00F22052 /* RCTSafeAreaView.m */, B89425552486B0CD00F22052 /* RCTSafeAreaShadowView.h */, B89425562486B0CD00F22052 /* RCTSafeAreaViewManager.h */, B89425572486B0CD00F22052 /* RCTSafeAreaViewLocalData.m */, ); path = SafeAreaView; sourceTree = ""; }; B894255A2486B0CD00F22052 /* ScrollView */ = { isa = PBXGroup; children = ( B894255B2486B0CD00F22052 /* RCTScrollContentShadowView.h */, B894255C2486B0CD00F22052 /* RCTScrollContentViewManager.m */, B894255D2486B0CD00F22052 /* RCTScrollView.m */, B894255E2486B0CD00F22052 /* RCTScrollContentView.m */, B894255F2486B0CD00F22052 /* RCTScrollViewManager.m */, B89425602486B0CD00F22052 /* RCTScrollContentShadowView.m */, B89425612486B0CD00F22052 /* RCTScrollView.h */, B89425622486B0CD00F22052 /* RCTScrollContentViewManager.h */, B89425632486B0CD00F22052 /* RCTScrollViewManager.h */, B89425642486B0CD00F22052 /* RCTScrollableProtocol.h */, B89425652486B0CD00F22052 /* RCTScrollContentView.h */, ); path = ScrollView; sourceTree = ""; }; B89425B12486B0CD00F22052 /* Base */ = { isa = PBXGroup; children = ( B89425B22486B0CD00F22052 /* RCTURLRequestHandler.h */, B89425B32486B0CD00F22052 /* RCTTouchHandler.m */, B89425B42486B0CD00F22052 /* RCTReloadCommand.m */, B89425B52486B0CD00F22052 /* RCTCxxConvert.h */, B89425B62486B0CD00F22052 /* RCTUtils.h */, B89425B72486B0CD00F22052 /* RCTErrorInfo.h */, B89425B82486B0CD00F22052 /* RCTComponentEvent.m */, B89425B92486B0CD00F22052 /* RCTVersion.m */, B89425BA2486B0CD00F22052 /* RCTWeakProxy.h */, B89425BB2486B0CD00F22052 /* RCTBridge.h */, B89425BC2486B0CD00F22052 /* RCTManagedPointer.h */, B89425BD2486B0CD00F22052 /* RCTBridgeModule.h */, B89425BE2486B0CD00F22052 /* RCTModuleData.mm */, B89425BF2486B0CD00F22052 /* RCTJavaScriptExecutor.h */, B89425C02486B0CD00F22052 /* RCTFrameUpdate.m */, B89425C12486B0CD00F22052 /* RCTMultipartDataTask.h */, B89425C22486B0CD00F22052 /* RCTPerformanceLogger.h */, B89425C32486B0CD00F22052 /* RCTJSStackFrame.m */, B89425C42486B0CD00F22052 /* RCTRootContentView.m */, B89425C52486B0CD00F22052 /* RCTMultipartStreamReader.h */, B89425C62486B0CD00F22052 /* RCTJavaScriptLoader.mm */, B89425C72486B0CD00F22052 /* RCTTouchEvent.h */, B89425C82486B0CD00F22052 /* RCTDisplayLink.m */, B89425C92486B0CD00F22052 /* RCTRootViewInternal.h */, B89425CA2486B0CD00F22052 /* RCTTVRemoteHandler.h */, B89425CB2486B0CD00F22052 /* RCTParserUtils.h */, B89425CC2486B0CD00F22052 /* RCTRootViewDelegate.h */, B89425CD2486B0CD00F22052 /* RCTModuleMethod.h */, B89425CE2486B0CD00F22052 /* RCTRootView.m */, B89425CF2486B0CD00F22052 /* RCTBundleURLProvider.h */, B89425D02486B0CD00F22052 /* RCTImageSource.m */, B89425D12486B0CD00F22052 /* RCTBridgeDelegate.h */, B89425D22486B0CD00F22052 /* RCTURLRequestDelegate.h */, B89425D32486B0CD00F22052 /* RCTKeyCommands.m */, B89425D42486B0CD00F22052 /* Surface */, B89425E92486B0CD00F22052 /* RCTEventDispatcher.h */, B89425EA2486B0CD00F22052 /* RCTJavaScriptLoader.h */, B89425EB2486B0CD00F22052 /* RCTModuleData.h */, B89425EC2486B0CD00F22052 /* RCTConvert.h */, B89425ED2486B0CD00F22052 /* RCTModuleMethod.mm */, B89425EE2486B0CD00F22052 /* RCTAssert.m */, B89425EF2486B0CD00F22052 /* RCTLog.mm */, B89425F02486B0CD00F22052 /* RCTNullability.h */, B89425F12486B0CD00F22052 /* RCTVersion.h */, B89425F22486B0CD00F22052 /* RCTWeakProxy.m */, B89425F32486B0CD00F22052 /* RCTComponentEvent.h */, B89425F42486B0CD00F22052 /* RCTErrorInfo.m */, B89425F52486B0CD00F22052 /* RCTUtils.m */, B89425F62486B0CD00F22052 /* RCTCxxConvert.m */, B89425F72486B0CD00F22052 /* RCTInvalidating.h */, B89425F82486B0CD00F22052 /* RCTReloadCommand.h */, B89425F92486B0CD00F22052 /* RCTTouchHandler.h */, B89425FA2486B0CD00F22052 /* RCTTouchEvent.m */, B89425FB2486B0CD00F22052 /* RCTDisplayLink.h */, B89425FC2486B0CD00F22052 /* RCTBridgeMethod.h */, B89425FD2486B0CD00F22052 /* RCTMultipartStreamReader.m */, B89425FE2486B0CD00F22052 /* RCTRootContentView.h */, B89425FF2486B0CD00F22052 /* RCTPerformanceLogger.m */, B89426002486B0CD00F22052 /* RCTJSStackFrame.h */, B89426012486B0CD00F22052 /* RCTMultipartDataTask.m */, B89426022486B0CD00F22052 /* RCTFrameUpdate.h */, B89426032486B0CD00F22052 /* RCTBridge+Private.h */, B89426042486B0CD00F22052 /* RCTBridge.m */, B89426052486B0CD00F22052 /* RCTBundleURLProvider.m */, B89426062486B0CD00F22052 /* RCTRootView.h */, B89426072486B0CD00F22052 /* RCTErrorCustomizer.h */, B89426082486B0CD00F22052 /* RCTParserUtils.m */, B89426092486B0CD00F22052 /* RCTLog.h */, B894260A2486B0CD00F22052 /* RCTTVRemoteHandler.m */, B894260B2486B0CD00F22052 /* RCTManagedPointer.mm */, B894260C2486B0CD00F22052 /* RCTDefines.h */, B894260D2486B0CD00F22052 /* RCTAssert.h */, B894260E2486B0CD00F22052 /* RCTConvert.m */, B894260F2486B0CD00F22052 /* RCTEventDispatcher.m */, B89426102486B0CD00F22052 /* RCTKeyCommands.h */, B89426112486B0CD00F22052 /* RCTImageSource.h */, ); path = Base; sourceTree = ""; }; B89425D42486B0CD00F22052 /* Surface */ = { isa = PBXGroup; children = ( B89425D52486B0CD00F22052 /* RCTSurfaceRootView.h */, B89425D62486B0CD00F22052 /* RCTSurfaceStage.m */, B89425D72486B0CD00F22052 /* RCTSurfaceView.mm */, B89425D82486B0CD00F22052 /* RCTSurfaceRootShadowView.m */, B89425D92486B0CD00F22052 /* RCTSurfaceDelegate.h */, B89425DA2486B0CD00F22052 /* SurfaceHostingView */, B89425E12486B0CD00F22052 /* RCTSurface.h */, B89425E22486B0CD00F22052 /* RCTSurfaceRootView.mm */, B89425E32486B0CD00F22052 /* RCTSurfaceView.h */, B89425E42486B0CD00F22052 /* RCTSurfaceRootShadowViewDelegate.h */, B89425E52486B0CD00F22052 /* RCTSurfaceRootShadowView.h */, B89425E62486B0CD00F22052 /* RCTSurfaceStage.h */, B89425E72486B0CD00F22052 /* RCTSurfaceView+Internal.h */, B89425E82486B0CD00F22052 /* RCTSurface.mm */, ); path = Surface; sourceTree = ""; }; B89425DA2486B0CD00F22052 /* SurfaceHostingView */ = { isa = PBXGroup; children = ( B89425DB2486B0CD00F22052 /* RCTSurfaceSizeMeasureMode.h */, B89425DC2486B0CD00F22052 /* RCTSurfaceSizeMeasureMode.mm */, B89425DD2486B0CD00F22052 /* RCTSurfaceHostingProxyRootView.mm */, B89425DE2486B0CD00F22052 /* RCTSurfaceHostingView.mm */, B89425DF2486B0CD00F22052 /* RCTSurfaceHostingProxyRootView.h */, B89425E02486B0CD00F22052 /* RCTSurfaceHostingView.h */, ); path = SurfaceHostingView; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 58B511DA1A9E6C8500147676 /* GoogleNearbyMessages */ = { isa = PBXNativeTarget; buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "GoogleNearbyMessages" */; buildPhases = ( 58B511D71A9E6C8500147676 /* Sources */, 58B511D81A9E6C8500147676 /* Frameworks */, 58B511D91A9E6C8500147676 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = GoogleNearbyMessages; productName = RCTDataManager; productReference = 134814201AA4EA6300B7C361 /* libGoogleNearbyMessages.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 58B511D31A9E6C8500147676 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0920; ORGANIZATIONNAME = Facebook; TargetAttributes = { 58B511DA1A9E6C8500147676 = { CreatedOnToolsVersion = 6.1.1; LastSwiftMigration = 1150; }; }; }; buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "GoogleNearbyMessages" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 58B511D21A9E6C8500147676; productRefGroup = 58B511D21A9E6C8500147676; projectDirPath = ""; projectRoot = ""; targets = ( 58B511DA1A9E6C8500147676 /* GoogleNearbyMessages */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 58B511D71A9E6C8500147676 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( B89426132486B5E200F22052 /* GoogleNearbyMessagesBridge.m in Sources */, B89424862486AF5900F22052 /* GoogleNearbyMessages.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 58B511ED1A9E6C8500147676 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 58B511EE1A9E6C8500147676 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 58B511F01A9E6C8500147676 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = GoogleNearbyMessages; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = GoogleNearbyMessagesBridge.h; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native/** $(SRCROOT)/../example/ios/Pods/Headers/Public/**"; }; name = Debug; }; 58B511F11A9E6C8500147676 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = GoogleNearbyMessages; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = GoogleNearbyMessagesBridge.h; SWIFT_VERSION = 5.0; SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native/** $(SRCROOT)/../example/ios/Pods/Headers/Public/**"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "GoogleNearbyMessages" */ = { isa = XCConfigurationList; buildConfigurations = ( 58B511ED1A9E6C8500147676 /* Debug */, 58B511EE1A9E6C8500147676 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "GoogleNearbyMessages" */ = { isa = XCConfigurationList; buildConfigurations = ( 58B511F01A9E6C8500147676 /* Debug */, 58B511F11A9E6C8500147676 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 58B511D31A9E6C8500147676 /* Project object */; } ================================================ FILE: ios/GoogleNearbyMessages.xcodeproj/xcshareddata/xcschemes/GoogleNearbyMessages.xcscheme ================================================ ================================================ FILE: ios/GoogleNearbyMessages.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: ios/GoogleNearbyMessages.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: ios/GoogleNearbyMessagesBridge.h ================================================ // // Use this file to import your target's public headers that you would like to expose to Swift. // #import #import "RCTBridgeModule.h" #import "RCTEventEmitter.h" #import "GNSMessages.h" @interface GoogleNearbyMessagesBridge: NSObject @end ================================================ FILE: ios/GoogleNearbyMessagesBridge.m ================================================ // // GoogleNearbyMessagesBridge.m // GoogleNearbyMessages // // Created by Marc Rousavy on 02.06.20. // Copyright © 2020 Facebook. All rights reserved. // #import "GoogleNearbyMessagesBridge.h" #import "RCTBridgeModule.h" #import "RCTEventEmitter.h" @interface RCT_EXTERN_REMAP_MODULE(GoogleNearbyMessages, NearbyMessages, NSObject) RCT_EXTERN_METHOD(connect:(NSString)apiKey discoveryModes:(NSArray)discoveryModes discoveryMediums:(NSArray)discoveryMediums resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); RCT_EXTERN_METHOD(disconnect); RCT_EXTERN_METHOD(publish:(NSString)message resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); RCT_EXTERN_METHOD(unpublish:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); RCT_EXTERN_METHOD(subscribe:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); RCT_EXTERN_METHOD(unsubscribe); RCT_EXTERN_METHOD(checkBluetoothPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); RCT_EXTERN_METHOD(checkBluetoothAvailability:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject); @end ================================================ FILE: package.json ================================================ { "name": "react-native-google-nearby-messages", "title": "React Native Google Nearby Messages", "version": "1.0.22", "description": "An async Google Nearby Messages API Wrapper for React Native (Android & iOS)", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ "README.md", "android/src", "android/build.gradle", "ios/GoogleNearbyMessages.xcodeproj/project.pbxproj", "ios/GoogleNearbyMessages.swift", "ios/GoogleNearbyMessagesBridge.h", "ios/GoogleNearbyMessagesBridge.m", "dist", "react-native-google-nearby-messages.podspec" ], "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "git+https://github.com/mrousavy/react-native-google-nearby-messages.git", "baseUrl": "https://github.com/mrousavy/react-native-google-nearby-messages" }, "keywords": [ "react-native", "google", "nearby", "messages", "android", "ios", "native-module", "nearby-messages", "google-nearby", "swift", "java", "kotlin", "bluetooth", "ble", "wifi", "broadcast", "audio", "microphone" ], "author": { "name": "Marc Rousavy", "email": "marcrousavy@email.com" }, "license": "MIT", "licenseFilename": "LICENSE", "readmeFilename": "README.md", "peerDependencies": { "react": "^16.8.1", "react-native": ">=0.60.0-rc.0 <1.0.x" }, "devDependencies": { "@types/react-native": "^0.62.12", "eslint": "^7.1.0", "react": "^16.9.0", "react-native": "^0.62.2", "typescript": "^3.9.3" } } ================================================ FILE: react-native-google-nearby-messages.podspec ================================================ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) Pod::Spec.new do |s| s.name = "react-native-google-nearby-messages" s.version = package["version"] s.summary = package["description"] s.description = <<-DESC react-native-google-nearby-messages DESC s.homepage = "https://github.com/github_account/react-native-google-nearby-messages" # brief license entry: s.license = "MIT" # optional - use expanded license entry instead: # s.license = { :type => "MIT", :file => "LICENSE" } s.authors = { "Marc Rousavy" => "marcrousavy@email.com" } s.platforms = { :ios => "9.0" } s.source = { :git => "https://github.com/github_account/react-native-google-nearby-messages.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,c,m,swift}" s.requires_arc = true s.dependency "React-Core" s.dependency "NearbyMessages" end ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { /* Basic Options */ "target": "esnext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": [ "es6", "DOM" ] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */, // "checkJs": true, /* Report errors in .js files. */ "jsx": "react-native" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */, "declaration": true /* Generates corresponding '.d.ts' file. */, // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist" /* Redirect output structure to the directory. */, // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "removeComments": true, /* Do not emit comments to output. */ "noEmit": true /* Do not emit outputs. */, // "incremental": true, /* Enable incremental compilation */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ "isolatedModules": true /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */, /* Strict Type-Checking Options */ "strict": true /* Enable all strict type-checking options. */, "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ /* Module Resolution Options */ "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, "baseUrl": "./" /* Base directory to resolve non-absolute module names. */, // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, "files": [ "index.ts" ], "include": [ "index.ts" ], }