aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-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
3 files changed, 151 insertions, 145 deletions
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 =