diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/build.gradle | 142 | ||||
-rw-r--r-- | app/build.gradle.kts | 147 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/autofill/oreo/FormField.kt | 7 |
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 = |