├── .gitignore ├── .watchmanconfig ├── App.js ├── README.md ├── android ├── android.iml ├── app │ ├── build.gradle │ ├── expo.gradle │ ├── fabric.properties │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ ├── devKernel │ │ └── java │ │ │ └── host │ │ │ └── exp │ │ │ └── exponent │ │ │ └── BuildVariantConstants.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── fonts │ │ │ │ └── EmojiOne.ttf │ │ │ ├── kernel-manifest.json │ │ │ └── kernel.android.bundle │ │ ├── java │ │ │ └── host │ │ │ │ └── exp │ │ │ │ └── exponent │ │ │ │ ├── MainActivity.java │ │ │ │ ├── MainApplication.java │ │ │ │ └── generated │ │ │ │ ├── AppConstants.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 │ │ │ ├── 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_launch_background_image.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 │ │ └── prodKernel │ │ └── java │ │ └── host │ │ └── exp │ │ └── exponent │ │ └── BuildVariantConstants.java ├── build.gradle ├── debug.keystore ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── run.sh └── settings.gradle ├── app.json ├── assets ├── fastlane_match.png ├── github_repo.png ├── icon.png ├── itunesconnect.png └── splash.png ├── babel.config.js ├── ios ├── .gitignore ├── Gemfile ├── Podfile ├── Podfile.lock ├── expokit-fastlane-example.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── expokit-fastlane-example.xcscheme ├── expokit-fastlane-example.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── evanbacon.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── expokit-fastlane-example │ ├── 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 └── fastlane │ ├── Appfile │ ├── Deliverfile │ ├── Fastfile │ ├── Matchfile │ ├── README.md │ ├── metadata │ ├── copyright.txt │ ├── en-US │ │ ├── description.txt │ │ ├── keywords.txt │ │ ├── marketing_url.txt │ │ ├── name.txt │ │ ├── privacy_url.txt │ │ ├── promotional_text.txt │ │ ├── release_notes.txt │ │ ├── subtitle.txt │ │ └── support_url.txt │ ├── primary_category.txt │ ├── primary_first_sub_category.txt │ ├── primary_second_sub_category.txt │ ├── review_information │ │ ├── demo_password.txt │ │ ├── demo_user.txt │ │ ├── email_address.txt │ │ ├── first_name.txt │ │ ├── last_name.txt │ │ ├── notes.txt │ │ └── phone_number.txt │ ├── secondary_category.txt │ ├── secondary_first_sub_category.txt │ ├── secondary_second_sub_category.txt │ └── trade_representative_contact_information │ │ ├── address_line1.txt │ │ ├── address_line2.txt │ │ ├── address_line3.txt │ │ ├── city_name.txt │ │ ├── country.txt │ │ ├── email_address.txt │ │ ├── first_name.txt │ │ ├── is_displayed_on_app_store.txt │ │ ├── last_name.txt │ │ ├── phone_number.txt │ │ ├── postal_code.txt │ │ ├── state.txt │ │ └── trade_name.txt │ ├── report.xml │ └── screenshots │ └── README.txt ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | .expo/* 3 | npm-debug.* 4 | *.jks 5 | *.p12 6 | *.key 7 | *.mobileprovision 8 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { StyleSheet, Text, View } from 'react-native'; 3 | 4 | export default class App extends React.Component { 5 | render() { 6 | return ( 7 | 8 | Open up App.js to start working on your app! 9 | 10 | ); 11 | } 12 | } 13 | 14 | const styles = StyleSheet.create({ 15 | container: { 16 | flex: 1, 17 | backgroundColor: '#fff', 18 | alignItems: 'center', 19 | justifyContent: 'center', 20 | }, 21 | }); 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExpoKit Fastlane 2 | 3 | > This project is deprecated in favor of `eas build` which does almost everything here automatically. 4 | > 5 | 6 | You probably enjoy the luxurious `expo build:ios` command but if you upgrade/eject to add custom native modules then you need a new approach. Here is my favorite way to upload to the app store on iOS. 7 | 8 | > I use the `produce` & `deliver` steps in vanilla Expo too! 9 | 10 | ## Starting from the beginning 11 | 12 | But First! This will not work without a paid Apple Developer account ☹️ 13 | 14 | ### Create an Expo project 15 | 16 | ```sh 17 | $ expo init 18 | 19 | > ? Choose a project name: expokit-fastlane-example 20 | > ? Choose a template: expo-template-blank 21 | > ? Yarn v1.12.3 found. Use Yarn to install dependencies? Yes 22 | 23 | ``` 24 | 25 | ### Then enter the folder 26 | 27 | ```sh 28 | $ cd expokit-fastlane-example/ 29 | ``` 30 | 31 | ### Commit 😁 32 | 33 | ```sh 34 | expokit-fastlane-example $ git add .; git commit -m "init" 35 | ``` 36 | 37 | ### Eject 38 | 39 | ```sh 40 | expokit-fastlane-example $ expo eject 41 | 42 | ? How would you like to eject from create-react-native-app? 43 | 44 | > ExpoKit: I'll create or log in with an Expo account to use React Native and the Expo SDK. 45 | 46 | ? What would you like your iOS bundle identifier to be? 47 | 48 | > com.evanbacon.expokitfastlane 49 | 50 | ? What would you like your Android package name to be? 51 | 52 | > com.evanbacon.expokitfastlane 53 | 54 | ``` 55 | 56 | ### Commit 😊 57 | 58 | ```sh 59 | expokit-fastlane-example $ git add .; git commit -m "ejected" 60 | ``` 61 | 62 | ### Enter the ios folder 63 | 64 | ```sh 65 | expokit-fastlane-example $ cd ios 66 | ``` 67 | 68 | ### Fastlane init 69 | 70 | ```sh 71 | ios $ fastlane init 72 | 73 | ? What would you like to use fastlane for? 74 | 75 | 1. 📸 Automate screenshots 76 | 2. 👩‍✈️ Automate beta distribution to TestFlight 77 | 3. 🚀 Automate App Store distribution 78 | 4. 🛠 Manual setup - manually setup your project to automate your tasks 79 | 80 | > 3 81 | 82 | ``` 83 | 84 | ```sh 85 | 86 | ? Apple ID Username: 87 | 88 | > evanjbacon@gmail.com 89 | 90 | ``` 91 | 92 | I got this error, then I changed the ID, and still got it 🙃 so just pass `n` in the next bit cuz I think it's a fastlane bug. 93 | 94 | `It looks like the app 'com.bacon.expokitfastlane' isn't available on the Apple Developer Portal for the team ID 'QQ57RJ5UTD' on Apple ID 'evanjbacon@gmail.com'` 95 | 96 | ```sh 97 | ? Do you want fastlane to create the App ID for you on the Apple Developer Portal? (y/n): 98 | 99 | > n 100 | ``` 101 | 102 | ```sh 103 | 104 | $ [22:49:14]: --- ✅ Successfully generated fastlane configuration --- 105 | 106 | ``` 107 | 108 | Then just hit enter a bunch of times... 109 | 110 | ### Commit 😏 111 | 112 | ```sh 113 | expokit-fastlane-example $ git add .; git commit -m "fastlane init" 114 | ``` 115 | 116 | ### Create the App Entry 117 | 118 | At this point you should have a new folder `ios/fastlane/` with a `Fastfile` & `Appfile`. Ideally we want a `Deliverfile` & `Matchfile` too. 119 | 120 | If you hit the bundle ID snag then you need to create an app in Appstore Connect (formerly iTunes Connect). This is very easy, or at least it should be. 121 | 122 | ```sh 123 | 124 | ios $ fastlane produce init 125 | 126 | ``` 127 | 128 | You may need to sign-in to your account, sometimes it'll just auto authenticate. 129 | 130 | ```sh 131 | 132 | ? App Name: 133 | 134 | > ExpoKit Fastlane 135 | 136 | ``` 137 | 138 | Now you've `Successfully created new app 'ExpoKit Fastlane' on App Store Connect with ID`! 139 | 140 | You won't see any git changes but if you go to [AppStore Connect](https://appstoreconnect.apple.com/) you should see a new app created and ready for you! 141 | 142 | ![AppEntry](https://github.com/EvanBacon/ExpoKit-Fastlane-Example/blob/master/assets/itunesconnect.png?raw=true) 143 | 144 | ### Setup Metadata with Deliver 145 | 146 | This part is cool: 147 | 148 | - [Here are the official docs](https://docs.fastlane.tools/actions/deliver/#deliver) 149 | - [Here is another one of my rants](https://blog.expo.io/manage-app-store-metadata-in-expo-with-fastlane-deliver-1c00e06b73bf) 150 | 151 | You can use this in vanilla Expo or ExpoKit! 152 | 153 | ```sh 154 | ios $ fastlane deliver init 155 | ``` 156 | 157 | You may need to sign in, note that I'm running all of these commands in `ios/`. If you don't then you will need to specify the bundle ID. 158 | 159 | ### Commit 😕 160 | 161 | ```sh 162 | expokit-fastlane-example $ git add .; git commit -m "fastlane deliver init" 163 | ``` 164 | 165 | ### Deliver 166 | 167 | At this point you can type `fastlane deliver` and it will push all of the blank metadata to the App Store entry. 168 | 169 | ### Code Sign with Match 170 | 171 | - [Here are the official docs](https://docs.fastlane.tools/actions/match/#setup) 172 | 173 | Now we need to do our code signing. If you know any iOS developer, you've probably seen the sadness luming deep in their solemn gaze. This is because of iOS code signing; a digital signature system that has a few less-than simple steps. 174 | 175 | Translation: it's fucking bullshit. 176 | 177 | But we can skip the entire process with one line! 😮 178 | 179 | ```sh 180 | 181 | fastlane match init 182 | 183 | ``` 184 | 185 | This will ask you for the URL to a **private** repo. I think you can get a free one on gitlab. If you have a paid Github account you can make as many as you want. (💪 don't wanna brag but... I don't like to pay for stuff) 186 | 187 | ![repo](https://github.com/EvanBacon/ExpoKit-Fastlane-Example/blob/master/assets/github_repo.png?raw=true) 188 | 189 | Name the repo something like `project-certificates` or whatever you want. 190 | 191 | If your computer is setup with SSH then you should use the `git` URL, otherwise the `https` one is aight too. 192 | 193 | ```sh 194 | 195 | ? URL of the Git Repo: 196 | 197 | > git@github.com:EvanBacon/expokit-fastlane-example-certificates.git 198 | 199 | ``` 200 | 201 | Now you should have a `ios/Matchfile` 202 | 203 | Just to be safe, make sure your "Automatically manage signing" option in the general tab of your `ios/.xcworkspace` project is **UNCHECKED** and after we run the next two commands, you'll want to select the eligible profiles. 204 | 205 | If you've already messed with your signing then check out this neat command [**MATCH NUKE**](https://docs.fastlane.tools/actions/match/#nuke) 206 | 207 | ![complex diagram](https://github.com/EvanBacon/ExpoKit-Fastlane-Example/blob/master/assets/fastlane_match.png?raw=true) 208 | 209 | ### Configure the Certs 210 | 211 | > Certs = certificates 😗 212 | 213 | ```sh 214 | fastlane match appstore 215 | 216 | ? Passphrase for Git Repo: 217 | 218 | > writingTutorialsOnFridayNightIsCool 219 | 220 | # [23:45:45]: All required keys, certificates and provisioning profiles are installed 🙌 221 | 222 | ``` 223 | 224 | ### Now run this (you need both) 225 | 226 | ```sh 227 | 228 | fastlane match development 229 | 230 | # [23:46:48]: All required keys, certificates and provisioning profiles are installed 🙌 231 | 232 | ``` 233 | 234 | _From the docs:_ 235 | 236 | This will create a new certificate and provisioning profile (if required) and store them in your Git repo. If you previously ran match it will automatically install the existing profiles from the Git repo. 237 | 238 | The provisioning profiles are installed in ~/Library/MobileDevice/Provisioning Profiles while the certificates and private keys are installed in your Keychain. 239 | 240 | ### Install Pods 241 | 242 | You can prolly skip this (entire tutorial). 243 | 244 | In `ios/` run `pod install` to download all of the dependencies. 245 | 246 | ### Should I Commit the Pods 247 | 248 | _TL;DR_: [Cocoapods officially say "commit ur shit boi"](https://guides.cocoapods.org/using/using-cocoapods#should-i-check-the-pods-directory-into-source-control) 249 | 250 | After you install your libs you may notice a lot of extra files in your git repo. Cocoapods have a `ios/Podfile.lock` that is generated after running `pod install`, this file should always be committed. You can use this file to regenerate your `ios/Pods/` folder. 251 | React Native pods are usually always _"development pods"_ which means they are local. Specifically they are stored in the `node_modules` folders. Because of this, there is a lot of ambiguity over wheather or not you should commit the `ios/Pods/`. 252 | 253 | I don't save them, I have commitment issues 🤓 254 | 255 | ### Publish 256 | 257 | Finally we're done! 258 | 259 | In `ios/` run `fastlane release` to generate the `.ipa` file 😁 this will also push the file to AppStore Connect! 260 | 261 | ### Update the Metadata 262 | 263 | You can also run `fastlane deliver` to push all of your local metadata. I usually set the categories in the app store connect website then run `fastlane deliver download_metadata` which downloads the metadata into the local copy. This is cool because you can git commit the files. You can push up the data faster with `fastlane deliver --skip_binary_upload --skip_screenshots` also `--force` to skip the HTML preview. 264 | 265 | ### OTA Updates 266 | 267 | Use `expo publish` to upload your JS changes whenever you want. If you change native code, or update the Expo version, or use a different release channel - the changes may not (won't) show up. The CLI should warn you about this. 268 | 269 | ### Commit 🙁 270 | 271 | ```sh 272 | expokit-fastlane-example $ git add .; git commit -m "fastlane deliver init" 273 | ``` 274 | 275 | ## Extra Credit 276 | 277 | Here are a couple of other things I do to make life easy. 278 | 279 | ### Setup notifications 280 | 281 | I use this library: https://www.npmjs.com/package/expo-firebase-messaging the instructions are something like `fastlane pem` then upload the files to firebase. By default this will produce prod keys, you can add `--development` to get the development pods 282 | 283 | ### Add a Deliverfile 284 | 285 | Create a file `ios/Deliverfile` I usually just do the following. The last line is really the only extra functionality, everything else is added convenience (which is pretty important if you're lazy and sloppy like me) 286 | 287 | ```rb 288 | app_identifier "com.bacon.expokitfastlane" # The bundle identifier of your app 289 | username "evanjbacon@gmail.com" # your Apple ID user 290 | 291 | copyright "#{Time.now.year} Evan Bacon" 292 | ``` 293 | 294 | I usually have a git submodule for `ios/fastlane/metadata/trade_representative_contact_information` because it's my business data and it never changes. 295 | 296 | ### Patch Functions 297 | 298 | You can add patch functions to your Fastfile if you want. It's a popular thing, I never use it though 😏 299 | 300 | ```rb 301 | 302 | desc "Increment the app version patch" 303 | lane :bumpPatch do 304 | increment_version_number( 305 | bump_type: "patch" 306 | ) 307 | end 308 | 309 | desc "Increment the app version minor" 310 | lane :bumpMinor do 311 | increment_version_number( 312 | bump_type: "minor" 313 | ) 314 | end 315 | 316 | desc "Increment the app version major" 317 | lane :bumpMajor do 318 | increment_version_number( 319 | bump_type: "major" 320 | ) 321 | end 322 | 323 | ``` 324 | 325 | ## Fin 326 | 327 | That's it for now follow [@baconbrix](https://twitter.com/Baconbrix) 328 | -------------------------------------------------------------------------------- /android/android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /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.+' 9 | } 10 | } 11 | apply plugin: 'com.android.application' 12 | apply plugin: 'io.fabric' 13 | 14 | repositories { 15 | maven { url 'https://maven.fabric.io/public' } 16 | } 17 | 18 | android { 19 | compileSdkVersion 27 20 | buildToolsVersion '27.0.3' 21 | 22 | defaultConfig { 23 | applicationId 'com.evanbacon.expokitfastlane' 24 | targetSdkVersion 26 25 | versionCode 1 26 | versionName '1.0.0' 27 | ndk { 28 | abiFilters 'armeabi-v7a', 'x86' 29 | } 30 | multiDexEnabled true 31 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 32 | // Deprecated. Used by net.openid:appauth 33 | manifestPlaceholders = [ 34 | 'appAuthRedirectScheme': 'host.exp.exponent' 35 | ] 36 | } 37 | dexOptions { 38 | javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g" 39 | } 40 | 41 | flavorDimensions 'minSdk', 'remoteKernel' 42 | productFlavors { 43 | devKernel { 44 | dimension 'remoteKernel' 45 | } 46 | prodKernel { 47 | dimension 'remoteKernel' 48 | } 49 | devMinSdk { 50 | dimension 'minSdk' 51 | // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin 52 | // to pre-dex each module and produce an APK that can be tested on 53 | // Android Lollipop without time consuming dex merging processes. 54 | minSdkVersion 21 55 | } 56 | prodMinSdk { 57 | dimension 'minSdk' 58 | minSdkVersion 21 59 | } 60 | } 61 | buildTypes { 62 | debug { 63 | debuggable true 64 | ext.enableCrashlytics = false 65 | } 66 | release { 67 | minifyEnabled true 68 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 69 | zipAlignEnabled true 70 | } 71 | } 72 | signingConfigs { 73 | debug { 74 | storeFile file('../debug.keystore') 75 | } 76 | } 77 | lintOptions { 78 | abortOnError false 79 | } 80 | packagingOptions { 81 | pickFirst "**" 82 | } 83 | configurations.all { 84 | resolutionStrategy.force 'com.android.support:design:27.1.0' 85 | } 86 | } 87 | 88 | 89 | configurations.all { 90 | resolutionStrategy { 91 | force 'org.webkit:android-jsc:r224109' 92 | } 93 | } 94 | 95 | 96 | apply from: 'expo.gradle' 97 | 98 | 99 | dependencies { 100 | implementation fileTree(dir: 'libs', include: ['*.jar']) 101 | 102 | implementation 'com.android.support:multidex:1.0.1' 103 | 104 | // Our dependencies 105 | implementation 'com.android.support:appcompat-v7:27.1.1' 106 | 107 | // Our dependencies from ExpoView 108 | // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE. 109 | implementation 'com.android.support:appcompat-v7:27.1.1' 110 | implementation 'com.facebook.android:facebook-android-sdk:4.37.0' 111 | implementation('com.facebook.android:audience-network-sdk:4.99.0') { 112 | exclude module: 'play-services-ads' 113 | } 114 | compileOnly 'org.glassfish:javax.annotation:3.1.1' 115 | implementation 'com.jakewharton:butterknife:8.4.0' 116 | implementation 'de.greenrobot:eventbus:2.4.0' 117 | implementation 'com.amplitude:android-sdk:2.9.2' // Be careful when upgrading! Upgrading might break experience scoping. Check with Jesse. See Analytics.resetAmplitudeDatabaseHelper 118 | implementation 'com.squareup.picasso:picasso:2.5.2' 119 | implementation 'com.google.android.gms:play-services-gcm:15.0.1' 120 | implementation 'com.google.android.gms:play-services-analytics:16.0.1' 121 | implementation 'com.google.android.gms:play-services-maps:15.0.1' 122 | implementation 'com.google.android.gms:play-services-auth:15.0.1' 123 | implementation 'com.google.android.gms:play-services-location:15.0.1' 124 | implementation 'com.google.android.gms:play-services-ads:15.0.1' 125 | annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1' 126 | implementation "com.raizlabs.android:DBFlow-Core:2.2.1" 127 | implementation "com.raizlabs.android:DBFlow:2.2.1" 128 | implementation "com.madgag.spongycastle:core:1.53.0.0" 129 | implementation "com.madgag.spongycastle:prov:1.53.0.0" 130 | debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' 131 | // debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1' 132 | releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' 133 | implementation 'com.facebook.device.yearclass:yearclass:1.0.1' 134 | implementation 'commons-io:commons-io:1.3.2' 135 | implementation 'me.leolin:ShortcutBadger:1.1.4@aar' 136 | implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 137 | implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.7' 138 | implementation 'com.yqritc:android-scalablevideoview:1.0.1' 139 | implementation 'commons-codec:commons-codec:1.10' 140 | implementation 'com.segment.analytics.android:analytics:4.3.0' 141 | implementation 'com.google.zxing:core:3.2.1' 142 | implementation 'net.openid:appauth:0.4.1' 143 | implementation('com.airbnb.android:lottie:2.5.5') { 144 | exclude group: 'com.android.support', module: 'appcompat-v7' 145 | } 146 | implementation 'io.branch.sdk.android:library:2.17.1' 147 | implementation('io.nlopez.smartlocation:library:3.2.11') { 148 | transitive = false 149 | } 150 | implementation 'com.android.support:exifinterface:27.1.1' 151 | implementation 'com.squareup.okio:okio:1.9.0' 152 | implementation 'com.facebook.soloader:soloader:0.5.1' 153 | 154 | implementation 'com.google.android.exoplayer:exoplayer:2.6.1' 155 | implementation 'expolib_v1.com.google.android.exoplayer:expolib_v1-extension-okhttp:2.6.1@aar' 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:27.1.1' 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:31.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 | // This has to be down here for some reason 187 | apply plugin: 'com.google.gms.google-services' 188 | -------------------------------------------------------------------------------- /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 targetName = variant.name.capitalize() 30 | def targetPath = variant.dirName 31 | 32 | def assetsDir = file("$buildDir/intermediates/assets/${targetPath}") 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.evanbacon.expokitfastlane", 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 | @expo.core.interfaces.ExpoProp *; 35 | } 36 | -keepclassmembers class * { 37 | @expo.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 | ##### React Native ##### 48 | -keep,allowobfuscation @interface **.facebook.proguard.annotations.DoNotStrip 49 | -keep,allowobfuscation @interface **.facebook.proguard.annotations.KeepGettersAndSetters 50 | -keep,allowobfuscation @interface **.facebook.react.bridge.ReadableType 51 | 52 | # Do not strip any method/class that is annotated with @DoNotStrip 53 | -keep @**.facebook.proguard.annotations.DoNotStrip class * 54 | -keepclassmembers class * { 55 | @**.facebook.proguard.annotations.DoNotStrip *; 56 | } 57 | 58 | -keepclassmembers @**.facebook.proguard.annotations.KeepGettersAndSetters class * { 59 | void set*(***); 60 | *** get*(); 61 | } 62 | 63 | -keep class * extends **.facebook.react.bridge.JavaScriptModule { *; } 64 | -keep class * extends **.facebook.react.bridge.NativeModule { *; } 65 | -keepclassmembers class * { @**.facebook.react.uimanager.UIProp ; } 66 | -keepclassmembers class * { @**.facebook.react.uimanager.ReactProp ; } 67 | -keepclassmembers class * { @**.facebook.react.uimanager.ReactPropGroup ; } 68 | 69 | # TODO: shouldn't need these two rules 70 | -keep interface **.facebook.react.bridge.** { *; } 71 | -keep enum **.facebook.react.bridge.** { *; } 72 | 73 | ##### Versioned React Native ##### 74 | -keep class **.facebook.** { *; } 75 | -keep class abi** { *; } 76 | -keep class versioned** { *; } 77 | 78 | ##### Butterknife ##### 79 | -keep class butterknife.** { *; } 80 | -dontwarn butterknife.internal.** 81 | -keep class **$$ViewBinder { *; } 82 | 83 | -keepclasseswithmembernames class * { 84 | @butterknife.* ; 85 | } 86 | 87 | -keepclasseswithmembernames class * { 88 | @butterknife.* ; 89 | } 90 | 91 | ##### Stetho ##### 92 | -keep class **.facebook.stetho.** { *; } 93 | -dontwarn **.facebook.stetho.** 94 | 95 | ##### fresco ##### 96 | # Keep our interfaces so they can be used by other ProGuard rules. 97 | # See http://sourceforge.net/p/proguard/bugs/466/ 98 | -keep,allowobfuscation @interface **.facebook.common.internal.DoNotStrip 99 | 100 | # Do not strip any method/class that is annotated with @DoNotStrip 101 | -keep @**.facebook.common.internal.DoNotStrip class * 102 | -keepclassmembers class * { 103 | @**.facebook.common.internal.DoNotStrip *; 104 | } 105 | 106 | # Keep native methods 107 | -keepclassmembers class * { 108 | native ; 109 | } 110 | 111 | -dontwarn okio.** 112 | -dontwarn javax.annotation.** 113 | -dontwarn com.android.volley.toolbox.** 114 | 115 | ##### okhttp ##### 116 | -keepattributes Signature 117 | -keepattributes *Annotation* 118 | -keep class com.squareup.okhttp.** { *; } 119 | -keep interface com.squareup.okhttp.** { *; } 120 | # This is also needed by Picasso 121 | -dontwarn com.squareup.okhttp.** 122 | 123 | -keep class okhttp3.** { *; } 124 | -keep interface okhttp3.** { *; } 125 | # This is also needed by Picasso 126 | -dontwarn okhttp3.** 127 | 128 | ##### okio ##### 129 | -keep class sun.misc.Unsafe { *; } 130 | -dontwarn java.nio.file.* 131 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 132 | -dontwarn okio.** 133 | 134 | ##### EventBus ##### 135 | -keepclassmembers class ** { 136 | public void onEvent*(***); 137 | } 138 | 139 | # Only required if you use AsyncExecutor 140 | -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { 141 | (java.lang.Throwable); 142 | } 143 | 144 | ##### Amplitude ##### 145 | -keep class com.amplitude.api.** {*;} 146 | 147 | ##### DBFlow ##### 148 | -keep class com.raizlabs.android.dbflow.config.GeneratedDatabaseHolder 149 | 150 | ##### SpongyCastle ##### 151 | -keep class org.spongycastle.** 152 | -dontwarn org.spongycastle.jce.provider.X509LDAPCertStoreSpi 153 | -dontwarn org.spongycastle.x509.util.LDAPStoreHelper 154 | -------------------------------------------------------------------------------- /android/app/src/devKernel/java/host/exp/exponent/BuildVariantConstants.java: -------------------------------------------------------------------------------- 1 | // Copyright 2015-present 650 Industries. All rights reserved. 2 | 3 | package host.exp.exponent; 4 | 5 | public class BuildVariantConstants { 6 | 7 | public static final boolean USE_INTERNET_KERNEL = false; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /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 | 49 | 55 | 56 | 62 | 63 | 64 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 99 | 100 | 101 | 102 | 103 | 104 | 110 | 111 | 112 | 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 | 158 | 159 | 160 | 164 | 165 | 166 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 179 | 180 | 181 | 182 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 212 | 213 | 214 | 218 | 219 | 220 | 224 | 225 | 226 | 232 | 233 | 238 | 239 | 242 | 243 | 244 | 247 | 248 | 249 | 250 | 251 | 252 | 259 | 260 | 262 | 263 | 264 | 265 | 266 | 267 | 270 | 271 | 272 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 287 | 288 | 289 | 290 | 291 | 294 | 295 | 296 | 297 | 298 | 301 | 302 | 303 | 304 | 306 | 307 | 308 | 309 | 310 | 313 | 316 | 319 | 320 | 321 | 322 | 325 | 326 | 327 | 328 | 329 | 330 | 333 | 334 | 335 | 336 | 337 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/EmojiOne.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/android/app/src/main/assets/fonts/EmojiOne.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/kernel-manifest.json: -------------------------------------------------------------------------------- 1 | {"android":{"package":"host.exp.exponent","publishBundlePath":"../android/app/src/main/assets/kernel.android.bundle"},"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":"rn-cli.config.js"},"platforms":["ios","android"],"primaryColor":"#cccccc","privacy":"unlisted","scheme":"exp","sdkVersion":"UNVERSIONED","slug":"home","updates":{"checkAutomatically":"ON_LOAD","fallbackToCacheTimeout":0},"version":"31.0.0","id":"@exponent/home","revisionId":"31.0.0-r.9xQ3Zd5ANq","publishedTime":"2018-10-30T08:40:08.925Z","commitTime":"2018-10-30T08:40:08.970Z","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 java.util.ArrayList; 8 | import java.util.Arrays; 9 | import java.util.Collections; 10 | import java.util.List; 11 | 12 | import expo.core.interfaces.Package; 13 | import host.exp.exponent.generated.DetachBuildConstants; 14 | import host.exp.exponent.experience.DetachActivity; 15 | 16 | public class MainActivity extends DetachActivity { 17 | 18 | @Override 19 | public String publishedUrl() { 20 | return "exp://exp.host/@bacon/expokit-fastlane-example"; 21 | } 22 | 23 | @Override 24 | public String developmentUrl() { 25 | return DetachBuildConstants.DEVELOPMENT_URL; 26 | } 27 | 28 | @Override 29 | public List sdkVersions() { 30 | return new ArrayList<>(Arrays.asList("31.0.0")); 31 | } 32 | 33 | @Override 34 | public List reactPackages() { 35 | return ((MainApplication) getApplication()).getPackages(); 36 | } 37 | 38 | @Override 39 | public List expoPackages() { 40 | // Here you can add your own packages. 41 | return super.expoPackages(); 42 | } 43 | 44 | @Override 45 | public boolean isDebug() { 46 | return BuildConfig.DEBUG; 47 | } 48 | 49 | @Override 50 | public Bundle initialProps(Bundle expBundle) { 51 | // Add extra initialProps here 52 | return expBundle; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /android/app/src/main/java/host/exp/exponent/MainApplication.java: -------------------------------------------------------------------------------- 1 | package host.exp.exponent; 2 | 3 | 4 | import com.facebook.react.ReactPackage; 5 | 6 | import java.util.Arrays; 7 | import java.util.List; 8 | 9 | import expolib_v1.okhttp3.OkHttpClient; 10 | 11 | // Needed for `react-native link` 12 | // import com.facebook.react.ReactApplication; 13 | 14 | public class MainApplication extends ExpoApplication { 15 | 16 | @Override 17 | public boolean isDebug() { 18 | return BuildConfig.DEBUG; 19 | } 20 | 21 | // Needed for `react-native link` 22 | public List getPackages() { 23 | return Arrays.asList( 24 | // Add your own packages here! 25 | // TODO: add native modules! 26 | 27 | // Needed for `react-native link` 28 | // new MainReactPackage() 29 | ); 30 | } 31 | 32 | @Override 33 | public String gcmSenderId() { 34 | return getString(R.string.gcm_defaultSenderId); 35 | } 36 | 37 | @Override 38 | public boolean shouldUseInternetKernel() { 39 | return BuildVariantConstants.USE_INTERNET_KERNEL; 40 | } 41 | 42 | public static OkHttpClient.Builder okHttpClientBuilder(OkHttpClient.Builder builder) { 43 | // Customize/override OkHttp client here 44 | return builder; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /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.9.2"; 15 | public static String INITIAL_URL = "exp://exp.host/@bacon/expokit-fastlane-example"; 16 | public static final boolean IS_DETACHED = true; 17 | public static final String SHELL_APP_SCHEME = "exp1d48cb1894444d81ae76b53afd67644d"; 18 | public static final String RELEASE_CHANNEL = "default"; 19 | public static boolean SHOW_LOADING_VIEW_IN_SHELL_APP = false; 20 | public static boolean ARE_REMOTE_UPDATES_ENABLED = true; 21 | public static final List EMBEDDED_RESPONSES; 22 | public static boolean FCM_ENABLED = false; 23 | 24 | static { 25 | List embeddedResponses = new ArrayList<>(); 26 | 27 | // ADD EMBEDDED RESPONSES HERE 28 | // START EMBEDDED RESPONSES 29 | // END EMBEDDED RESPONSES 30 | EMBEDDED_RESPONSES = embeddedResponses; 31 | } 32 | 33 | // Called from expoview/Constants 34 | public static Constants.ExpoViewAppConstants get() { 35 | Constants.ExpoViewAppConstants constants = new Constants.ExpoViewAppConstants(); 36 | constants.VERSION_NAME = VERSION_NAME; 37 | constants.INITIAL_URL = INITIAL_URL; 38 | constants.IS_DETACHED = IS_DETACHED; 39 | constants.SHELL_APP_SCHEME = SHELL_APP_SCHEME; 40 | constants.RELEASE_CHANNEL = RELEASE_CHANNEL; 41 | constants.SHOW_LOADING_VIEW_IN_SHELL_APP = SHOW_LOADING_VIEW_IN_SHELL_APP; 42 | constants.ARE_REMOTE_UPDATES_ENABLED = ARE_REMOTE_UPDATES_ENABLED; 43 | constants.EMBEDDED_RESPONSES = EMBEDDED_RESPONSES; 44 | constants.ANDROID_VERSION_CODE = BuildConfig.VERSION_CODE; 45 | constants.FCM_ENABLED = FCM_ENABLED; 46 | return constants; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/android/app/src/main/res/drawable-mdpi/ic_share_white_36dp.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/pin_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/android/app/src/main/res/drawable-xxxhdpi/pin_white_fade.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/shell_launch_background_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/android/app/src/main/res/drawable-xxxhdpi/shell_launch_background_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/shell_notification_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EvanBacon/ExpoKit-Fastlane-Example/6c0667029019aea54d9ff8111c2e2096bd9ef2cc/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 |