diff options
| author | Fabian Henneke <FabianHenneke@users.noreply.github.com> | 2020-07-07 17:02:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-07 20:32:57 +0530 |
| commit | d192ab2d9a6f45fb23e3d3f709c144ce1be3a850 (patch) | |
| tree | 7e946de1f3e15db63be9c184d74b49d610c49d09 /app/src/main/java/com/zeapo/pwdstore/UserPreference.kt | |
| parent | 5d170249cdd0050349f40d3a5852a8ba996663bc (diff) | |
| download | HardenedPass-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.kt | 57 |
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 |
