summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/release.yml2
-rw-r--r--.idea/gradle.xml1
-rw-r--r--README.md3
-rw-r--r--app/build.gradle142
-rw-r--r--app/build.gradle.kts147
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt7
-rw-r--r--build.gradle69
-rw-r--r--build.gradle.kts65
-rw-r--r--buildSrc/.gitignore1
-rw-r--r--buildSrc/build.gradle.kts11
-rw-r--r--buildSrc/src/main/java/Dependencies.kt84
-rw-r--r--dependencies.gradle82
-rw-r--r--gradle.properties3
-rw-r--r--gradle/wrapper/gradle-wrapper.properties5
-rw-r--r--settings.gradle.kts (renamed from settings.gradle)2
15 files changed, 321 insertions, 303 deletions
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 43cd9fac..10484521 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -117,7 +117,7 @@ jobs:
tag_name: ${{ github.ref }}
release_name: ${{ github.ref }}
body: ${{ steps.changelog_reader.outputs.log_entry }}
- draft: false
+ draft: true
prerelease: false
- name: Get the version
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 2df14bed..f7e941c7 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -12,6 +12,7 @@
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
+ <option value="$PROJECT_DIR$/buildSrc" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
diff --git a/README.md b/README.md
index 367e65a5..15a18dc0 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,9 @@ Pull requests are more than welcome (see [TODO](https://github.com/android-passw
height="80" />
</a>
+## Build types
+
+We generate release binaries under two separate configurations titled `free` and `nonFree`. The distinction was created following the merge of [#900](https://msfjarvis.dev/aps/pr/900), that introduced a dependency on closed source GMS libraries. Since F-Droid is a FOSS-only app store, we created the `free` flavor where we do not ship the GMS dependency and thus the feature to fill SMS OTPs is unavailable.
## Features
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 78d2c50a..00000000
--- a/app/build.gradle
+++ /dev/null
@@ -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 11011
- 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
-}
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 00000000..9b67f099
--- /dev/null
+++ b/app/build.gradle.kts
@@ -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 = 11011
+ 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)
+}
diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt b/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt
index 2b18bbb6..0d89624e 100644
--- a/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt
@@ -214,7 +214,8 @@ class FormField(
// TODO: Revisit this decision in the future
private val excludedByHints = excludedByAutofillHints
- val relevantField = isTextField && hasAutofillTypeText && !excludedByHints
+ // Only offer to fill into custom views if they explicitly opted into Autofill.
+ val relevantField = hasAutofillTypeText && (isTextField || autofillHints.isNotEmpty()) && !excludedByHints
// Exclude fields based on hint, resource ID or HTML name.
// Note: We still report excluded fields as relevant since they count for adjacency heuristics,
@@ -232,7 +233,7 @@ class FormField(
if (isCertainPasswordField) CertaintyLevel.Certain else if (isLikelyPasswordField) CertaintyLevel.Likely else if (isPossiblePasswordField) CertaintyLevel.Possible else CertaintyLevel.Impossible
// OTP field heuristics (based only on the current field)
- private val isPossibleOtpField = notExcluded && !isPossiblePasswordField && isTextField
+ private val isPossibleOtpField = notExcluded && !isPossiblePasswordField
private val isCertainOtpField = isPossibleOtpField && hasHintOtp
private val isLikelyOtpField = isPossibleOtpField && (
isCertainOtpField || OTP_HEURISTIC_TERMS.anyMatchesFieldInfo ||
@@ -241,7 +242,7 @@ class FormField(
if (isCertainOtpField) CertaintyLevel.Certain else if (isLikelyOtpField) CertaintyLevel.Likely else if (isPossibleOtpField) CertaintyLevel.Possible else CertaintyLevel.Impossible
// Username field heuristics (based only on the current field)
- private val isPossibleUsernameField = notExcluded && !isPossiblePasswordField && !isCertainOtpField && isTextField
+ private val isPossibleUsernameField = notExcluded && !isPossiblePasswordField && !isCertainOtpField
private val isCertainUsernameField = isPossibleUsernameField && hasHintUsername
private val isLikelyUsernameField = isPossibleUsernameField && (isCertainUsernameField || (USERNAME_HEURISTIC_TERMS.anyMatchesFieldInfo))
val usernameCertainty =
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 7490782c..00000000
--- a/build.gradle
+++ /dev/null
@@ -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.28.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"
-}
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 00000000..0ed23658
--- /dev/null
+++ b/build.gradle.kts
@@ -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"
+}
diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/buildSrc/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
new file mode 100644
index 00000000..3457e2c2
--- /dev/null
+++ b/buildSrc/build.gradle.kts
@@ -0,0 +1,11 @@
+plugins {
+ `kotlin-dsl`
+}
+
+repositories {
+ jcenter()
+}
+
+kotlinDslPluginOptions {
+ experimentalWarning.set(false)
+}
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
new file mode 100644
index 00000000..eddfd56b
--- /dev/null
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -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"
+ }
+ }
+}
diff --git a/dependencies.gradle b/dependencies.gradle
deleted file mode 100644
index d05e0e6d..00000000
--- a/dependencies.gradle
+++ /dev/null
@@ -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.0',
- 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-alpha06',
- annotation: 'androidx.annotation:annotation:1.2.0-alpha01',
- autofill: 'androidx.autofill:autofill:1.0.0',
- appcompat: 'androidx.appcompat:appcompat:1.3.0-alpha01',
- biometric: 'androidx.biometric:biometric:1.1.0-alpha01',
- constraint_layout: 'androidx.constraintlayout:constraintlayout:2.0.0-beta7',
- 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-alpha06',
- lifecycle_common: 'androidx.lifecycle:lifecycle-common-java8:2.3.0-alpha05',
- lifecycle_livedata_ktx: 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha05',
- lifecycle_viewmodel_ktx: 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha05',
- 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-alpha04',
- 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.1.0'
- ],
-
- 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:v4.1.0-aps'
- ],
-
- third_party: [
- bouncycastle: 'org.bouncycastle:bcprov-jdk15on:1.65.01',
- commons_codec: 'commons-codec:commons-codec:1.13',
- 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.3',
- ],
-
- 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'
- ]
- ]
-]
diff --git a/gradle.properties b/gradle.properties
index 218affe7..ca214f0f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -20,3 +20,6 @@ android.useMinimalKeepRules=true
# references to the resources it declares instead of declarations plus all
# transitive dependency references.
android.namespacedRClass=true
+
+# Gradle FS watching
+org.gradle.unsafe.watch-fs=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 6fa3f76a..28b21a0c 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -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
distributionPath=wrapper/dists
distributionSha256Sum=143a28f54f1ae93ef4f72d862dbc3c438050d81bb45b4601eb7076e998362920
diff --git a/settings.gradle b/settings.gradle.kts
index 47fd3b82..a418994b 100644
--- a/settings.gradle
+++ b/settings.gradle.kts
@@ -2,4 +2,4 @@
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
-include ':app'
+include(":app")