plugins { id 'com.github.triplet.play' version '2.7.2' apply false } apply from: '../gitutils.gradle' apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-parcelize' apply from: "$rootDir/jacoco.gradle" def isRunningOnTravisAndIsNotPRBuild = System.getenv("CI") == "true" && file('../play.p12').exists() if (isRunningOnTravisAndIsNotPRBuild) { apply plugin: 'com.github.triplet.play' } dependencies { // Utils implementation 'in.yuvi:http.fluent:1.3' implementation 'com.google.code.gson:gson:2.8.5' implementation ("com.squareup.okhttp3:okhttp:$OKHTTP_VERSION!!"){ // Forcing dependency versions using force = true on a first-level dependency has been deprecated. // Ref: https://docs.gradle.org/7.5/userguide/upgrading_version_5.html#forced_dependencies //force = true //API 19 support } implementation 'com.squareup.retrofit2:retrofit:2.8.1' implementation "com.squareup.retrofit2:converter-gson:2.8.1" implementation "com.squareup.retrofit2:adapter-rxjava2:2.8.1" implementation 'com.squareup.okio:okio:2.2.2' implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.3' implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0' implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.1.1' implementation 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.1.1' implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.1.1' implementation 'com.facebook.fresco:fresco:1.13.0' implementation 'org.apache.commons:commons-lang3:3.8.1' // UI implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.github.pedrovgs:renderers:3.3.3' implementation "org.maplibre.gl:android-sdk:$MAPLIBRE_VERSION" implementation 'org.maplibre.gl:android-plugin-scalebar-v9:1.0.0' implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.github.deano2390:MaterialShowcaseView:1.2.0' implementation 'com.dinuscxj:circleprogressbar:1.1.1' implementation 'com.karumi:dexter:5.0.0' implementation "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' kapt "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" implementation "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:$ADAPTER_DELEGATES_VERSION" implementation "com.hannesdorfmann:adapterdelegates4-pagination:$ADAPTER_DELEGATES_VERSION" implementation "androidx.paging:paging-runtime-ktx:$PAGING_VERSION" testImplementation "androidx.paging:paging-common-ktx:$PAGING_VERSION" implementation "androidx.paging:paging-rxjava2-ktx:$PAGING_VERSION" implementation "androidx.recyclerview:recyclerview:1.2.0-alpha02" implementation "com.squareup.okhttp3:okhttp-ws:$OKHTTP_VERSION" // Logging implementation 'ch.acra:acra-dialog:5.8.4' implementation 'ch.acra:acra-mail:5.8.4' implementation 'org.slf4j:slf4j-api:1.7.25' api('com.github.tony19:logback-android-classic:1.1.1-6') { exclude group: 'com.google.android', module: 'android' } implementation "com.squareup.okhttp3:logging-interceptor:$OKHTTP_VERSION" // Dependency injector implementation "com.google.dagger:dagger-android:$DAGGER_VERSION" implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION" kapt "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" annotationProcessor "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" implementation "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION" //Mocking testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0' testImplementation 'org.mockito:mockito-inline:5.2.0' testImplementation 'org.mockito:mockito-core:5.6.0' testImplementation "org.powermock:powermock-module-junit4:2.0.9" testImplementation "org.powermock:powermock-api-mockito2:2.0.9" // Unit testing testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.11.1' testImplementation 'androidx.test:core:1.5.0' testImplementation "androidx.test:runner:1.5.2" testImplementation 'androidx.test.ext:junit:1.1.5' testImplementation "androidx.test:rules:1.5.0" testImplementation "com.squareup.okhttp3:mockwebserver:$OKHTTP_VERSION" testImplementation "com.jraska.livedata:testing-ktx:1.1.2" testImplementation "androidx.arch.core:core-testing:2.2.0" testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.0" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.0" testImplementation 'com.facebook.soloader:soloader:0.10.5' testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3" debugImplementation("androidx.fragment:fragment-testing:1.6.2") testImplementation "commons-io:commons-io:2.6" // Android testing androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0-alpha04' androidTestImplementation 'androidx.test.espresso:espresso-intents:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.0-alpha04' androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:rules:1.4.1-alpha04' androidTestImplementation 'androidx.test:core:1.4.0' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.annotation:annotation:1.3.0' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:4.8.0' androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0" androidTestUtil 'androidx.test:orchestrator:1.4.1' // Debugging debugImplementation "com.squareup.leakcanary:leakcanary-android:$LEAK_CANARY_VERSION" // Support libraries implementation "com.google.android.material:material:1.1.0-alpha04" implementation "androidx.browser:browser:1.3.0" implementation "androidx.cardview:cardview:1.0.0" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "androidx.exifinterface:exifinterface:1.3.2" implementation "androidx.core:core-ktx:$CORE_KTX_VERSION" implementation 'com.simplecityapps:recyclerview-fastscroll:2.0.1' //swipe_layout implementation 'com.daimajia.swipelayout:library:1.2.0@aar' //Room implementation "androidx.room:room-runtime:$ROOM_VERSION" implementation "androidx.room:room-ktx:$ROOM_VERSION" implementation "androidx.room:room-rxjava2:$ROOM_VERSION" kapt "androidx.room:room-compiler:$ROOM_VERSION" // For Kotlin use kapt instead of annotationProcessor testImplementation "androidx.arch.core:core-testing:2.1.0" // Pref // Java language implementation implementation "androidx.preference:preference:$PREFERENCE_VERSION" // Kotlin implementation "androidx.preference:preference-ktx:$PREFERENCE_VERSION" //Android Media implementation 'com.github.juanitobananas:AndroidMediaUtil:v1.0-1' implementation "androidx.multidex:multidex:$MULTIDEX_VERSION" def work_version = "2.8.1" // Kotlin + coroutines implementation "androidx.work:work-runtime-ktx:$work_version" implementation("androidx.work:work-runtime:$work_version") testImplementation "androidx.work:work-testing:$work_version" //Glide implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' kaptTest "androidx.databinding:databinding-compiler:8.0.2" kaptAndroidTest "androidx.databinding:databinding-compiler:8.0.2" implementation("io.github.coordinates2country:coordinates2country-android:1.3") { exclude group: 'com.google.android', module: 'android' } //OSMDroid implementation ("org.osmdroid:osmdroid-android:$OSMDROID_VERSION") constraints { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") } implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") } } } task disableAnimations(type: Exec) { def adb = "$System.env.ANDROID_HOME/platform-tools/adb" commandLine "$adb", 'shell', 'settings', 'put', 'global', 'window_animation_scale', '0' commandLine "$adb", 'shell', 'settings', 'put', 'global', 'transition_animation_scale', '0' commandLine "$adb", 'shell', 'settings', 'put', 'global', 'animator_duration_scale', '0' } project.gradle.taskGraph.whenReady { connectedBetaDebugAndroidTest.dependsOn disableAnimations connectedProdDebugAndroidTest.dependsOn disableAnimations } android { compileSdkVersion 33 defaultConfig { //applicationId 'fr.free.nrw.commons' versionCode 1036 versionName '4.2.1' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 21 targetSdkVersion 33 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } packagingOptions { jniLibs { excludes += ['META-INF/androidx.*'] } resources { excludes += ['META-INF/androidx.*', 'META-INF/proguard/androidx-annotations.pro'] } } testOptions { animationsDisabled true unitTests { returnDefaultValues = true includeAndroidResources = true } unitTests.all { jvmArgs '-noverify' } } sourceSets { // use kotlin only in tests (for now) test.java.srcDirs += 'src/test/kotlin' // use main assets and resources in test test.assets.srcDirs += 'src/main/assets' test.resources.srcDirs += 'src/main/resoures' } signingConfigs { release } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' testProguardFile 'test-proguard-rules.txt' signingConfig signingConfigs.debug if (isRunningOnTravisAndIsNotPRBuild) { signingConfig signingConfigs.release } } debug { testCoverageEnabled true minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' testProguardFile 'test-proguard-rules.txt' versionNameSuffix "-debug-" + getBranchName() } } if (isRunningOnTravisAndIsNotPRBuild) { // configure keystore based on env vars in Travis for automated alpha builds signingConfigs.release.storeFile = file("../nr-commons.keystore") signingConfigs.release.storePassword = System.getenv("keystore_password") signingConfigs.release.keyAlias = System.getenv("key_alias") signingConfigs.release.keyPassword = System.getenv("key_password") } configurations.all { resolutionStrategy.force 'androidx.annotation:annotation:1.1.0' resolutionStrategy.force 'com.jakewharton.timber:timber:4.7.1' resolutionStrategy.force 'androidx.fragment:fragment:1.3.6' exclude module: 'okhttp-ws' } flavorDimensions 'tier' productFlavors { prod { applicationId 'fr.free.nrw.commons' buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"" buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\"" buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"" buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" buildConfigField "String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns.json\"" buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\"" buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\"" buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.org\"" buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.org/wiki/\"" buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\"" buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\"" buildConfigField "String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.modifications.contentprovider\"" buildConfigField "String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.categories.contentprovider\"" buildConfigField "String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.explore.recentsearches.contentprovider\"" buildConfigField "String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.recentlanguages.contentprovider\"" buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.contentprovider\"" buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.locations.contentprovider\"" buildConfigField "String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.items.contentprovider\"" buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" buildConfigField "String", "DEPICTS_PROPERTY", "\"P180\"" dimension 'tier' } beta { applicationId 'fr.free.nrw.commons.beta' // What values do we need to hit the BETA versions of the site / api ? buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"" buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\"" buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"" buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" buildConfigField "String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns_beta_active.json\"" buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\"" buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\"" buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.beta.wmflabs.org\"" buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/wiki/\"" buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\"" buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\"" buildConfigField "String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.beta.modifications.contentprovider\"" buildConfigField "String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.beta.categories.contentprovider\"" buildConfigField "String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.beta.explore.recentsearches.contentprovider\"" buildConfigField "String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.beta.recentlanguages.contentprovider\"" buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.contentprovider\"" buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.locations.contentprovider\"" buildConfigField "String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.items.contentprovider\"" buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" buildConfigField "String", "DEPICTS_PROPERTY", "\"P245962\"" dimension 'tier' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildToolsVersion buildToolsVersion buildFeatures { viewBinding true } namespace 'fr.free.nrw.commons' lint { abortOnError false disable 'MissingTranslation', 'ExtraTranslation' } } String getTestUserName() { def propFile = rootProject.file("./local.properties") def properties = new Properties() properties.load(new FileInputStream(propFile)) return properties['TEST_USER_NAME'] } String getTestPassword() { def propFile = rootProject.file("./local.properties") def properties = new Properties() properties.load(new FileInputStream(propFile)) return properties['TEST_USER_PASSWORD'] } if (isRunningOnTravisAndIsNotPRBuild) { play { track = "alpha" userFraction = 1 serviceAccountEmail = System.getenv("SERVICE_ACCOUNT_NAME") serviceAccountCredentials = file("../play.p12") resolutionStrategy = "auto" outputProcessor { // this: ApkVariantOutput versionNameOverride = "$versionNameOverride.$versionCode" } } }