diff options
Diffstat (limited to 'autofill-parser/src/main/java')
8 files changed, 41 insertions, 35 deletions
diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillFormParser.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillFormParser.kt index 952bc3f0..fc1fcca3 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillFormParser.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillFormParser.kt @@ -69,7 +69,7 @@ public sealed class FormOrigin(public open val identifier: String) { /** * Manages the detection of fields to fill in an [AssistStructure] and determines the [FormOrigin]. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private class AutofillFormParser( context: Context, structure: AssistStructure, @@ -200,7 +200,7 @@ public data class Credentials(val username: String?, val password: String?, val * Represents a collection of fields in a specific app that can be filled or saved. This is the * entry point to all fill and save features. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) public class FillableForm private constructor( public val formOrigin: FormOrigin, diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillHelper.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillHelper.kt index 7e5a3d33..0b4f491d 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillHelper.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillHelper.kt @@ -52,7 +52,7 @@ public fun computeCertificatesHash(context: Context, appPackage: String): String val signaturesOld = context.packageManager.getPackageInfo(appPackage, PackageManager.GET_SIGNATURES).signatures val stableHashOld = stableHash(signaturesOld.map { it.toByteArray() }) - if (Build.VERSION.SDK_INT >= 28) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { context.packageManager.getPackageInfo( @@ -79,14 +79,15 @@ public fun computeCertificatesHash(context: Context, appPackage: String): String * its `webDomain` and `webScheme`, if available. */ internal val AssistStructure.ViewNode.webOrigin: String? - @RequiresApi(26) + @RequiresApi(Build.VERSION_CODES.O) get() = webDomain?.let { domain -> - val scheme = (if (Build.VERSION.SDK_INT >= 28) webScheme else null) ?: "https" + val scheme = + (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) webScheme else null) ?: "https" "$scheme://$domain" } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) public class FixedSaveCallback(context: Context, private val callback: SaveCallback) { private val applicationContext = context.applicationContext @@ -102,7 +103,7 @@ public class FixedSaveCallback(context: Context, private val callback: SaveCallb } public fun onSuccess(intentSender: IntentSender) { - if (Build.VERSION.SDK_INT >= 28) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { callback.onSuccess(intentSender) } else { callback.onSuccess() @@ -129,7 +130,7 @@ private fun visitViewNode( } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal fun AssistStructure.findNodeByAutofillId( autofillId: AutofillId ): AssistStructure.ViewNode? { diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillScenario.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillScenario.kt index d2a95b40..4f14907c 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillScenario.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillScenario.kt @@ -30,7 +30,7 @@ public enum class AutofillAction { * [FormField], [AssistStructure.ViewNode] or [AutofillId], depending on how much metadata about the * field is needed and available in the particular situation. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) public sealed class AutofillScenario<out T : Any> { public companion object { @@ -185,7 +185,7 @@ public sealed class AutofillScenario<out T : Any> { get() = username != null } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal data class ClassifiedAutofillScenario<T : Any>( override val username: T?, override val fillUsername: Boolean, @@ -206,7 +206,7 @@ internal data class ClassifiedAutofillScenario<T : Any>( get() = newPassword.ifEmpty { currentPassword } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal data class GenericAutofillScenario<T : Any>( override val username: T?, override val fillUsername: Boolean, @@ -226,7 +226,7 @@ internal data class GenericAutofillScenario<T : Any>( get() = genericPassword } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal fun AutofillScenario<FormField>.passesOriginCheck(singleOriginMode: Boolean): Boolean { return if (singleOriginMode) { // In single origin mode, only the browsers URL bar (which is never filled) should have @@ -239,7 +239,7 @@ internal fun AutofillScenario<FormField>.passesOriginCheck(singleOriginMode: Boo } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) @JvmName("fillWithAutofillId") public fun Dataset.Builder.fillWith( scenario: AutofillScenario<AutofillId>, @@ -262,7 +262,7 @@ public fun Dataset.Builder.fillWith( } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal inline fun <T : Any, S : Any> AutofillScenario<T>.map( transform: (T) -> S ): AutofillScenario<S> { @@ -282,7 +282,7 @@ internal inline fun <T : Any, S : Any> AutofillScenario<T>.map( return builder.build() } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) @JvmName("toBundleAutofillId") internal fun AutofillScenario<AutofillId>.toBundle(): Bundle = when (this) { @@ -311,7 +311,7 @@ internal fun AutofillScenario<AutofillId>.toBundle(): Bundle = } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) public fun AutofillScenario<AutofillId>.recoverNodes( structure: AssistStructure ): AutofillScenario<AssistStructure.ViewNode>? { @@ -319,13 +319,13 @@ public fun AutofillScenario<AutofillId>.recoverNodes( } public val AutofillScenario<AssistStructure.ViewNode>.usernameValue: String? - @RequiresApi(26) + @RequiresApi(Build.VERSION_CODES.O) get() { val value = username?.autofillValue ?: return null return if (value.isText) value.textValue.toString() else null } public val AutofillScenario<AssistStructure.ViewNode>.passwordValue: String? - @RequiresApi(26) + @RequiresApi(Build.VERSION_CODES.O) get() { val distinctValues = passwordFieldsToSave diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategy.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategy.kt index 93355a94..7303efc5 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategy.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategy.kt @@ -4,6 +4,7 @@ */ package com.github.androidpasswordstore.autofillparser +import android.os.Build import androidx.annotation.RequiresApi import com.github.androidpasswordstore.autofillparser.CertaintyLevel.Certain import com.github.androidpasswordstore.autofillparser.CertaintyLevel.Likely @@ -21,7 +22,7 @@ private inline fun <T> Pair<T, T>.none(predicate: T.() -> Boolean) = * The strategy used to detect [AutofillScenario] s; expressed using the DSL implemented in * [AutofillDsl]. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal val autofillStrategy = strategy { // Match two new password fields, an optional current password field right below or above, and diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategyDsl.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategyDsl.kt index 8295a7f4..35006468 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategyDsl.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/AutofillStrategyDsl.kt @@ -4,13 +4,14 @@ */ package com.github.androidpasswordstore.autofillparser +import android.os.Build import androidx.annotation.RequiresApi import logcat.LogPriority.WARN import logcat.logcat @DslMarker internal annotation class AutofillDsl -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal interface FieldMatcher { fun match(fields: List<FormField>, alreadyMatched: List<FormField>): List<FormField>? @@ -71,7 +72,7 @@ internal interface FieldMatcher { } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal class SingleFieldMatcher( private val take: (FormField, List<FormField>) -> Boolean, private val tieBreakers: List<(FormField, List<FormField>) -> Boolean> @@ -135,7 +136,7 @@ internal class SingleFieldMatcher( } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private class PairOfFieldsMatcher( private val take: (Pair<FormField, FormField>, List<FormField>) -> Boolean, private val tieBreakers: List<(Pair<FormField, FormField>, List<FormField>) -> Boolean> @@ -173,7 +174,7 @@ private class PairOfFieldsMatcher( } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal class AutofillRule private constructor( private val matchers: List<AutofillRuleMatcher>, @@ -381,7 +382,7 @@ private constructor( } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal class AutofillStrategy private constructor(private val rules: List<AutofillRule>) { @AutofillDsl @@ -434,6 +435,6 @@ internal class AutofillStrategy private constructor(private val rules: List<Auto } } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal fun strategy(block: AutofillStrategy.Builder.() -> Unit) = AutofillStrategy.Builder().apply(block).build() diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt index 7c4d0c2e..a4d9752f 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt @@ -143,7 +143,7 @@ private fun getBrowserMultiOriginMethod(appPackage: String): BrowserMultiOriginM * Some browsers may not issue save requests automatically and thus need * `FLAG_SAVE_ON_ALL_VIEW_INVISIBLE` to be set. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private val BROWSER_SAVE_FLAG = mapOf( "com.duckduckgo.mobile.android" to 0, @@ -157,7 +157,7 @@ private val BROWSER_SAVE_FLAG = "com.opera.touch" to 0, ) -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private val BROWSER_SAVE_FLAG_IF_NO_ACCESSIBILITY = mapOf( "com.android.chrome" to SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE, @@ -177,7 +177,7 @@ private fun isNoAccessibilityServiceEnabled(context: Context): Boolean { .isNullOrEmpty() } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private fun getBrowserSaveFlag(context: Context, appPackage: String): Int? = BROWSER_SAVE_FLAG[appPackage] ?: BROWSER_SAVE_FLAG_IF_NO_ACCESSIBILITY[appPackage]?.takeIf { @@ -189,7 +189,7 @@ internal data class BrowserAutofillSupportInfo( val saveFlags: Int? ) -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal fun getBrowserAutofillSupportInfoIfTrusted( context: Context, appPackage: String @@ -215,7 +215,7 @@ public enum class BrowserAutofillSupportLevel { GeneralFillAndSave, } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) private fun getBrowserAutofillSupportLevel( context: Context, appPackage: String @@ -237,12 +237,13 @@ private fun getBrowserAutofillSupportLevel( // browsers // with native Autofill support offer full save support as well, we reuse the list of those // browsers here. - supportLevel != BrowserAutofillSupportLevel.GeneralFillAndSave && Build.VERSION.SDK_INT < 28 + supportLevel != BrowserAutofillSupportLevel.GeneralFillAndSave && + Build.VERSION.SDK_INT < Build.VERSION_CODES.P } ?: BrowserAutofillSupportLevel.None } -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) public fun getInstalledBrowsersWithAutofillSupportLevel( context: Context ): List<Pair<String, BrowserAutofillSupportLevel>> { diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt index 36734064..96813be5 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt @@ -5,6 +5,7 @@ package com.github.androidpasswordstore.autofillparser import android.app.assist.AssistStructure +import android.os.Build import android.text.InputType import android.view.View import android.view.autofill.AutofillId @@ -23,7 +24,7 @@ internal enum class CertaintyLevel { * Represents a single potentially fillable or saveable field together with all meta data extracted * from its [AssistStructure.ViewNode]. */ -@RequiresApi(26) +@RequiresApi(Build.VERSION_CODES.O) internal class FormField( node: AssistStructure.ViewNode, private val index: Int, @@ -113,7 +114,8 @@ internal class FormField( .toSet() .toList() - @RequiresApi(26) private fun isSupportedHint(hint: String?) = hint in HINTS_FILLABLE + @RequiresApi(Build.VERSION_CODES.O) + private fun isSupportedHint(hint: String?) = hint in HINTS_FILLABLE private val EXCLUDED_TERMS = listOf( "url_bar", // Chrome/Edge/Firefox address bar diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/PublicSuffixListCache.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/PublicSuffixListCache.kt index 2a35e8c7..706aa6c5 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/PublicSuffixListCache.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/PublicSuffixListCache.kt @@ -53,7 +53,7 @@ internal fun getPublicSuffixPlusOne( } private fun isNumericAddress(domain: String): Boolean { - return if (Build.VERSION.SDK_INT >= 29) { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { InetAddresses.isNumericAddress(domain) } else { @Suppress("DEPRECATION") Patterns.IP_ADDRESS.matcher(domain).matches() |