├── .expo └── settings.json ├── .gitignore ├── .watchmanconfig ├── App.js ├── INITIAL.md ├── README.md ├── android ├── android.iml ├── app │ ├── app.iml │ ├── build.gradle │ ├── expo.gradle │ ├── fabric.properties │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── kernel-manifest.json │ │ ├── java │ │ └── host │ │ │ └── exp │ │ │ └── exponent │ │ │ ├── MainActivity.java │ │ │ ├── MainApplication.java │ │ │ └── generated │ │ │ ├── AppConstants.java │ │ │ ├── BasePackageList.java │ │ │ └── DetachBuildConstants.java │ │ └── res │ │ ├── drawable-hdpi │ │ ├── ic_arrow_back_white_36dp.png │ │ ├── ic_home_white_36dp.png │ │ ├── ic_logo_white_32dp.png │ │ ├── ic_refresh_white_36dp.png │ │ └── ic_share_white_36dp.png │ │ ├── drawable-mdpi │ │ ├── ic_arrow_back_white_36dp.png │ │ ├── ic_home_white_36dp.png │ │ ├── ic_logo_white_32dp.png │ │ ├── ic_refresh_white_36dp.png │ │ ├── ic_share_white_36dp.png │ │ └── shell_launch_background_image.png │ │ ├── drawable-xhdpi │ │ ├── ic_arrow_back_white_36dp.png │ │ ├── ic_home_white_36dp.png │ │ ├── ic_logo_white_32dp.png │ │ ├── ic_refresh_white_36dp.png │ │ └── ic_share_white_36dp.png │ │ ├── drawable-xxhdpi │ │ ├── ic_arrow_back_white_36dp.png │ │ ├── ic_home_white_36dp.png │ │ ├── ic_logo_white_32dp.png │ │ ├── ic_refresh_white_36dp.png │ │ └── ic_share_white_36dp.png │ │ ├── drawable-xxxhdpi │ │ ├── big_logo_dark.png │ │ ├── big_logo_dark_filled.png │ │ ├── big_logo_filled.png │ │ ├── big_logo_new_filled.png │ │ ├── ic_arrow_back_white_36dp.png │ │ ├── ic_home_white_36dp.png │ │ ├── ic_logo_white_32dp.png │ │ ├── ic_refresh_white_36dp.png │ │ ├── ic_share_white_36dp.png │ │ ├── notification_icon.png │ │ ├── pin_white.png │ │ ├── pin_white_fade.png │ │ └── shell_notification_icon.png │ │ ├── drawable │ │ └── splash_background.xml │ │ ├── layout │ │ ├── error_activity_new.xml │ │ ├── error_console_fragment.xml │ │ ├── error_console_list_item.xml │ │ ├── error_fragment.xml │ │ ├── exponent_button.xml │ │ ├── exponent_check_box.xml │ │ ├── exponent_dev_activity.xml │ │ ├── notification.xml │ │ └── notification_shell_app.xml │ │ ├── mipmap-hdpi │ │ ├── dev_icon.png │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ ├── dev_icon.png │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── dev_icon.png │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── dev_icon.png │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ ├── dev_icon.png │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── debug.keystore ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew └── settings.gradle ├── assets ├── icon.png └── splash.png ├── babel.config.js ├── ejected.json ├── ios ├── Gemfile ├── Gemfile.lock ├── PodFile ├── Podfile.lock ├── test.expo.nfc.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── test.expo.nfc.xcscheme ├── test.expo.nfc.xcworkspace │ └── contents.xcworkspacedata └── test.expo.nfc │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── AppIcon1024x1024.png │ │ ├── AppIcon20x20@2x.png │ │ ├── AppIcon20x20@3x.png │ │ ├── AppIcon29x29@2x.png │ │ ├── AppIcon29x29@3x.png │ │ ├── AppIcon40x40@2x.png │ │ ├── AppIcon40x40@3x.png │ │ ├── AppIcon60x60@2x.png │ │ ├── AppIcon60x60@3x.png │ │ ├── AppIcon76x76@2x~ipad.png │ │ ├── AppIcon76x76~ipad.png │ │ ├── AppIcon83.5x83.5@2x~ipad.png │ │ └── Contents.json │ └── Supporting │ ├── EXBuildConstants.json │ ├── EXBuildConstants.plist │ ├── EXBuildConstants.plist.bak │ ├── EXSDKVersions.plist │ ├── EXShell.plist │ ├── Info.plist │ ├── LaunchScreen.xib │ ├── launch_background_image.png │ ├── launch_icon.png │ ├── main.m │ ├── sdkVersions.json │ ├── shell-app-manifest.json │ └── shell-app.bundle ├── package-lock.json ├── package.json ├── scripts ├── init.js └── switchPlatform.js ├── stubs └── MifareClassicWrapperStub.js └── unejected.json /.expo/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "hostType": "lan", 3 | "lanType": "ip", 4 | "dev": true, 5 | "minify": false, 6 | "urlRandomness": "fs-rvd", 7 | "https": false 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | /ios/Pods/ 3 | /ios/build/ 4 | .idea/ 5 | .gradle/ 6 | /android/app/build/ 7 | /android/app/release/ 8 | /android/build/ 9 | /android/local.properties 10 | /app.json 11 | /config.json 12 | /.expo/packager-info.json 13 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { 3 | StyleSheet, 4 | Text, 5 | View 6 | } from 'react-native' 7 | import Modal from 'expo-modal' 8 | import MFC, { ByteParser } from 'react-native-mifare-classic-wrapper' 9 | 10 | export default class App extends React.Component { 11 | constructor (props) { 12 | super(props) 13 | this.state = { 14 | nfcError: 'Please wait...', 15 | tag: null, 16 | data: null 17 | } 18 | } 19 | 20 | componentDidMount () { 21 | const tagFound = async (tag) => { 22 | await tag.readBlock(48, { 23 | sector: 12, 24 | key: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 25 | keyType: 'A' 26 | }).then(d => { 27 | this.setState({ tag: tag.id, data: ByteParser.byteToString(d) }) 28 | }) 29 | } 30 | 31 | MFC.start().then(() => MFC.listen(tagFound)) 32 | .then(this.setState({ nfcError: null })) 33 | .catch(e => this.setState({ nfcError: e.message })) 34 | 35 | MFC.onStateChanged(({ state }) => { 36 | if (state === 'on') { 37 | this.setState({ nfcError: this.state.oldNfcError, tag: null, data: null }) 38 | } else if (state === 'off') { 39 | this.setState({ 40 | oldNfcError: this.state.nfcError, 41 | nfcError: 'NFC Disabled!' 42 | }) 43 | } 44 | }) 45 | } 46 | 47 | render () { 48 | const nfcError = () => {this.state.nfcError} 49 | const noTag = () => Approach a Mifare Classic Tag 50 | const tagDetected = () => ( 51 | 52 | ID: {this.state.tag} 53 | Data: {this.state.data} 54 | 55 | ) 56 | 57 | return Modal.wrapIntoModal( 58 | 59 | {this.state.nfcError ? nfcError() : ((this.state.tag && this.state.data) ? tagDetected : noTag)()} 60 | 61 | ) 62 | } 63 | } 64 | 65 | const styles = StyleSheet.create({ 66 | container: { 67 | flex: 1, 68 | backgroundColor: '#fff', 69 | alignItems: 'center', 70 | justifyContent: 'center' 71 | } 72 | }) 73 | -------------------------------------------------------------------------------- /INITIAL.md: -------------------------------------------------------------------------------- 1 | > The following instructions document the creation of this repository which was based off a newly created `create-expo-native-app` template. 2 | 3 | # Prepare the Repository 4 | 5 | * `npx create-expo-native-app` - Deploy the template 6 | * `npm install` - Install the dependencies 7 | * `npm run init` - Initialise the template 8 | 9 | The template repository is quite unpolished, with many development artifacts left behind that should have been gitignored. 10 | Here are a list of files which you should be able to safely add to your `.gitignore` file. 11 | _Also remember to remove it from the git cache (`git rm --cached FILE`)_ 12 | 13 | * `.expo/packager-info.json` 14 | * `android/local.properties` 15 | * `app.json` 16 | * `config.json` 17 | 18 | # Prepare the Build Environment 19 | 20 | You should now be able to install the Gradle build environment and its dependencies. 21 | 22 | Ensure you have a Java JDK installed, and have your Android SDK tool license agreements accepted. 23 | _You can accept all licenses with `yes | sdkmanager --licenses`_ 24 | 25 | Firstly, ensure you have a phone connected via ADB, or a Virtual Device prepared. 26 | 27 | * `cd android && ./gradlew installDebug` 28 | 29 | After the build environment is ready, open the `android` folder in Android Studio. 30 | 31 | You should be able to execute the Run command to build and install the application onto your device 32 | 33 | Now check that `npm run android-native` and `npm run android-expo` work. 34 | 35 | # Install the native NFC module 36 | 37 | I ran these commands to get the native NFC module working 38 | 39 | * `npm install featherbear/react-native-mifare-classic-wrapper` - Install the NFC wrapper library 40 | * `react-native link react-native-nfc-manager` - Link library files 41 | * `npm install jetifier` - Install compatibility tool for non-AndroidX libraries 42 | * `npx jetifier` - Let Jetifier do its magic 43 | * Enable Jetifier and AndroidX in `android/gradle.properties` 44 | * _Rebuild the application in Android Studio_ 45 | 46 | # Prepare the Deploy Environment 47 | 48 | To prepare for deployment of your code as an APK file, you will need to change a line in the `ejected.json` file. 49 | 50 | Around line 41 you should see the following 51 | 52 | ``` 53 | "publishManifestPath": "android/app/src/main/assets/shell-app-manifest.json" 54 | ``` 55 | 56 | Change this to 57 | 58 | ``` 59 | "publishManifestPath": "android/app/src/main/assets/kernel-manifest.json" 60 | ``` 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Using Expo with react-native-nfc-manager 2 | --- 3 | 4 | [react-native-nfc-manager]: https://github.com/whitedogg13/react-native-nfc-manager 5 | [Expo]: https://expo.io/ 6 | 7 | > This repository features how to use [react-native-nfc-manager] whilst also maintaining the ability to develop with the [Expo] framework. 8 | 9 | * The code has been adapted from this [article](https://codersera.com/blog/running-expo-react-native-together/) 10 | * This project uses a [custom wrapper](https://github.com/featherbear/react-native-mifare-classic-wrapper) over the [react-native-nfc-manager] library, however usage is the same. 11 | 12 | # General Overview 13 | 14 | [Expo] is a framework for React Native which provides a set of tools and services to allow us to develop React Native applications. Unfortunately, it does support third-party React Native Modules, meaning that you would have to forego using [Expo] if you want to use these third-party modules... usually. 15 | 16 | The `create-expo-native-app` npx template provides a set of scripts that allow us to use both React Native Modules and [Expo] at the same time! By creating stub files, we can make the Babel transpiler use different pieces of code depending on whether the application is running in Native mode, or with Expo. 17 | 18 | When running on Expo mode, these stubs will emulate the behaviour of the React Native Module. 19 | When running on Native mode, the actual React Native Module will be used. 20 | 21 | # Getting Started 22 | 23 | You can have a look at the documented steps that I made [here](./INITIAL.md) 24 | 25 | This repository was developed with the Android environment in mind. For iOS, please look at the original [article](https://codersera.com/blog/running-expo-react-native-together/). 26 | 27 | When running in native / "ejected mode", the platform-specific builds will need to be installed (i.e. X Code and/or Android Studio). For Android, this means we will have to set up `adb`, `gradle`, etc... 28 | 29 | Adding in new libraries would require you to rebuild the application in Android Studio, and deploy them onto your device / emulated device. Actual application development (your React code) is however is still performed as usual (automatic packaging with the Metro bundler) 30 | 31 | ## Stub File 32 | 33 | A stub version can be written to emulate/handle a native module's functionality. 34 | Whilst native modules won't work in Expo, you will still be able to develop your application using Expo; with emulated module functionality. 35 | 36 | Have a look at the `stubs/MifareClassicWrapperStub.js` and `babel.config.js` file for an example of how to set this up. 37 | 38 | ## Deployment 39 | 40 | You can deploy the application via the CLI or via Android Studio. 41 | 42 | Prior to deploying, please run `npm run android-native` to update the configuration files. 43 | Deployed APKs can be found in `android/app/release/` 44 | -------------------------------------------------------------------------------- /android/android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | maven { url 'https://maven.fabric.io/public' } 5 | } 6 | 7 | dependencies { 8 | classpath 'io.fabric.tools:gradle:1.26.1' 9 | } 10 | } 11 | apply plugin: 'com.android.application' 12 | apply plugin: 'io.fabric' 13 | apply plugin: 'devicefarm' 14 | 15 | repositories { 16 | maven { url 'https://maven.fabric.io/public' } 17 | } 18 | 19 | def safeExtGet(prop, fallback) { 20 | rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback 21 | } 22 | 23 | android { 24 | compileSdkVersion safeExtGet("compileSdkVersion", 28) 25 | 26 | compileOptions { 27 | sourceCompatibility JavaVersion.VERSION_1_8 28 | targetCompatibility JavaVersion.VERSION_1_8 29 | } 30 | 31 | defaultConfig { 32 | applicationId 'com.test.expo.nfc' 33 | minSdkVersion safeExtGet("minSdkVersion", 21) 34 | targetSdkVersion safeExtGet("targetSdkVersion", 28) 35 | versionCode 1 36 | versionName '1.0.0' 37 | ndk { 38 | abiFilters 'armeabi-v7a', 'x86' 39 | } 40 | multiDexEnabled true 41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 42 | // Deprecated. Used by net.openid:appauth 43 | manifestPlaceholders = [ 44 | 'appAuthRedirectScheme': 'host.exp.exponent' 45 | ] 46 | } 47 | dexOptions { 48 | javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g" 49 | } 50 | 51 | signingConfigs { 52 | debug { 53 | storeFile file('../debug.keystore') 54 | } 55 | release { 56 | storeFile file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "release-key.jks") 57 | storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD") 58 | keyAlias System.getenv("ANDROID_KEY_ALIAS") 59 | keyPassword System.getenv("ANDROID_KEY_PASSWORD") 60 | } 61 | } 62 | buildTypes { 63 | debug { 64 | debuggable true 65 | ext.enableCrashlytics = false 66 | } 67 | release { 68 | minifyEnabled true 69 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 70 | signingConfig signingConfigs.release 71 | } 72 | } 73 | lintOptions { 74 | abortOnError false 75 | } 76 | packagingOptions { 77 | pickFirst "**" 78 | } 79 | } 80 | 81 | devicefarm { 82 | projectName System.getenv("DEVICEFARM_PROJECT_NAME") 83 | devicePool System.getenv("DEVICEFARM_DEVICE_POOL") 84 | executionTimeoutMinutes 40 85 | authentication { 86 | 87 | accessKey System.getenv("AWS_ACCESS_KEY_ID") 88 | secretKey System.getenv("AWS_SECRET_ACCESS_KEY") 89 | } 90 | } 91 | 92 | configurations.all { 93 | resolutionStrategy { 94 | force 'org.webkit:android-jsc:r245459' 95 | } 96 | } 97 | 98 | // WHEN_PREPARING_SHELL_REMOVE_FROM_HERE 99 | 100 | apply from: 'expo.gradle' 101 | 102 | // WHEN_PREPARING_SHELL_REMOVE_TO_HERE 103 | 104 | apply from: "../../node_modules/react-native-unimodules/gradle.groovy" 105 | 106 | dependencies { 107 | implementation project(':react-native-nfc-manager') 108 | implementation fileTree(dir: 'libs', include: ['*.jar']) 109 | 110 | implementation 'com.android.support:multidex:1.0.1' 111 | 112 | // Our dependencies 113 | implementation "com.android.support:appcompat-v7:$supportLibVersion" 114 | 115 | // Our dependencies from ExpoView 116 | // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE. 117 | implementation "com.android.support:appcompat-v7:$supportLibVersion" 118 | implementation 'com.facebook.android:facebook-android-sdk:5.0.1' 119 | implementation('com.facebook.android:audience-network-sdk:5.1.1') { 120 | exclude module: 'play-services-ads' 121 | } 122 | compileOnly 'org.glassfish:javax.annotation:3.1.1' 123 | implementation 'com.jakewharton:butterknife:9.0.0' 124 | implementation 'de.greenrobot:eventbus:2.4.0' 125 | 126 | implementation 'com.squareup.picasso:picasso:2.5.2' 127 | implementation 'com.google.android.gms:play-services-gcm:15.0.1' 128 | implementation 'com.google.android.gms:play-services-analytics:16.0.1' 129 | implementation 'com.google.android.gms:play-services-maps:15.0.1' 130 | implementation 'com.google.android.gms:play-services-auth:15.0.1' 131 | implementation 'com.google.android.gms:play-services-location:15.0.1' 132 | implementation 'com.google.android.gms:play-services-ads:15.0.1' 133 | // annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1' 134 | // implementation "com.raizlabs.android:DBFlow-Core:2.2.1" 135 | // implementation "com.raizlabs.android:DBFlow:2.2.1" 136 | implementation "com.madgag.spongycastle:core:1.53.0.0" 137 | implementation "com.madgag.spongycastle:prov:1.53.0.0" 138 | debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' 139 | // debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1' 140 | releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' 141 | implementation 'com.facebook.device.yearclass:yearclass:2.1.0' 142 | implementation 'commons-io:commons-io:1.4' 143 | implementation 'me.leolin:ShortcutBadger:1.1.4@aar' 144 | implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' 145 | implementation 'commons-codec:commons-codec:1.10' 146 | implementation 'com.segment.analytics.android:analytics:4.3.0' 147 | implementation 'com.google.zxing:core:3.3.3' 148 | implementation 'net.openid:appauth:0.4.1' 149 | implementation 'com.airbnb.android:lottie:2.5.6' 150 | implementation('io.nlopez.smartlocation:library:3.2.11') { 151 | transitive = false 152 | } 153 | implementation "com.android.support:exifinterface:${safeExtGet("supportLibVersion", "28.0.0")}" 154 | implementation 'com.squareup.okio:okio:1.9.0' 155 | implementation 'com.facebook.soloader:soloader:0.6.0' 156 | 157 | // expo-file-system 158 | implementation 'com.squareup.okhttp3:okhttp:3.10.0' 159 | implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0' 160 | 161 | // Testing 162 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 163 | // We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README 164 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 165 | androidTestImplementation "com.android.support:support-annotations:${safeExtGet("supportLibVersion", "28.0.0")}" 166 | androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.0' 167 | androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1' 168 | androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2' 169 | 170 | testImplementation 'junit:junit:4.12' 171 | testImplementation 'org.mockito:mockito-core:1.10.19' 172 | testImplementation 'org.robolectric:robolectric:3.8' 173 | testImplementation 'com.android.support.test:runner:1.0.2-alpha1' 174 | testImplementation 'com.android.support.test:rules:1.0.2-alpha1' 175 | 176 | 177 | implementation('host.exp.exponent:expoview:35.0.0@aar') { 178 | transitive = true 179 | exclude group: 'com.squareup.okhttp3', module: 'okhttp' 180 | exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection' 181 | } 182 | 183 | 184 | 185 | 186 | api 'org.webkit:android-jsc:r245459' // needs to be before react-native 187 | api 'com.facebook.react:react-native:33.0.0' 188 | 189 | 190 | 191 | 192 | addUnimodulesDependencies([ 193 | modulesPaths : [ 194 | '../../node_modules' 195 | ], 196 | configuration: 'api', 197 | target : 'react-native', 198 | exclude : [ 199 | // You can exclude unneeded modules here. 200 | // By default we exclude FaceDetector 201 | // and Stripe payments APIs. 202 | 'unimodules-face-detector-interface', 203 | 'expo-face-detector', 204 | 'expo-payments-stripe' 205 | 206 | // Adding a name here will also remove the package 207 | // from auto-generated BasePackageList.java 208 | ] 209 | ]) 210 | 211 | } 212 | 213 | // This has to be down here for some reason 214 | apply plugin: 'com.google.gms.google-services' 215 | -------------------------------------------------------------------------------- /android/app/expo.gradle: -------------------------------------------------------------------------------- 1 | // Gradle script for detached apps. 2 | 3 | import org.apache.tools.ant.taskdefs.condition.Os 4 | 5 | void runBefore(String dependentTaskName, Task task) { 6 | Task dependentTask = tasks.findByPath(dependentTaskName); 7 | if (dependentTask != null) { 8 | dependentTask.dependsOn task 9 | } 10 | } 11 | 12 | afterEvaluate { 13 | def expoRoot = file("../../") 14 | def inputExcludes = ["android/**", "ios/**"] 15 | 16 | task exponentPrebuildStep(type: Exec) { 17 | workingDir expoRoot 18 | if (Os.isFamily(Os.FAMILY_WINDOWS)) { 19 | commandLine "cmd", "/c", ".\\node_modules\\expokit\\detach-scripts\\run-exp.bat" 20 | } else { 21 | commandLine "./node_modules/expokit/detach-scripts/run-exp.sh", "prepare-detached-build", "--platform", "android", expoRoot 22 | } 23 | } 24 | runBefore("preBuild", exponentPrebuildStep) 25 | 26 | // Based on https://github.com/facebook/react-native/blob/master/react.gradle 27 | 28 | android.applicationVariants.each { variant -> 29 | def folderName = variant.name 30 | def targetName = folderName.capitalize() 31 | 32 | def assetsDir = file("$buildDir/intermediates/merged_assets/${folderName}/merge${targetName}Assets/out") 33 | 34 | // Bundle task name for variant 35 | def bundleExpoAssetsTaskName = "bundle${targetName}ExpoAssets" 36 | 37 | def currentBundleTask = tasks.create( 38 | name: bundleExpoAssetsTaskName, 39 | type: Exec) { 40 | description = "Expo bundle assets for ${targetName}." 41 | 42 | // Create dirs if they are not there (e.g. the "clean" task just ran) 43 | doFirst { 44 | assetsDir.mkdirs() 45 | } 46 | 47 | // Set up inputs and outputs so gradle can cache the result 48 | inputs.files fileTree(dir: expoRoot, excludes: inputExcludes) 49 | outputs.dir assetsDir 50 | 51 | // Set up the call to exp 52 | workingDir expoRoot 53 | 54 | if (Os.isFamily(Os.FAMILY_WINDOWS)) { 55 | commandLine("cmd", "/c", ".\\node_modules\\expokit\\detach-scripts\\run-exp.bat", "bundle-assets", expoRoot, "--platform", "android", "--dest", assetsDir) 56 | } else { 57 | commandLine("./node_modules/expokit/detach-scripts/run-exp.sh", "bundle-assets", expoRoot, "--platform", "android", "--dest", assetsDir) 58 | } 59 | 60 | enabled targetName.toLowerCase().contains("release") || targetName.toLowerCase().contains("prod") 61 | } 62 | 63 | currentBundleTask.dependsOn("merge${targetName}Resources") 64 | currentBundleTask.dependsOn("merge${targetName}Assets") 65 | 66 | runBefore("process${targetName}Resources", currentBundleTask) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /android/app/fabric.properties: -------------------------------------------------------------------------------- 1 | #Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. 2 | #Sun Dec 13 13:22:06 PST 2015 3 | apiSecret=83176563693e1eefa1a91359c4151b88c3fd17e52ddf6d64416b7f1e0fa9cede 4 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_id": "exponent-5dd6d", 4 | "project_number": "367315174693", 5 | "name": "Exponent Play Services" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "1:367315174693:android:f968efbb41d1fa7a", 11 | "client_id": "android:host.exp.exponent", 12 | "client_type": 1, 13 | "android_client_info": { 14 | "package_name": "com.test.expo.nfc", 15 | "certificate_hash": "" 16 | } 17 | }, 18 | "oauth_client": [], 19 | "api_key": [ 20 | { 21 | "current_key": "" 22 | } 23 | ], 24 | "services": { 25 | "analytics_service": { 26 | "status": 2, 27 | "analytics_property": { 28 | "tracking_id": "UA-76673608-1" 29 | } 30 | }, 31 | "cloud_messaging_service": { 32 | "status": 2, 33 | "apns_config": [] 34 | }, 35 | "appinvite_service": { 36 | "status": 1, 37 | "other_platform_oauth_client": [] 38 | }, 39 | "google_signin_service": { 40 | "status": 1 41 | }, 42 | "ads_service": { 43 | "status": 1 44 | } 45 | } 46 | } 47 | ], 48 | "client_info": [], 49 | "ARTIFACT_VERSION": "1" 50 | } 51 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/ide/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | 20 | # THIS IS VERY VERY BAD. REMOVE AS SOON AS VERSIONING IS FIXED 21 | -dontwarn ** 22 | 23 | 24 | -dontnote ** 25 | 26 | -keep class host.exp.exponent.generated.AppConstants { *; } 27 | 28 | ##### Crashlytics ##### 29 | -keepattributes SourceFile,LineNumberTable 30 | 31 | ##### Expo Universal Modules ##### 32 | 33 | -keepclassmembers class * { 34 | @org.unimodules.core.interfaces.ExpoProp *; 35 | } 36 | -keepclassmembers class * { 37 | @org.unimodules.core.interfaces.ExpoMethod *; 38 | } 39 | 40 | -keepclassmembers class * { 41 | @**.expo.core.interfaces.ExpoProp *; 42 | } 43 | -keepclassmembers class * { 44 | @**.expo.core.interfaces.ExpoMethod *; 45 | } 46 | 47 | -keep @**.expo.core.interfaces.DoNotStrip class * 48 | -keepclassmembers class * { 49 | @**.expo.core.interfaces.DoNotStrip *; 50 | } 51 | 52 | ##### React Native ##### 53 | -keep,allowobfuscation @interface **.facebook.proguard.annotations.DoNotStrip 54 | -keep,allowobfuscation @interface **.facebook.proguard.annotations.KeepGettersAndSetters 55 | -keep,allowobfuscation @interface **.facebook.react.bridge.ReadableType 56 | 57 | # Do not strip any method/class that is annotated with @DoNotStrip 58 | -keep @**.facebook.proguard.annotations.DoNotStrip class * 59 | -keepclassmembers class * { 60 | @**.facebook.proguard.annotations.DoNotStrip *; 61 | } 62 | 63 | -keepclassmembers @**.facebook.proguard.annotations.KeepGettersAndSetters class * { 64 | void set*(***); 65 | *** get*(); 66 | } 67 | 68 | -keep class * extends **.facebook.react.bridge.JavaScriptModule { *; } 69 | -keep class * extends **.facebook.react.bridge.NativeModule { *; } 70 | -keepclassmembers class * { @**.facebook.react.uimanager.UIProp ; } 71 | -keepclassmembers class * { @**.facebook.react.uimanager.ReactProp ; } 72 | -keepclassmembers class * { @**.facebook.react.uimanager.ReactPropGroup ; } 73 | 74 | # TODO: shouldn't need these two rules 75 | -keep interface **.facebook.react.bridge.** { *; } 76 | -keep enum **.facebook.react.bridge.** { *; } 77 | 78 | ##### Versioned React Native ##### 79 | -keep class **.facebook.** { *; } 80 | -keep class abi** { *; } 81 | -keep class versioned** { *; } 82 | -keep class expo.modules** { *; } 83 | 84 | ##### Butterknife ##### 85 | -keep class butterknife.** { *; } 86 | -dontwarn butterknife.internal.** 87 | -keep class **$$ViewBinder { *; } 88 | 89 | -keepclasseswithmembernames class * { 90 | @butterknife.* ; 91 | } 92 | 93 | -keepclasseswithmembernames class * { 94 | @butterknife.* ; 95 | } 96 | 97 | ##### Stetho ##### 98 | -keep class **.facebook.stetho.** { *; } 99 | -dontwarn **.facebook.stetho.** 100 | 101 | ##### fresco ##### 102 | # Keep our interfaces so they can be used by other ProGuard rules. 103 | # See http://sourceforge.net/p/proguard/bugs/466/ 104 | -keep,allowobfuscation @interface **.facebook.common.internal.DoNotStrip 105 | 106 | # Do not strip any method/class that is annotated with @DoNotStrip 107 | -keep @**.facebook.common.internal.DoNotStrip class * 108 | -keepclassmembers class * { 109 | @**.facebook.common.internal.DoNotStrip *; 110 | } 111 | 112 | # Keep native methods 113 | -keepclassmembers class * { 114 | native ; 115 | } 116 | 117 | -dontwarn okio.** 118 | -dontwarn javax.annotation.** 119 | -dontwarn com.android.volley.toolbox.** 120 | 121 | ##### okhttp ##### 122 | -keepattributes Signature 123 | -keepattributes *Annotation* 124 | -keep class com.squareup.okhttp.** { *; } 125 | -keep interface com.squareup.okhttp.** { *; } 126 | # This is also needed by Picasso 127 | -dontwarn com.squareup.okhttp.** 128 | 129 | -keep class okhttp3.** { *; } 130 | -keep interface okhttp3.** { *; } 131 | # This is also needed by Picasso 132 | -dontwarn okhttp3.** 133 | 134 | ##### okio ##### 135 | -keep class sun.misc.Unsafe { *; } 136 | -dontwarn java.nio.file.* 137 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 138 | -dontwarn okio.** 139 | 140 | ##### EventBus ##### 141 | -keepclassmembers class ** { 142 | public void onEvent*(***); 143 | } 144 | 145 | # Only required if you use AsyncExecutor 146 | -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { 147 | (java.lang.Throwable); 148 | } 149 | 150 | ##### Amplitude ##### 151 | -keep class com.amplitude.api.** {*;} 152 | 153 | ##### DBFlow ##### 154 | -keep class com.raizlabs.android.dbflow.config.GeneratedDatabaseHolder 155 | 156 | ##### SpongyCastle ##### 157 | -keep class org.spongycastle.** 158 | -dontwarn org.spongycastle.jce.provider.X509LDAPCertStoreSpi 159 | -dontwarn org.spongycastle.x509.util.LDAPStoreHelper 160 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 55 | 56 | 61 | 62 | 63 | 68 | 69 | 70 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 98 | 99 | 100 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 134 | 135 | 136 | 140 | 141 | 142 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 155 | 156 | 157 | 159 | 160 | 161 | 162 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 216 | 217 | 218 | 222 | 223 | 224 | 228 | 229 | 230 | 236 | 237 | 242 | 243 | 246 | 247 | 248 | 251 | 252 | 253 | 254 | 255 | 256 | 263 | 264 | 266 | 267 | 268 | 269 | 270 | 271 | 274 | 275 | 276 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 291 | 292 | 293 | 294 | 295 | 298 | 299 | 300 | 301 | 302 | 305 | 306 | 307 | 308 | 310 | 311 | 312 | 313 | 314 | 317 | 320 | 323 | 324 | 325 | 326 | 329 | 330 | 331 | 332 | 333 | 334 | 337 | 338 | 339 | 340 | 341 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | -------------------------------------------------------------------------------- /android/app/src/main/assets/kernel-manifest.json: -------------------------------------------------------------------------------- 1 | {"android":{"package":"host.exp.exponent","publishBundlePath":"../android/app/src/main/assets/kernel.android.bundle"},"dependencies":["@expo/react-native-action-sheet","@expo/react-native-fade-in-image","@expo/react-native-touchable-native-feedback-safe","apollo-boost","apollo-cache-inmemory","dedent","es6-error","expo","expo-analytics-amplitude","expo-asset","expo-barcode-scanner","expo-camera","expo-constants","expo-font","expo-linear-gradient","expo-location","expo-permissions","expo-task-manager","expo-web-browser","graphql","graphql-tag","immutable","lodash","prop-types","querystring","react","react-apollo","react-native","react-native-infinite-scroll-view","react-native-is-iphonex","react-native-maps","react-navigation","react-navigation-material-bottom-tabs","react-redux","redux","redux-thunk","sha1","url"],"description":"","extra":{"amplitudeApiKey":"081e5ec53f869b440b225d5e40ec73f9"},"icon":"https://s3.amazonaws.com/exp-brand-assets/ExponentEmptyManifest_192.png","iconUrl":"https://s3.amazonaws.com/exp-brand-assets/ExponentEmptyManifest_192.png","ios":{"bundleIdentifier":"host.exp.exponent","publishBundlePath":"../ios/Exponent/Supporting/kernel.ios.bundle","supportsTablet":true},"isKernel":true,"kernel":{"androidManifestPath":"../android/app/src/main/assets/kernel-manifest.json","iosManifestPath":"../ios/Exponent/Supporting/kernel-manifest.json"},"locales":{},"name":"expo-home","orientation":"portrait","packagerOpts":{"config":"metro.config.js"},"platforms":["ios","android"],"primaryColor":"#cccccc","privacy":"unlisted","scheme":"exp","sdkVersion":"UNVERSIONED","slug":"home","updates":{"checkAutomatically":"ON_LOAD","fallbackToCacheTimeout":0},"version":"33.0.0","id":"@exponent/home","revisionId":"33.0.0-r.n698yDyg9D","publishedTime":"2019-06-11T07:38:00.034Z","commitTime":"2019-06-11T07:38:00.075Z","bundleUrl":"https://exp.host/@exponent/home/bundle","releaseChannel":"default","hostUri":"exp.host/@exponent/home"} -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/MainActivity.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.facebook.react.ReactPackage; 6 | 7 | import org.unimodules.core.interfaces.Package; 8 | 9 | import java.util.List; 10 | 11 | import host.exp.exponent.experience.DetachActivity; 12 | import host.exp.exponent.generated.DetachBuildConstants; 13 | 14 | public class MainActivity extends DetachActivity { 15 | 16 | @Override 17 | public String publishedUrl() { 18 | return "exp://exp.host/@bitcs/nfc"; 19 | } 20 | 21 | @Override 22 | public String developmentUrl() { 23 | return DetachBuildConstants.DEVELOPMENT_URL; 24 | } 25 | 26 | @Override 27 | public List reactPackages() { 28 | return ((MainApplication) getApplication()).getPackages(); 29 | } 30 | 31 | @Override 32 | public List expoPackages() { 33 | return ((MainApplication) getApplication()).getExpoPackages(); 34 | } 35 | 36 | @Override 37 | public boolean isDebug() { 38 | return BuildConfig.DEBUG; 39 | } 40 | 41 | @Override 42 | public Bundle initialProps(Bundle expBundle) { 43 | // Add extra initialProps here 44 | return expBundle; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/MainApplication.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent; 2 | 3 | import com.facebook.react.ReactPackage; 4 | 5 | import org.unimodules.core.interfaces.Package; 6 | 7 | import java.util.Arrays; 8 | import java.util.List; 9 | 10 | import expo.loaders.provider.interfaces.AppLoaderPackagesProviderInterface; 11 | import host.exp.exponent.generated.BasePackageList; 12 | import okhttp3.OkHttpClient; 13 | 14 | // Needed for `react-native link` 15 | // import com.facebook.react.ReactApplication; 16 | import community.revteltech.nfc.NfcManagerPackage; 17 | 18 | public class MainApplication extends ExpoApplication implements AppLoaderPackagesProviderInterface { 19 | 20 | @Override 21 | public boolean isDebug() { 22 | return BuildConfig.DEBUG; 23 | } 24 | 25 | // Needed for `react-native link` 26 | public List getPackages() { 27 | return Arrays.asList( 28 | // Add your own packages here! 29 | // TODO: add native modules! 30 | 31 | // Needed for `react-native link` 32 | // new MainReactPackage(), 33 | new NfcManagerPackage() 34 | ); 35 | } 36 | 37 | public List getExpoPackages() { 38 | return new BasePackageList().getPackageList(); 39 | } 40 | 41 | @Override 42 | public String gcmSenderId() { 43 | return getString(R.string.gcm_defaultSenderId); 44 | } 45 | 46 | public static OkHttpClient.Builder okHttpClientBuilder(OkHttpClient.Builder builder) { 47 | // Customize/override OkHttp client here 48 | return builder; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/generated/AppConstants.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent.generated; 2 | 3 | import com.facebook.common.internal.DoNotStrip; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import host.exp.exponent.BuildConfig; 9 | import host.exp.exponent.Constants; 10 | 11 | @DoNotStrip 12 | public class AppConstants { 13 | 14 | public static final String VERSION_NAME = "2.11.4"; 15 | public static String INITIAL_URL = "exp://exp.host/@bitcs/nfc"; 16 | public static final String SHELL_APP_SCHEME = "exp5a9e8e27c6444abebcda9249f5f0fd44"; 17 | public static final String RELEASE_CHANNEL = "default"; 18 | public static boolean SHOW_LOADING_VIEW_IN_SHELL_APP = true; 19 | public static boolean ARE_REMOTE_UPDATES_ENABLED = true; 20 | public static final List EMBEDDED_RESPONSES; 21 | public static boolean FCM_ENABLED = false; 22 | 23 | static { 24 | List embeddedResponses = new ArrayList<>(); 25 | 26 | // ADD EMBEDDED RESPONSES HERE 27 | // START EMBEDDED RESPONSES 28 | // END EMBEDDED RESPONSES 29 | EMBEDDED_RESPONSES = embeddedResponses; 30 | } 31 | 32 | // Called from expoview/Constants 33 | public static Constants.ExpoViewAppConstants get() { 34 | Constants.ExpoViewAppConstants constants = new Constants.ExpoViewAppConstants(); 35 | constants.VERSION_NAME = VERSION_NAME; 36 | constants.INITIAL_URL = INITIAL_URL; 37 | constants.SHELL_APP_SCHEME = SHELL_APP_SCHEME; 38 | constants.RELEASE_CHANNEL = RELEASE_CHANNEL; 39 | constants.SHOW_LOADING_VIEW_IN_SHELL_APP = SHOW_LOADING_VIEW_IN_SHELL_APP; 40 | constants.ARE_REMOTE_UPDATES_ENABLED = ARE_REMOTE_UPDATES_ENABLED; 41 | constants.EMBEDDED_RESPONSES = EMBEDDED_RESPONSES; 42 | constants.ANDROID_VERSION_CODE = BuildConfig.VERSION_CODE; 43 | constants.FCM_ENABLED = FCM_ENABLED; 44 | return constants; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/generated/BasePackageList.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent.generated; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | import org.unimodules.core.interfaces.Package; 6 | 7 | public class BasePackageList { 8 | public List getPackageList() { 9 | return Arrays.asList( 10 | new expo.modules.av.AVPackage(), 11 | new expo.modules.constants.ConstantsPackage(), 12 | new expo.modules.filesystem.FileSystemPackage(), 13 | new expo.modules.font.FontLoaderPackage(), 14 | new expo.modules.keepawake.KeepAwakePackage(), 15 | new expo.modules.lineargradient.LinearGradientPackage(), 16 | new expo.modules.location.LocationPackage(), 17 | new expo.modules.permissions.PermissionsPackage(), 18 | new expo.modules.sqlite.SQLitePackage(), 19 | new expo.modules.webbrowser.WebBrowserPackage() 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/generated/DetachBuildConstants.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent.generated; 2 | 3 | // This file is auto-generated. Please don't rename! 4 | public class DetachBuildConstants { 5 | 6 | public static final String DEVELOPMENT_URL = ""; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-hdpi/ic_arrow_back_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_home_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-hdpi/ic_home_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_logo_white_32dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-hdpi/ic_logo_white_32dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_refresh_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-hdpi/ic_refresh_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_share_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-hdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/ic_arrow_back_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_home_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/ic_home_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_logo_white_32dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/ic_logo_white_32dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_refresh_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/ic_refresh_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_share_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/shell_launch_background_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-mdpi/shell_launch_background_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_home_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xhdpi/ic_home_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_logo_white_32dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xhdpi/ic_logo_white_32dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_refresh_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xhdpi/ic_refresh_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_share_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xhdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_home_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxhdpi/ic_home_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_logo_white_32dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxhdpi/ic_logo_white_32dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_refresh_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxhdpi/ic_refresh_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_share_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxhdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/big_logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/big_logo_dark.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/big_logo_dark_filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/big_logo_dark_filled.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/big_logo_filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/big_logo_filled.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/big_logo_new_filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/big_logo_new_filled.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_home_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/ic_home_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_logo_white_32dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/ic_logo_white_32dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/ic_refresh_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_share_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/pin_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/pin_white.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/pin_white_fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/pin_white_fade.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/shell_notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/featherbear/expo-nfc-react-native/8c48140e0dd638e02b4af0117b07becd48cf7845/android/app/src/main/res/drawable-xxxhdpi/shell_notification_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splash_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/error_activity_new.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/error_console_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 24 | 25 | 34 | 35 | 44 | 45 | 46 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/error_console_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 19 | 20 | 25 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/error_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 21 | 22 | 31 | 32 | 44 | 45 | 56 | 57 | 66 | 67 | 76 | 77 | 78 | 79 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/exponent_button.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/exponent_check_box.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/exponent_dev_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/notification.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 19 | 20 |