apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'io.fabric' apply plugin: 'com.noveogroup.android.check' apply plugin: 'realm-android' buildscript { repositories { mavenLocal() mavenCentral() maven { url 'https://maven.fabric.io/public' } jcenter() } dependencies { classpath 'io.fabric.tools:gradle:1.25.4' classpath('com.noveogroup.android:check:1.2.5') { exclude module: 'checkstyle' exclude module: 'pmd-java' } classpath 'com.puppycrawl.tools:checkstyle:7.5' classpath 'net.sourceforge.pmd:pmd-java:5.5.3' } } repositories { mavenLocal() mavenCentral() google() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } maven { url 'https://maven.fabric.io/public' } // Material View Pager maven { url "http://dl.bintray.com/florent37/maven" } // Markdown maven { url "https://s3.amazonaws.com/repo.commonsware.com" } maven { url "https://jitpack.io" } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //Networking implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0' //REST API handling implementation('com.squareup.retrofit2:retrofit:2.4.0') { exclude module: 'okhttp' } implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' //Crash Logging releaseImplementation('com.crashlytics.sdk.android:crashlytics:2.9.5@aar') { transitive = true } //Dependency Injection implementation 'com.google.dagger:dagger:2.17' kapt 'com.google.dagger:dagger-compiler:2.17' compileOnly 'javax.annotation:javax.annotation-api:1.3.1' //App Compatibility and Material Design implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:preference-v14:28.0.0' //QR Code implementation 'com.github.kenglxn.QRGen:android:2.5.0' // Emojis implementation 'com.github.viirus:emoji-lib:0.0.5' // Markdown implementation 'com.commonsware.cwac:anddown:0.4.0' // About View for all dependent Libraries, we are using implementation('com.mikepenz:aboutlibraries:5.9.4@aar') { transitive = true } // a better fab alternative implementation 'com.github.clans:fab:1.6.4' //Eventbus implementation 'org.greenrobot:eventbus:3.1.1' // IAP Handling / Verification implementation 'org.solovyev.android:checkout:1.2.1' //Facebook implementation('com.facebook.android:facebook-android-sdk:4.34.0') { transitive = true } implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' //RxJava implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.2' //Analytics implementation 'com.amplitude:android-sdk:2.18.1' implementation 'com.instabug.library:instabug:8.0.3' // Fresco Image Management Library implementation('com.facebook.fresco:fresco:1.11.0') { exclude module: 'bolts-android' } implementation('com.facebook.fresco:animated-gif:1.11.0') { exclude module: 'bolts-android' } //Tests testImplementation 'junit:junit:4.12' testImplementation 'org.assertj:assertj-core:2.6.0' testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2' testImplementation 'org.robolectric:robolectric:3.8' testImplementation 'org.robolectric:shadows-multidex:3.8' testImplementation 'org.robolectric:shadows-support-v4:3.3.2' testImplementation 'org.mockito:mockito-core:2.8.9' testImplementation 'org.powermock:powermock-api-mockito2:1.7.0' testImplementation 'org.powermock:powermock-module-junit4-rule-agent:1.7.0' testImplementation 'org.powermock:powermock-module-junit4-rule:1.7.0' testImplementation 'org.powermock:powermock-module-junit4:1.7.0' //Leak Detection debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2' //Push Notifications implementation 'com.google.firebase:firebase-core:11.4.2' implementation 'com.google.firebase:firebase-messaging:11.4.2' implementation 'com.google.android.gms:play-services-auth:11.4.2' implementation 'com.roughike:bottom-bar:2.3.1' implementation 'io.realm:android-adapters:3.0.0' implementation(project(':seeds-sdk')) { exclude group: 'com.google.android.gms' exclude group: 'com.android.support', module: 'multidex' } implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:multidex:1.0.3' implementation 'com.nex3z:flow-layout:1.2.2' } android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 15 applicationId "com.habitrpg.android.habitica" vectorDrawables.useSupportLibrary = true buildConfigField "String", "STORE", "\"google\"" multiDexEnabled true versionCode 2016 versionName "1.6" } lintOptions { abortOnError false } signingConfigs { release } flavorDimensions "buildType" buildTypes { debug { applicationIdSuffix ".debug" debuggable true multiDexEnabled true minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // Disable fabric build ID generation for debug builds ext.enableCrashlytics = false ext.alwaysUpdateBuildId = false resValue "string", "content_provider", "com.habitrpg.android.habitica.debug.fileprovider" resValue "string", "app_name", "Habitica Debug" } release { signingConfig signingConfigs.release debuggable false multiDexEnabled true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider" resValue "string", "app_name", "Habitica" } } productFlavors { dev { dimension "buildType" } prod { dimension "buildType" } amazon { buildConfigField "String", "STORE", "\"amazon\"" dimension "buildType" } } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src/main/java'] resources.srcDirs = ['src/main/java'] aidl.srcDirs = ['src/main/java'] renderscript.srcDirs = ['src/main/java'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } /*robolectric { manifest.srcFile 'AndroidManifestTesting.xml' java.srcDir file('src/test/java/') res.srcDirs = ['res'] }*/ //instrumentTest.setRoot('tests') release { java.srcDirs = ['src/release/java'] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dexOptions { preDexLibraries false javaMaxHeapSize "6g" // Use gig increments depending on needs } lintOptions { disable 'MissingTranslation','InvalidPackage' enable 'LogConditional','IconExpectedSize','MissingRegistered','TypographyQuotes' } splits { abi { enable true reset() include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' universalApk true } } } Properties props = new Properties() def propFile = new File('signingrelease.properties') if (propFile.canRead()) { props.load(new FileInputStream(propFile)) if (props != null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') && props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) { android.signingConfigs.release.storeFile = file(props['STORE_FILE']) android.signingConfigs.release.storePassword = props['STORE_PASSWORD'] android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] android.signingConfigs.release.keyPassword = props['KEY_PASSWORD'] } else { println 'signing.properties found but some entries are missing' android.buildTypes.release.signingConfig = null } } else { println 'signing.properties not found' android.buildTypes.release.signingConfig = null } // Add Habitica Properties to buildConfigField final File HRPG_PROPS_FILE = new File('habitica.properties') if (HRPG_PROPS_FILE.canRead()) { Properties HRPG_PROPS = new Properties() HRPG_PROPS.load(new FileInputStream(HRPG_PROPS_FILE)) if (HRPG_PROPS != null) { android.buildTypes.all { buildType -> HRPG_PROPS.any { property -> buildType.buildConfigField "String", property.key, "\"${property.value}\"" } } } else { throw new InvalidUserDataException('habitica.properties found but some entries are missing') } } else { throw new MissingResourceException('habitica.properties not found') } // Add Habitica Resources to resources final File HRPG_RES_FILE = new File('habitica.resources') if (HRPG_RES_FILE.canRead()) { Properties HRPG_RES = new Properties() HRPG_RES.load(new FileInputStream(HRPG_RES_FILE)) if (HRPG_RES != null) { android.buildTypes.all { buildType -> HRPG_RES.any { property -> buildType.resValue "string", property.key, "\"${property.value}\"" } } } else { throw new InvalidUserDataException('habitica.resources found but some entries are missing') } } else { throw new MissingResourceException('habitica.resources not found') } tasks.whenTaskAdded { task -> if (task.name == "lint") { task.enabled = false } } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xmaxerrs" << "500" } } check { findbugs { skip true } } apply plugin: 'com.google.gms.google-services'