hunk.code_window: apply plugin: 'com.jakewharton.butterknife'
   android {
     compileSdkVersion 27
     buildToolsVersion "27.0.3"
     defaultConfig {
       minSdkVersion 19
  
hunk.labels: keep keep keep keep replace keep keep keep
hunk.file_path: android/versioned-abis/expoview-abi29_0_0/build.gradle
hunk.type: replace
file: // Copyright (c) 2015-present, Facebook, Inc.
  
  // This source code is licensed under the MIT license found in the
  // LICENSE file in the root directory of this source tree.
  
  apply plugin: 'com.android.library'
  apply plugin: 'maven'
  
  apply plugin: 'de.undercouch.download'
  
  import de.undercouch.gradle.tasks.download.Download
  import org.apache.tools.ant.taskdefs.condition.Os
  import org.apache.tools.ant.filters.ReplaceTokens
  
  // We download various C++ open-source dependencies into downloads.
  // We then copy both the downloaded code and our custom makefiles and headers into third-party-ndk.
  // After that we build native code from src/main/jni with module path pointing at third-party-ndk.
  
  def customDownloadsDir = System.getenv("REACT_NATIVE_DOWNLOADS_DIR")
  def downloadsDir = customDownloadsDir ? new File(customDownloadsDir) : new File("$buildDir/downloads")
  def thirdPartyNdkDir = new File("$buildDir/third-party-ndk")
  
  // You need to have following folders in this directory:
  //   - boost_1_63_0
  //   - double-conversion-1.1.6
  //   - folly-deprecate-dynamic-initializer
  //   - glog-0.3.5
  //   - jsc-headers
  def dependenciesPath = System.getenv("REACT_NATIVE_DEPENDENCIES")
  
  // The Boost library is a very large download (>100MB).
  // If Boost is already present on your system, define the REACT_NATIVE_BOOST_PATH env variable
  // and the build will use that.
  def boostPath = dependenciesPath ?: System.getenv("REACT_NATIVE_BOOST_PATH")
  
  task createNativeDepsDirectories {
      downloadsDir.mkdirs()
      thirdPartyNdkDir.mkdirs()
  }
  
  task downloadBoost(dependsOn: createNativeDepsDirectories, type: Download) {
      src 'https://github.com/react-native-community/boost-for-react-native/releases/download/v1.63.0-0/boost_1_63_0.tar.gz'
      onlyIfNewer true
      overwrite false
      dest new File(downloadsDir, 'boost_1_63_0.tar.gz')
  }
  
  task prepareBoost(dependsOn: boostPath ? [] : [downloadBoost], type: Copy) {
      from boostPath ?: tarTree(resources.gzip(downloadBoost.dest))
      from 'src/main/jni/third-party/boost/Android.mk'
      include 'Android.mk', 'boost_1_63_0/boost/**/*.hpp', 'boost/boost/**/*.hpp'
      includeEmptyDirs = false
      into "$thirdPartyNdkDir/boost"
      doLast {
          file("$thirdPartyNdkDir/boost/boost").renameTo("$thirdPartyNdkDir/boost/boost_1_63_0")
      }
  }
  
  task downloadDoubleConversion(dependsOn: createNativeDepsDirectories, type: Download) {
      src 'https://github.com/google/double-conversion/archive/v1.1.6.tar.gz'
      onlyIfNewer true
      overwrite false
      dest new File(downloadsDir, 'double-conversion-1.1.6.tar.gz')
  }
  
  task prepareDoubleConversion(dependsOn: dependenciesPath ? [] : [downloadDoubleConversion], type: Copy) {
      from dependenciesPath ?: tarTree(downloadDoubleConversion.dest)
      from 'src/main/jni/third-party/double-conversion/Android.mk'
      include 'double-conversion-1.1.6/src/**/*', 'Android.mk'
      filesMatching('*/src/**/*', {fname -> fname.path = "double-conversion/${fname.name}"})
      includeEmptyDirs = false
      into "$thirdPartyNdkDir/double-conversion"
  }
  
  task downloadFolly(dependsOn: createNativeDepsDirectories, type: Download) {
      src 'https://github.com/facebook/folly/archive/v2016.10.31.00.tar.gz'
      onlyIfNewer true
      overwrite false
      dest new File(downloadsDir, 'folly-2016.10.31.00.tar.gz');
  }
  
  task prepareFolly(dependsOn: dependenciesPath ? [] : [downloadFolly], type: Copy) {
      from dependenciesPath ?: tarTree(downloadFolly.dest)
      from 'src/main/jni/third-party/folly/Android.mk'
      include 'folly-2016.10.31.00/folly/**/*', 'Android.mk'
      eachFile {fname -> fname.path = (fname.path - "folly-2016.10.31.00/")}
      includeEmptyDirs = false
      into "$thirdPartyNdkDir/folly"
  }
  
  task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) {
      src 'https://github.com/google/glog/archive/v0.3.5.tar.gz'
      onlyIfNewer true
      overwrite false
      dest new File(downloadsDir, 'glog-0.3.5.tar.gz')
  }
  
  // Prepare glog sources to be compiled, this task will perform steps that normally should've been
  // executed by automake. This way we can avoid dependencies on make/automake
  task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) {
      from dependenciesPath ?: tarTree(downloadGlog.dest)
      from 'src/main/jni/third-party/glog/'
      include 'glog-0.3.5/src/**/*', 'Android.mk', 'config.h'
      includeEmptyDirs = false
      filesMatching('**/*.h.in') {
          filter(ReplaceTokens, tokens: [
                  ac_cv_have_unistd_h: '1',
                  ac_cv_have_stdint_h: '1',
                  ac_cv_have_systypes_h: '1',
                  ac_cv_have_inttypes_h: '1',
                  ac_cv_have_libgflags: '0',
                  ac_google_start_namespace: 'namespace google {',
                  ac_cv_have_uint16_t: '1',
                  ac_cv_have_u_int16_t: '1',
                  ac_cv_have___uint16: '0',
                  ac_google_end_namespace: '}',
                  ac_cv_have___builtin_expect: '1',
                  ac_google_namespace: 'google',
                  ac_cv___attribute___noinline: '__attribute__ ((noinline))',
                  ac_cv___attribute___noreturn: '__attribute__ ((noreturn))',
                  ac_cv___attribute___printf_4_5: '__attribute__((__format__ (__printf__, 4, 5)))'
          ])
          it.path = (it.name - '.in')
      }
      into "$thirdPartyNdkDir/glog"
  }
  
  task downloadJSCHeaders(type: Download) {
      // in sync with webkit SVN revision 174650
      def jscAPIBaseURL = 'https://raw.githubusercontent.com/WebKit/webkit/38b15a3ba3c1b0798f2036f7cea36ffdc096202e/Source/JavaScriptCore/API/'
      def jscHeaderFiles = ['JavaScript.h', 'JSBase.h', 'JSContextRef.h', 'JSObjectRef.h', 'JSRetainPtr.h', 'JSStringRef.h', 'JSValueRef.h', 'WebKitAvailability.h']
      def output = new File(downloadsDir, 'jsc')
      output.mkdirs()
      src(jscHeaderFiles.collect { headerName -> "$jscAPIBaseURL$headerName" })
      onlyIfNewer true
      overwrite false
      dest output
  }
  
  // Create Android.mk library module based on so files from mvn + include headers fetched from webkit.org
  task prepareJSC(dependsOn: dependenciesPath ? [] : [downloadJSCHeaders]) << {
      copy {
          from zipTree(configurations.compile.fileCollection { dep -> dep.name == 'android-jsc' }.singleFile)
          from dependenciesPath ? "$dependenciesPath/jsc-headers" : {downloadJSCHeaders.dest}
          from 'src/main/jni/third-party/jsc/Android.mk'
          include 'jni/**/*.so', '*.h', 'Android.mk'
          filesMatching('*.h', { fname -> fname.path = "JavaScriptCore/${fname.path}"})
          into "$thirdPartyNdkDir/jsc";
      }
  }
  
  task downloadNdkBuildDependencies {
    if (!boostPath) {
      dependsOn downloadBoost
    }
    dependsOn downloadDoubleConversion
    dependsOn downloadFolly
    dependsOn downloadGlog
    dependsOn downloadJSCHeaders
  }
  
  def getNdkBuildName() {
      if (Os.isFamily(Os.FAMILY_WINDOWS)) {
          return "ndk-build.cmd"
      } else {
          return "ndk-build"
      }
  }
  
  def findNdkBuildFullPath() {
      // we allow to provide full path to ndk-build tool
      if (hasProperty('ndk.command')) {
          return property('ndk.command')
      }
      // or just a path to the containing directory
      if (hasProperty('ndk.path')) {
          def ndkDir = property('ndk.path')
          return new File(ndkDir, getNdkBuildName()).getAbsolutePath()
      }
      if (System.getenv('ANDROID_NDK') != null) {
          def ndkDir = System.getenv('ANDROID_NDK')
          return new File(ndkDir, getNdkBuildName()).getAbsolutePath()
      }
      def ndkDir = android.hasProperty('plugin') ? android.plugin.ndkFolder :
      
              plugins.getPlugin('com.android.library').hasProperty('sdkHandler') ?
  
                      plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder() :
  
                      android.ndkDirectory.absolutePath
      if (ndkDir) {
          return new File(ndkDir, getNdkBuildName()).getAbsolutePath()
      }
      return null
  }
  
  def getNdkBuildFullPath() {
      def ndkBuildFullPath = findNdkBuildFullPath()
      if (ndkBuildFullPath == null) {
          throw new GradleScriptException(
              "ndk-build binary cannot be found, check if you've set " +
              "\$ANDROID_NDK environment variable correctly or if ndk.dir is " +
              "setup in local.properties",
              null)
      }
      if (!new File(ndkBuildFullPath).canExecute()) {
          throw new GradleScriptException(
              "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" +
              "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" +
              "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)",
              null)
      }
      return ndkBuildFullPath
  }
  
  task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConversion, prepareFolly, prepareGlog], type: Exec) {
      inputs.file('src/main/jni/react')
      outputs.dir("$buildDir/react-ndk/all")
      commandLine getNdkBuildFullPath(),
              'NDK_PROJECT_PATH=null',
              "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk",
              'NDK_OUT=' + temporaryDir,
              "NDK_LIBS_OUT=$buildDir/react-ndk/all",
              "THIRD_PARTY_NDK_DIR=$buildDir/third-party-ndk",
              "REACT_COMMON_DIR=$projectDir/../ReactCommon",
              '-C', file('src/main/jni/react/jni').absolutePath,
              '--jobs', project.hasProperty("jobs") ? project.property("jobs") : Runtime.runtime.availableProcessors()
  }
  
  task cleanReactNdkLib(type: Exec) {
      commandLine getNdkBuildFullPath(),
              "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk",
              "THIRD_PARTY_NDK_DIR=$buildDir/third-party-ndk",
              "REACT_COMMON_DIR=$projectDir/../ReactCommon",
              '-C', file('src/main/jni/react/jni').absolutePath,
              'clean'
  }
  
  task packageReactNdkLibs(dependsOn: buildReactNdkLib, type: Copy) {
      from "$buildDir/react-ndk/all"
      exclude '**/libjsc.so'
      into "$buildDir/react-ndk/exported"
  }
  
  task packageReactNdkLibsForBuck(dependsOn: packageReactNdkLibs, type: Copy) {
      from "$buildDir/react-ndk/exported"
      into "src/main/jni/prebuilt/lib"
  }
  
  android {
      compileSdkVersion 27
      buildToolsVersion "27.0.3"
  
      defaultConfig {
          minSdkVersion 16
          targetSdkVersion 26
          versionCode 1
          versionName "1.0"
  
          consumerProguardFiles 'proguard-rules.pro'
  
          ndk {
              moduleName "reactnativejni"
          }
  
          buildConfigField 'boolean', 'IS_INTERNAL_BUILD', 'false'
          buildConfigField 'int', 'EXOPACKAGE_FLAGS', '0'
          testApplicationId "com.facebook.react.tests.gradle"
          testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
      }
  
      sourceSets.main {
          jni.srcDirs = []
          jniLibs.srcDir "$buildDir/react-ndk/exported"
          res.srcDirs = ['src/main/res/devsupport', 'src/main/res/shell', 'src/main/res/views/modal', 'src/main/res/views/uimanager']
          java {
              srcDirs = ['src/main/java', 'src/main/libraries/soloader/java', 'src/main/jni/first-party/fb/jni/java']
              exclude 'com/facebook/react/processing'
              exclude 'com/facebook/react/module/processing'
          }
      }
  
      tasks.withType(JavaCompile) {
          compileTask -> compileTask.dependsOn packageReactNdkLibs
      }
  
      clean.dependsOn cleanReactNdkLib
  
      lintOptions {
          abortOnError false
      }
      packagingOptions {
          exclude 'META-INF/NOTICE'
          exclude 'META-INF/LICENSE'
      }
  }
  
  dependencies {
      api 'expolib_v1.com.facebook.infer.annotation:infer-annotation:0.11.2'
      api 'javax.inject:javax.inject:1'
      api 'com.android.support:appcompat-v7:27.1.1'
      api "com.facebook.fresco:fresco:${FRESCO_VERSION}"
      api "com.facebook.fresco:imagepipeline-okhttp3:${FRESCO_VERSION}"
      api 'com.facebook.soloader:soloader:0.5.1'
      api 'com.google.code.findbugs:jsr305:3.0.2'
      api "com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}"
      api "com.squareup.okhttp3:okhttp-urlconnection:${OKHTTP_VERSION}"
      api 'com.squareup.okio:okio:1.14.0'
      compile 'org.webkit:android-jsc:r174650'
      implementation 'expolib_v1.com.squareup.okhttp3:okhttp:3.6.0'
      implementation 'expolib_v1.com.squareup.okio:okio:1.13.0'
      implementation 'expolib_v1.com.squareup.okhttp3:okhttp-urlconnection:3.6.0'
      implementation 'expolib_v1.com.facebook.fresco:expolib_v1-imagepipeline-okhttp3:1.0.1'
  
      testImplementation "junit:junit:${JUNIT_VERSION}"
      testImplementation "org.powermock:powermock-api-mockito:${POWERMOCK_VERSION}"
      testImplementation "org.powermock:powermock-module-junit4-rule:${POWERMOCK_VERSION}"
      testImplementation "org.powermock:powermock-classloading-xstream:${POWERMOCK_VERSION}"
      testImplementation "org.mockito:mockito-core:${MOCKITO_CORE_VERSION}"
      testImplementation "org.easytesting:fest-assert-core:${FEST_ASSERT_CORE_VERSION}"
      testImplementation "org.robolectric:robolectric:${ROBOLECTRIC_VERSION}"
  
      androidTestImplementation fileTree(dir: 'src/main/third-party/java/buck-android-support/', include: ['*.jar'])
      androidTestImplementation 'com.android.support.test:runner:0.3'
      androidTestImplementation "org.mockito:mockito-core:${MOCKITO_CORE_VERSION}"
  }
  
  apply from: 'release.gradle'
  apply from: 'expolib-build.gradle'
  