diff options
5 files changed, 24 insertions, 4 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt index 7f6727f2..507ce0d9 100644 --- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt +++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt @@ -531,6 +531,7 @@ class UserPreference : AppCompatActivity() { BrowserAutofillSupportLevel.None -> getString(R.string.oreo_autofill_no_support) BrowserAutofillSupportLevel.FlakyFill -> getString(R.string.oreo_autofill_flaky_fill_support) BrowserAutofillSupportLevel.PasswordFill -> getString(R.string.oreo_autofill_password_fill_support) + BrowserAutofillSupportLevel.PasswordFillAndSaveIfNoAccessibility -> getString(R.string.oreo_autofill_password_fill_and_conditional_save_support) BrowserAutofillSupportLevel.GeneralFill -> getString(R.string.oreo_autofill_general_fill_support) BrowserAutofillSupportLevel.GeneralFillAndSave -> getString(R.string.oreo_autofill_general_fill_and_save_support) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b4264f4..984b961c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -415,5 +415,6 @@ <string name="port">Port</string> <string name="pref_proxy_settings">HTTP(S) proxy settings</string> <string name="invalid_proxy_url">Invalid URL</string> + <string name="oreo_autofill_password_fill_and_conditional_save_support">Fill and save passwords (saving requires that no accessibility services are enabled)</string> </resources> diff --git a/autofill-parser/api/autofill-parser.api b/autofill-parser/api/autofill-parser.api index 85f02081..a7c4be29 100644 --- a/autofill-parser/api/autofill-parser.api +++ b/autofill-parser/api/autofill-parser.api @@ -158,6 +158,7 @@ public final class com/github/androidpasswordstore/autofillparser/BrowserAutofil public static final field GeneralFillAndSave Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; public static final field None Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; public static final field PasswordFill Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; + public static final field PasswordFillAndSaveIfNoAccessibility Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; public static fun valueOf (Ljava/lang/String;)Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; public static fun values ()[Lcom/github/androidpasswordstore/autofillparser/BrowserAutofillSupportLevel; } diff --git a/autofill-parser/gradle.properties b/autofill-parser/gradle.properties index fe1b7688..6aa624ad 100644 --- a/autofill-parser/gradle.properties +++ b/autofill-parser/gradle.properties @@ -1,5 +1,5 @@ GROUP=com.github.androidpasswordstore -VERSION_NAME=1.0.0 +VERSION_NAME=1.1.0-SNAPSHOT POM_ARTIFACT_ID=autofill-parser POM_ARTIFACT_DESCRIPTION=Android library for low-level parsing of Autofill structures 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 a8ed0c85..9df5aca7 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 @@ -9,6 +9,8 @@ import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build +import android.provider.Settings +import android.service.autofill.SaveInfo import androidx.annotation.RequiresApi /* @@ -143,7 +145,21 @@ private val BROWSER_SAVE_FLAG = mapOf( ) @RequiresApi(Build.VERSION_CODES.O) -private fun getBrowserSaveFlag(appPackage: String): Int? = BROWSER_SAVE_FLAG[appPackage] +private val BROWSER_SAVE_FLAG_IF_NO_ACCESSIBILITY = mapOf( + "com.chrome.canary" to SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE, +) + +private fun isNoAccessibilityServiceEnabled(context: Context): Boolean { + // See https://chromium.googlesource.com/chromium/src/+/447a31e977a65e2eb78804e4a09633699b4ede33 + return Settings.Secure.getString(context.contentResolver, + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES).isNullOrEmpty() +} + +@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 { + isNoAccessibilityServiceEnabled(context) + } data class BrowserAutofillSupportInfo( val multiOriginMethod: BrowserMultiOriginMethod, @@ -158,14 +174,13 @@ fun getBrowserAutofillSupportInfoIfTrusted( if (!isTrustedBrowser(context, appPackage)) return null return BrowserAutofillSupportInfo( multiOriginMethod = getBrowserMultiOriginMethod(appPackage), - saveFlags = getBrowserSaveFlag(appPackage) + saveFlags = getBrowserSaveFlag(context, appPackage) ) } private val FLAKY_BROWSERS = listOf( "com.android.chrome", "com.chrome.beta", - "com.chrome.canary", "com.chrome.dev", "org.bromite.bromite", "org.ungoogled.chromium.stable", @@ -176,6 +191,7 @@ enum class BrowserAutofillSupportLevel { None, FlakyFill, PasswordFill, + PasswordFillAndSaveIfNoAccessibility, GeneralFill, GeneralFillAndSave, } @@ -189,6 +205,7 @@ private fun getBrowserAutofillSupportLevel( return when { browserInfo == null -> BrowserAutofillSupportLevel.None appPackage in FLAKY_BROWSERS -> BrowserAutofillSupportLevel.FlakyFill + appPackage in BROWSER_SAVE_FLAG_IF_NO_ACCESSIBILITY -> BrowserAutofillSupportLevel.PasswordFillAndSaveIfNoAccessibility browserInfo.multiOriginMethod == BrowserMultiOriginMethod.None -> BrowserAutofillSupportLevel.PasswordFill browserInfo.saveFlags == null -> BrowserAutofillSupportLevel.GeneralFill else -> BrowserAutofillSupportLevel.GeneralFillAndSave |