aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt
diff options
context:
space:
mode:
authorFabian Henneke <FabianHenneke@users.noreply.github.com>2020-07-07 17:02:57 +0200
committerGitHub <noreply@github.com>2020-07-07 20:32:57 +0530
commitd192ab2d9a6f45fb23e3d3f709c144ce1be3a850 (patch)
tree7e946de1f3e15db63be9c184d74b49d610c49d09 /app/src/main/java/com/zeapo/pwdstore/UserPreference.kt
parent5d170249cdd0050349f40d3a5852a8ba996663bc (diff)
downloadHardenedPass-d192ab2d9a6f45fb23e3d3f709c144ce1be3a850.tar.gz
HardenedPass-d192ab2d9a6f45fb23e3d3f709c144ce1be3a850.zip
Work around Chrome Autofill issue (#921)
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/UserPreference.kt')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/UserPreference.kt57
1 files changed, 48 insertions, 9 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt
index ea3bac38..4d68834b 100644
--- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt
@@ -41,7 +41,9 @@ import com.github.ajalt.timberkt.w
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.zeapo.pwdstore.autofill.AutofillPreferenceActivity
+import com.zeapo.pwdstore.autofill.AutofillService
import com.zeapo.pwdstore.autofill.oreo.BrowserAutofillSupportLevel
+import com.zeapo.pwdstore.autofill.oreo.ChromeCompatFix
import com.zeapo.pwdstore.autofill.oreo.getInstalledBrowsersWithAutofillSupportLevel
import com.zeapo.pwdstore.crypto.BasePgpActivity
import com.zeapo.pwdstore.crypto.GetKeyIdsActivity
@@ -73,6 +75,7 @@ class UserPreference : AppCompatActivity() {
class PrefsFragment : PreferenceFragmentCompat() {
private var autoFillEnablePreference: SwitchPreferenceCompat? = null
+ private var oreoAutofillChromeCompatFix: SwitchPreferenceCompat? = null
private var clearSavedPassPreference: Preference? = null
private lateinit var autofillDependencies: List<Preference>
private lateinit var oreoAutofillDependencies: List<Preference>
@@ -118,6 +121,7 @@ class UserPreference : AppCompatActivity() {
// Autofill preferences
autoFillEnablePreference = findPreference(PreferenceKeys.AUTOFILL_ENABLE)
+ oreoAutofillChromeCompatFix = findPreference(PreferenceKeys.OREO_AUTOFILL_CHROME_COMPAT_FIX)
val oreoAutofillDirectoryStructurePreference = findPreference<ListPreference>(PreferenceKeys.OREO_AUTOFILL_DIRECTORY_STRUCTURE)
val oreoAutofillDefaultUsername = findPreference<EditTextPreference>(PreferenceKeys.OREO_AUTOFILL_DEFAULT_USERNAME)
val oreoAutofillCustomPublixSuffixes = findPreference<EditTextPreference>(PreferenceKeys.OREO_AUTOFILL_CUSTOM_PUBLIC_SUFFIXES)
@@ -276,6 +280,16 @@ class UserPreference : AppCompatActivity() {
true
}
+ oreoAutofillChromeCompatFix?.onPreferenceClickListener = ClickListener {
+ if (oreoAutofillChromeCompatFix!!.isChecked) {
+ startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
+ true
+ } else {
+ // Service will disable itself on startup if the preference has the value false.
+ false
+ }
+ }
+
findPreference<Preference>(PreferenceKeys.EXPORT_PASSWORDS)?.apply {
isVisible = sharedPreferences.getBoolean(PreferenceKeys.REPOSITORY_INITIALIZED, false)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
@@ -398,16 +412,20 @@ class UserPreference : AppCompatActivity() {
}
private fun updateAutofillSettings() {
- val isAccessibilityServiceEnabled = callingActivity.isAccessibilityServiceEnabled
+ val isAccessibilityAutofillServiceEnabled = callingActivity.isAccessibilityAutofillServiceEnabled
val isAutofillServiceEnabled = callingActivity.isAutofillServiceEnabled
autoFillEnablePreference?.isChecked =
- isAccessibilityServiceEnabled || isAutofillServiceEnabled
+ isAccessibilityAutofillServiceEnabled || isAutofillServiceEnabled
autofillDependencies.forEach {
- it.isVisible = isAccessibilityServiceEnabled
+ it.isVisible = isAccessibilityAutofillServiceEnabled
}
oreoAutofillDependencies.forEach {
it.isVisible = isAutofillServiceEnabled
}
+ oreoAutofillChromeCompatFix?.apply {
+ isChecked = callingActivity.isChromeCompatFixServiceEnabled
+ isVisible = callingActivity.isChromeCompatFixServiceSupported
+ }
}
private fun updateClearSavedPassphrasePrefs() {
@@ -428,13 +446,16 @@ class UserPreference : AppCompatActivity() {
}
private fun onEnableAutofillClick() {
- if (callingActivity.isAccessibilityServiceEnabled) {
+ if (callingActivity.isAccessibilityAutofillServiceEnabled) {
startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
} else if (callingActivity.isAutofillServiceEnabled) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
callingActivity.autofillManager!!.disableAutofillServices()
- else
+ ChromeCompatFix.setStatusInPreferences(requireContext(), false)
+ updateAutofillSettings()
+ } else {
throw IllegalStateException("isAutofillServiceEnabled == true, but Build.VERSION.SDK_INT < Build.VERSION_CODES.O")
+ }
} else {
val enableOreoAutofill = callingActivity.isAutofillServiceSupported
MaterialAlertDialogBuilder(callingActivity).run {
@@ -710,14 +731,32 @@ class UserPreference : AppCompatActivity() {
File("$filesDir/.ssh_key").writeText(lines.joinToString("\n"))
}
- private val isAccessibilityServiceEnabled: Boolean
+ private val isAccessibilityAutofillServiceEnabled: Boolean
get() {
val am = getSystemService<AccessibilityManager>() ?: return false
val runningServices = am
.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC)
return runningServices
- .map { it.id.substringBefore("/") }
- .any { it == BuildConfig.APPLICATION_ID }
+ .mapNotNull { it?.resolveInfo?.serviceInfo }
+ .any { it.packageName == BuildConfig.APPLICATION_ID && it.name == AutofillService::class.java.name }
+ }
+
+ private val isChromeCompatFixServiceEnabled: Boolean
+ get() {
+ val am = getSystemService<AccessibilityManager>() ?: return false
+ val runningServices = am
+ .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC)
+ return runningServices
+ .mapNotNull { it?.resolveInfo?.serviceInfo }
+ .any { it.packageName == BuildConfig.APPLICATION_ID && it.name == ChromeCompatFix::class.java.name }
+ }
+
+ private val isChromeCompatFixServiceSupported: Boolean
+ get() {
+ // Autofill compat mode is only available starting with Android Pie and only makes sense
+ // when used with Autofill enabled.
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) return false
+ return isAutofillServiceEnabled
}
private val isAutofillServiceSupported: Boolean