Migrate to Gradle Kotlin DSL (#936)

This commit is contained in:
Harsh Shandilya 2020-07-23 14:39:36 +05:30 committed by GitHub
parent cc6f1ad605
commit 356a8cd8c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 313 additions and 299 deletions

View file

@ -12,6 +12,7 @@
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" /> <option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/buildSrc" />
</set> </set>
</option> </option>
<option name="resolveModulePerSourceSet" value="false" /> <option name="resolveModulePerSourceSet" value="false" />

View file

@ -1,142 +0,0 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
plugins {
id 'kotlin-android'
}
final def keystorePropertiesFile = rootProject.file 'keystore.properties'
static final def isSnapshot() {
return System.env['GITHUB_WORKFLOW'] != null && System.env['SNAPSHOT'] != null
}
android {
if (isSnapshot()) {
android.applicationVariants.all { final variant ->
variant.outputs.all {
outputFileName = "aps-${variant.getFlavorName()}_${defaultConfig.versionName}.apk"
}
}
}
buildFeatures.viewBinding = true
defaultConfig {
applicationId 'dev.msfjarvis.aps'
versionCode 11001
versionName '1.11.0-SNAPSHOT'
}
lintOptions {
abortOnError = true // make sure build fails with lint errors!
disable 'MissingTranslation', 'PluralsCandidate'
}
packagingOptions {
exclude '.readme'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
buildTypes {
release {
minifyEnabled = true
proguardFiles 'proguard-android-optimize.txt', 'proguard-rules.pro'
buildConfigField 'boolean', 'ENABLE_DEBUG_FEATURES', isSnapshot() ? 'true' : 'false'
}
debug {
applicationIdSuffix = '.debug'
versionNameSuffix = '-debug'
minifyEnabled = false
buildConfigField 'boolean', 'ENABLE_DEBUG_FEATURES', 'true'
}
}
if (keystorePropertiesFile.exists()) {
final def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
signingConfigs {
release {
keyAlias = keystoreProperties['keyAlias']
keyPassword = keystoreProperties['keyPassword']
storeFile = rootProject.file keystoreProperties['storeFile']
storePassword = keystoreProperties['storePassword']
}
}
buildTypes.release.signingConfig = signingConfigs.release
buildTypes.debug.signingConfig = signingConfigs.release
}
flavorDimensions "free"
productFlavors {
free {
versionNameSuffix "-free"
}
nonFree {
}
}
}
dependencies {
implementation deps.androidx.activity_ktx
implementation deps.androidx.annotation
implementation deps.androidx.autofill
implementation deps.androidx.appcompat
implementation deps.androidx.biometric
implementation deps.androidx.constraint_layout
implementation deps.androidx.core_ktx
implementation deps.androidx.documentfile
implementation deps.androidx.fragment_ktx
implementation deps.androidx.lifecycle_common
implementation deps.androidx.lifecycle_livedata_ktx
implementation deps.androidx.lifecycle_viewmodel_ktx
implementation deps.androidx.material
implementation deps.androidx.preference
implementation deps.androidx.recycler_view
implementation deps.androidx.recycler_view_selection
implementation deps.androidx.security
implementation deps.androidx.swiperefreshlayout
implementation deps.kotlin.coroutines.android
implementation deps.kotlin.coroutines.core
implementation deps.first_party.openpgp_ktx
implementation deps.first_party.zxing_android_embedded
implementation deps.third_party.commons_codec
implementation deps.third_party.fastscroll
implementation(deps.third_party.jgit) {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
implementation deps.third_party.jsch
implementation deps.third_party.sshj
implementation deps.third_party.bouncycastle
implementation deps.third_party.plumber
implementation deps.third_party.ssh_auth
implementation deps.third_party.timber
implementation deps.third_party.timberkt
if (isSnapshot()) {
implementation deps.third_party.leakcanary
implementation deps.third_party.whatthestack
} else {
debugImplementation deps.third_party.leakcanary
debugImplementation deps.third_party.whatthestack
}
nonFreeImplementation deps.non_free.google_play_auth_api_phone
// Testing-only dependencies
androidTestImplementation deps.testing.junit
androidTestImplementation deps.testing.kotlin_test_junit
androidTestImplementation deps.testing.androidx.runner
androidTestImplementation deps.testing.androidx.rules
androidTestImplementation deps.testing.androidx.junit
androidTestImplementation deps.testing.androidx.espresso_core
androidTestImplementation deps.testing.androidx.espresso_intents
testImplementation deps.testing.junit
testImplementation deps.testing.kotlin_test_junit
}

147
app/build.gradle.kts Normal file
View file

@ -0,0 +1,147 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import java.util.Properties
import com.android.build.gradle.internal.api.BaseVariantOutputImpl
plugins {
kotlin("android")
}
val keystorePropertiesFile = rootProject.file("keystore.properties")
fun isSnapshot(): Boolean {
return System.getenv("GITHUB_WORKFLOW") != null && System.getenv("SNAPSHOT") != null
}
android {
if (isSnapshot()) {
applicationVariants.all {
outputs.all {
(this as BaseVariantOutputImpl).outputFileName = "aps-${flavorName}_$versionName.apk"
}
}
}
buildFeatures.viewBinding = true
defaultConfig {
applicationId = "dev.msfjarvis.aps"
versionCode = 11001
versionName = "1.11.0-SNAPSHOT"
}
lintOptions {
isAbortOnError = true
isCheckReleaseBuilds = false
disable("MissingTranslation", "PluralsCandidate")
}
packagingOptions {
exclude(".readme")
exclude("META-INF/LICENSE.txt")
exclude("META-INF/NOTICE.txt")
}
buildTypes {
named("release") {
isMinifyEnabled = true
setProguardFiles(listOf("proguard-android-optimize.txt", "proguard-rules.pro"))
buildConfigField("boolean", "ENABLE_DEBUG_FEATURES", if (isSnapshot()) "true" else "false")
}
named("debug") {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
isMinifyEnabled = false
buildConfigField("boolean", "ENABLE_DEBUG_FEATURES", "true")
}
}
if (keystorePropertiesFile.exists()) {
val keystoreProperties = Properties()
keystoreProperties.load(keystorePropertiesFile.inputStream())
signingConfigs {
register("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = rootProject.file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
listOf("release", "debug").map {
buildTypes.getByName(it).signingConfig = signingConfigs.getByName(it)
}
}
flavorDimensions("free")
productFlavors {
create("free") {
versionNameSuffix = "-free"
}
create("nonFree") {
}
}
}
dependencies {
compileOnly(Dependencies.AndroidX.annotation)
implementation(Dependencies.AndroidX.activity_ktx)
implementation(Dependencies.AndroidX.autofill)
implementation(Dependencies.AndroidX.appcompat)
implementation(Dependencies.AndroidX.biometric)
implementation(Dependencies.AndroidX.constraint_layout)
implementation(Dependencies.AndroidX.core_ktx)
implementation(Dependencies.AndroidX.documentfile)
implementation(Dependencies.AndroidX.fragment_ktx)
implementation(Dependencies.AndroidX.lifecycle_common)
implementation(Dependencies.AndroidX.lifecycle_livedata_ktx)
implementation(Dependencies.AndroidX.lifecycle_viewmodel_ktx)
implementation(Dependencies.AndroidX.material)
implementation(Dependencies.AndroidX.preference)
implementation(Dependencies.AndroidX.recycler_view)
implementation(Dependencies.AndroidX.recycler_view_selection)
implementation(Dependencies.AndroidX.security)
implementation(Dependencies.AndroidX.swiperefreshlayout)
implementation(Dependencies.Kotlin.Coroutines.android)
implementation(Dependencies.Kotlin.Coroutines.core)
implementation(Dependencies.FirstParty.openpgp_ktx)
implementation(Dependencies.FirstParty.zxing_android_embedded)
implementation(Dependencies.ThirdParty.commons_codec)
implementation(Dependencies.ThirdParty.fastscroll)
implementation(Dependencies.ThirdParty.jgit) {
exclude(group = "org.apache.httpcomponents", module = "httpclient")
}
implementation(Dependencies.ThirdParty.jsch)
implementation(Dependencies.ThirdParty.sshj)
implementation(Dependencies.ThirdParty.bouncycastle)
implementation(Dependencies.ThirdParty.plumber)
implementation(Dependencies.ThirdParty.ssh_auth)
implementation(Dependencies.ThirdParty.timber)
implementation(Dependencies.ThirdParty.timberkt)
if (isSnapshot()) {
implementation(Dependencies.ThirdParty.leakcanary)
implementation(Dependencies.ThirdParty.whatthestack)
} else {
debugImplementation(Dependencies.ThirdParty.leakcanary)
debugImplementation(Dependencies.ThirdParty.whatthestack)
}
"nonFreeImplementation"(Dependencies.NonFree.google_play_auth_api_phone)
// Testing-only dependencies
androidTestImplementation(Dependencies.Testing.junit)
androidTestImplementation(Dependencies.Testing.kotlin_test_junit)
androidTestImplementation(Dependencies.Testing.AndroidX.runner)
androidTestImplementation(Dependencies.Testing.AndroidX.rules)
androidTestImplementation(Dependencies.Testing.AndroidX.junit)
androidTestImplementation(Dependencies.Testing.AndroidX.espresso_core)
androidTestImplementation(Dependencies.Testing.AndroidX.espresso_intents)
testImplementation(Dependencies.Testing.junit)
testImplementation(Dependencies.Testing.kotlin_test_junit)
}

View file

@ -1,69 +0,0 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
buildscript {
apply from: rootProject.file('dependencies.gradle')
repositories {
google()
jcenter()
}
dependencies {
classpath deps.gradle_plugin.android
classpath deps.gradle_plugin.kotlin
}
}
plugins {
id 'com.github.ben-manes.versions' version '0.29.0'
}
subprojects {
apply from: rootProject.file('dependencies.gradle')
repositories {
google()
jcenter()
maven {
url 'https://jitpack.io'
}
}
pluginManager.withPlugin('kotlin-android') {
dependencies {
implementation deps.kotlin.stdlib8
}
}
if (name == 'app') {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion versions.compileSdk
buildToolsVersion = versions.buildTools
defaultConfig {
minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xlint:unchecked'
options.deprecation = true
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = '1.8'
freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
}
}
tasks.wrapper {
gradleVersion = "6.5.1"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920"
}

65
build.gradle.kts Normal file
View file

@ -0,0 +1,65 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.android.build.gradle.BaseExtension
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath(Plugins.agp)
classpath(Plugins.kotlin)
}
}
plugins {
id("com.github.ben-manes.versions") version "0.29.0"
id("com.autonomousapps.dependency-analysis") version "0.53.0"
}
subprojects {
repositories {
google()
jcenter()
maven {
setUrl("https://jitpack.io")
}
}
if (name == "app") {
apply(plugin = "com.android.application")
} else {
apply(plugin = "com.android.library")
}
configure<BaseExtension> {
compileSdkVersion(29)
defaultConfig {
minSdkVersion(23)
targetSdkVersion(29)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<JavaCompile> {
options.compilerArgs.add("-Xlint:unchecked")
options.isDeprecation = true
}
}
tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf("-Xopt-in=kotlin.RequiresOptIn")
}
}
}
tasks.wrapper {
gradleVersion = "6.5.1"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920"
}

1
buildSrc/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

11
buildSrc/build.gradle.kts Normal file
View file

@ -0,0 +1,11 @@
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
kotlinDslPluginOptions {
experimentalWarning.set(false)
}

View file

@ -0,0 +1,84 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
object Plugins {
const val agp = "com.android.tools.build:gradle:4.0.1"
const val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
}
object Dependencies {
object Kotlin {
object Coroutines {
const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7"
const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7"
}
}
object AndroidX {
const val activity_ktx = "androidx.activity:activity-ktx:1.2.0-alpha07"
const val annotation = "androidx.annotation:annotation:1.2.0-alpha01"
const val autofill = "androidx.autofill:autofill:1.1.0-alpha01"
const val appcompat = "androidx.appcompat:appcompat:1.3.0-alpha01"
const val biometric = "androidx.biometric:biometric:1.1.0-alpha01"
const val constraint_layout = "androidx.constraintlayout:constraintlayout:2.0.0-beta8"
const val core_ktx = "androidx.core:core-ktx:1.5.0-alpha01"
const val documentfile = "androidx.documentfile:documentfile:1.0.1"
const val fragment_ktx = "androidx.fragment:fragment-ktx:1.3.0-alpha07"
const val lifecycle_common = "androidx.lifecycle:lifecycle-common-java8:2.3.0-alpha06"
const val lifecycle_livedata_ktx = "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha06"
const val lifecycle_viewmodel_ktx = "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha06"
const val material = "com.google.android.material:material:1.3.0-alpha01"
const val preference = "androidx.preference:preference:1.1.1"
const val recycler_view = "androidx.recyclerview:recyclerview:1.2.0-alpha05"
const val recycler_view_selection = "androidx.recyclerview:recyclerview-selection:1.1.0-rc01"
const val security = "androidx.security:security-crypto:1.1.0-alpha01"
const val swiperefreshlayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01"
}
object FirstParty {
const val openpgp_ktx = "com.github.android-password-store:openpgp-ktx:2.0.0"
const val zxing_android_embedded = "com.github.android-password-store:zxing-android-embedded:4.1.0-aps"
}
object ThirdParty {
const val bouncycastle = "org.bouncycastle:bcprov-jdk15on:1.66"
const val commons_codec = "commons-codec:commons-codec:1.14"
const val fastscroll = "me.zhanghai.android.fastscroll:library:1.1.4"
const val jsch = "com.jcraft:jsch:0.1.55"
const val jgit = "org.eclipse.jgit:org.eclipse.jgit:3.7.1.201504261725-r"
const val leakcanary = "com.squareup.leakcanary:leakcanary-android:2.4"
const val plumber = "com.squareup.leakcanary:plumber-android:2.4"
const val sshj = "com.hierynomus:sshj:0.29.0"
const val ssh_auth = "org.sufficientlysecure:sshauthentication-api:1.0"
const val timber = "com.jakewharton.timber:timber:4.7.1"
const val timberkt = "com.github.ajalt:timberkt:1.5.1"
const val whatthestack = "com.github.haroldadmin:WhatTheStack:0.0.4"
}
object NonFree {
const val google_play_auth_api_phone = "com.google.android.gms:play-services-auth-api-phone:17.4.0"
}
object Testing {
const val junit = "junit:junit:4.13"
const val kotlin_test_junit = "org.jetbrains.kotlin:kotlin-test-junit:1.3.72"
object AndroidX {
const val runner = "androidx.test:runner:1.3.0-rc01"
const val rules = "androidx.test:rules:1.3.0-rc01"
const val junit = "androidx.test.ext:junit:1.1.2-rc01"
const val espresso_core = "androidx.test.espresso:espresso-core:3.3.0-rc01"
const val espresso_intents = "androidx.test.espresso:espresso-intents:3.3.0-rc01"
}
}
}

View file

@ -1,82 +0,0 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
ext.versions = [
minSdk: 23,
targetSdk: 29,
compileSdk: 29,
buildTools: '29.0.3'
]
ext.deps = [
gradle_plugin: [
android: 'com.android.tools.build:gradle:4.0.1',
kotlin: 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72',
],
kotlin: [
coroutines: [
android: 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7',
core: 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7',
],
stdlib8: 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72'
],
androidx: [
activity_ktx: 'androidx.activity:activity-ktx:1.2.0-alpha07',
annotation: 'androidx.annotation:annotation:1.2.0-alpha01',
autofill: 'androidx.autofill:autofill:1.1.0-alpha01',
appcompat: 'androidx.appcompat:appcompat:1.3.0-alpha01',
biometric: 'androidx.biometric:biometric:1.1.0-alpha01',
constraint_layout: 'androidx.constraintlayout:constraintlayout:2.0.0-beta8',
core_ktx: 'androidx.core:core-ktx:1.5.0-alpha01',
documentfile: 'androidx.documentfile:documentfile:1.0.1',
fragment_ktx: 'androidx.fragment:fragment-ktx:1.3.0-alpha07',
lifecycle_common: 'androidx.lifecycle:lifecycle-common-java8:2.3.0-alpha06',
lifecycle_livedata_ktx: 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha06',
lifecycle_viewmodel_ktx: 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha06',
material: 'com.google.android.material:material:1.3.0-alpha01',
preference: 'androidx.preference:preference:1.1.1',
recycler_view: 'androidx.recyclerview:recyclerview:1.2.0-alpha05',
recycler_view_selection: 'androidx.recyclerview:recyclerview-selection:1.1.0-rc01',
security: 'androidx.security:security-crypto:1.1.0-alpha01',
swiperefreshlayout: 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01'
],
first_party: [
openpgp_ktx: 'com.github.android-password-store:openpgp-ktx:2.0.0',
zxing_android_embedded: 'com.github.android-password-store:zxing-android-embedded:4.1.0-aps'
],
third_party: [
bouncycastle: 'org.bouncycastle:bcprov-jdk15on:1.66',
commons_codec: 'commons-codec:commons-codec:1.14',
fastscroll: 'me.zhanghai.android.fastscroll:library:1.1.4',
jsch: 'com.jcraft:jsch:0.1.55',
jgit: 'org.eclipse.jgit:org.eclipse.jgit:3.7.1.201504261725-r',
leakcanary: 'com.squareup.leakcanary:leakcanary-android:2.4',
plumber: 'com.squareup.leakcanary:plumber-android:2.4',
sshj: 'com.hierynomus:sshj:0.29.0',
ssh_auth: 'org.sufficientlysecure:sshauthentication-api:1.0',
timber: 'com.jakewharton.timber:timber:4.7.1',
timberkt: 'com.github.ajalt:timberkt:1.5.1',
whatthestack: 'com.github.haroldadmin:WhatTheStack:0.0.4',
],
non_free: [
google_play_auth_api_phone: 'com.google.android.gms:play-services-auth-api-phone:17.4.0',
],
testing: [
junit: 'junit:junit:4.13',
kotlin_test_junit: 'org.jetbrains.kotlin:kotlin-test-junit:1.3.72',
androidx: [
runner: 'androidx.test:runner:1.3.0-rc01',
rules: 'androidx.test:rules:1.3.0-rc01',
junit: 'androidx.test.ext:junit:1.1.2-rc01',
espresso_core: 'androidx.test.espresso:espresso-core:3.3.0-rc01',
espresso_intents: 'androidx.test.espresso:espresso-intents:3.3.0-rc01'
]
]
]

View file

@ -20,3 +20,6 @@ android.useMinimalKeepRules=true
# references to the resources it declares instead of declarations plus all # references to the resources it declares instead of declarations plus all
# transitive dependency references. # transitive dependency references.
android.namespacedRClass=true android.namespacedRClass=true
# Gradle FS watching
org.gradle.unsafe.watch-fs=true

View file

@ -1,8 +1,3 @@
#
# Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
# SPDX-License-Identifier: GPL-3.0-only
#
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionSha256Sum=143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920 distributionSha256Sum=143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920

View file

@ -2,4 +2,4 @@
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only * SPDX-License-Identifier: GPL-3.0-only
*/ */
include ':app' include(":app")