From 681c557e9ef174543c290aff4346a52326ba3950 Mon Sep 17 00:00:00 2001 From: Fabian Henneke Date: Tue, 14 Jul 2020 11:30:29 +0200 Subject: Revert "Work around Chrome Autofill issue (#921)" (#933) --- .../main/java/com/zeapo/pwdstore/UserPreference.kt | 57 +++---------- .../pwdstore/autofill/oreo/ChromeCompatFix.kt | 94 ---------------------- .../com/zeapo/pwdstore/utils/PreferenceKeys.kt | 1 - 3 files changed, 9 insertions(+), 143 deletions(-) delete mode 100644 app/src/main/java/com/zeapo/pwdstore/autofill/oreo/ChromeCompatFix.kt (limited to 'app/src/main/java/com/zeapo') diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt index 950b6523..f713ad26 100644 --- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt +++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt @@ -41,9 +41,7 @@ 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 @@ -72,7 +70,6 @@ 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 private lateinit var oreoAutofillDependencies: List @@ -118,7 +115,6 @@ class UserPreference : AppCompatActivity() { // Autofill preferences autoFillEnablePreference = findPreference(PreferenceKeys.AUTOFILL_ENABLE) - oreoAutofillChromeCompatFix = findPreference(PreferenceKeys.OREO_AUTOFILL_CHROME_COMPAT_FIX) val oreoAutofillDirectoryStructurePreference = findPreference(PreferenceKeys.OREO_AUTOFILL_DIRECTORY_STRUCTURE) val oreoAutofillDefaultUsername = findPreference(PreferenceKeys.OREO_AUTOFILL_DEFAULT_USERNAME) val oreoAutofillCustomPublixSuffixes = findPreference(PreferenceKeys.OREO_AUTOFILL_CUSTOM_PUBLIC_SUFFIXES) @@ -277,16 +273,6 @@ 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(PreferenceKeys.EXPORT_PASSWORDS)?.apply { isVisible = sharedPreferences.getBoolean(PreferenceKeys.REPOSITORY_INITIALIZED, false) onPreferenceClickListener = Preference.OnPreferenceClickListener { @@ -409,20 +395,16 @@ class UserPreference : AppCompatActivity() { } private fun updateAutofillSettings() { - val isAccessibilityAutofillServiceEnabled = callingActivity.isAccessibilityAutofillServiceEnabled + val isAccessibilityServiceEnabled = callingActivity.isAccessibilityServiceEnabled val isAutofillServiceEnabled = callingActivity.isAutofillServiceEnabled autoFillEnablePreference?.isChecked = - isAccessibilityAutofillServiceEnabled || isAutofillServiceEnabled + isAccessibilityServiceEnabled || isAutofillServiceEnabled autofillDependencies.forEach { - it.isVisible = isAccessibilityAutofillServiceEnabled + it.isVisible = isAccessibilityServiceEnabled } oreoAutofillDependencies.forEach { it.isVisible = isAutofillServiceEnabled } - oreoAutofillChromeCompatFix?.apply { - isChecked = callingActivity.isChromeCompatFixServiceEnabled - isVisible = callingActivity.isChromeCompatFixServiceSupported - } } private fun updateClearSavedPassphrasePrefs() { @@ -443,16 +425,13 @@ class UserPreference : AppCompatActivity() { } private fun onEnableAutofillClick() { - if (callingActivity.isAccessibilityAutofillServiceEnabled) { + if (callingActivity.isAccessibilityServiceEnabled) { 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() - ChromeCompatFix.setStatusInPreferences(requireContext(), false) - updateAutofillSettings() - } else { + else throw IllegalStateException("isAutofillServiceEnabled == true, but Build.VERSION.SDK_INT < Build.VERSION_CODES.O") - } } else { val enableOreoAutofill = callingActivity.isAutofillServiceSupported MaterialAlertDialogBuilder(callingActivity).run { @@ -744,32 +723,14 @@ class UserPreference : AppCompatActivity() { File("$filesDir/.ssh_key").writeText(lines.joinToString("\n")) } - private val isAccessibilityAutofillServiceEnabled: Boolean + private val isAccessibilityServiceEnabled: Boolean get() { val am = getSystemService() ?: return false val runningServices = am .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC) return runningServices - .mapNotNull { it?.resolveInfo?.serviceInfo } - .any { it.packageName == BuildConfig.APPLICATION_ID && it.name == AutofillService::class.java.name } - } - - private val isChromeCompatFixServiceEnabled: Boolean - get() { - val am = getSystemService() ?: 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 + .map { it.id.substringBefore("/") } + .any { it == BuildConfig.APPLICATION_ID } } private val isAutofillServiceSupported: Boolean diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/ChromeCompatFix.kt b/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/ChromeCompatFix.kt deleted file mode 100644 index d1f81c0c..00000000 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/oreo/ChromeCompatFix.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -package com.zeapo.pwdstore.autofill.oreo - -import android.accessibilityservice.AccessibilityService -import android.content.Context -import android.content.SharedPreferences -import android.os.Build -import android.os.Handler -import android.os.Looper -import android.view.accessibility.AccessibilityEvent -import androidx.annotation.RequiresApi -import androidx.core.content.edit -import androidx.preference.PreferenceManager -import com.github.ajalt.timberkt.i -import com.github.ajalt.timberkt.v -import com.github.ajalt.timberkt.w -import com.zeapo.pwdstore.utils.PreferenceKeys -import com.zeapo.pwdstore.utils.autofillManager - -@RequiresApi(Build.VERSION_CODES.P) -class ChromeCompatFix : AccessibilityService() { - - companion object { - - fun setStatusInPreferences(context: Context, enabled: Boolean) { - PreferenceManager.getDefaultSharedPreferences(context).edit { - putBoolean(PreferenceKeys.OREO_AUTOFILL_CHROME_COMPAT_FIX, enabled) - } - } - } - - private val isEnabledInPreferences - get() = PreferenceManager.getDefaultSharedPreferences(this).getBoolean(PreferenceKeys.OREO_AUTOFILL_CHROME_COMPAT_FIX, true) - - private val handler = Handler(Looper.getMainLooper()) - private val forceRootNodePopulation = Runnable { - val rootPackageName = rootInActiveWindow?.packageName.toString() - v { "$rootPackageName: forced root node population" } - } - private val disableListener = SharedPreferences.OnSharedPreferenceChangeListener { prefs: SharedPreferences, key: String -> - if (key != PreferenceKeys.OREO_AUTOFILL_CHROME_COMPAT_FIX) - return@OnSharedPreferenceChangeListener - if (!isEnabledInPreferences) { - i { "Disabled in settings, shutting down..." } - disableSelf() - } - } - - override fun onAccessibilityEvent(event: AccessibilityEvent) { - handler.removeCallbacks(forceRootNodePopulation) - when (event.eventType) { - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED, AccessibilityEvent.TYPE_ANNOUNCEMENT -> { - // WINDOW_STATE_CHANGED: Triggered on long press in a text field, replacement for - // the missing Autofill action menu item. - // ANNOUNCEMENT: Triggered when a password field is selected. - // - // These events are triggered only by user actions and thus don't need to be handled - // with debounce. However, they only trigger Autofill popups on the *next* input - // field selected by the user. - forceRootNodePopulation.run() - v { "${event.packageName} (${AccessibilityEvent.eventTypeToString(event.eventType)}): forced root node population" } - } - AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED -> { - // WINDOW_CONTENT_CHANGED: Triggered whenever the page contents change. - // - // This event is triggered many times during page load, which makes a debounce - // necessary to prevent huge performance regressions in Chrome. However, it is the - // only event that reliably runs before the user selects a text field. - handler.postDelayed(forceRootNodePopulation, 300) - v { "${event.packageName} (${AccessibilityEvent.eventTypeToString(event.eventType)}): debounced root node population" } - } - } - } - - override fun onServiceConnected() { - super.onServiceConnected() - // Allow the service to be activated only if the Autofill service is already enabled. - if (autofillManager?.hasEnabledAutofillServices() != true) { - w { "Autofill service not enabled, shutting down..." } - disableSelf() - return - } - // Update preferences if the user manually activated the service. - setStatusInPreferences(this, true) - - PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(disableListener) - } - - override fun onInterrupt() {} -} - diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt b/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt index 3fb05724..3235c7fc 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt @@ -40,7 +40,6 @@ object PreferenceKeys { const val OPENPGP_KEY_IDS_SET = "openpgp_key_ids_set" const val OPENPGP_KEY_ID_PREF = "openpgp_key_id_pref" const val OPENPGP_PROVIDER_LIST = "openpgp_provider_list" - const val OREO_AUTOFILL_CHROME_COMPAT_FIX = "oreo_autofill_chrome_compat_fix" const val OREO_AUTOFILL_CUSTOM_PUBLIC_SUFFIXES = "oreo_autofill_custom_public_suffixes" const val OREO_AUTOFILL_DEFAULT_USERNAME = "oreo_autofill_default_username" const val OREO_AUTOFILL_DIRECTORY_STRUCTURE = "oreo_autofill_directory_structure" -- cgit v1.2.3