diff --git a/android/app/src/main/kotlin/io/openim/flutter/openim/MainActivity.kt b/android/app/src/main/kotlin/io/openim/flutter/openim/MainActivity.kt index 3a3ad4a..817ac74 100644 --- a/android/app/src/main/kotlin/io/openim/flutter/openim/MainActivity.kt +++ b/android/app/src/main/kotlin/io/openim/flutter/openim/MainActivity.kt @@ -13,6 +13,8 @@ import android.os.Build import android.provider.MediaStore import android.util.Base64 import android.util.Log +import android.view.View +import android.view.ViewGroup import androidx.core.content.FileProvider import io.flutter.embedding.android.FlutterActivity import org.conscrypt.Conscrypt @@ -41,6 +43,12 @@ class MainActivity : FlutterActivity() { Log.w(TAG, "Conscrypt provider install failed: ${e.message}") } super.onCreate(savedInstanceState) + installAutofillBlocker() + } + + override fun onResume() { + super.onResume() + disableAutofillForCurrentWindow() } override fun configureFlutterEngine(flutterEngine: FlutterEngine) { @@ -264,6 +272,36 @@ class MainActivity : FlutterActivity() { ) } + private fun installAutofillBlocker() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return + } + + disableAutofillForCurrentWindow() + window.decorView.viewTreeObserver.addOnGlobalLayoutListener { + disableAutofillForCurrentWindow() + } + } + + private fun disableAutofillForCurrentWindow() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return + } + disableAutofill(window.decorView) + } + + private fun disableAutofill(view: View) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + view.importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS + } + + if (view is ViewGroup) { + for (index in 0 until view.childCount) { + disableAutofill(view.getChildAt(index)) + } + } + } + private fun normalizeMimeTypes(acceptTypes: List): List { val mimeTypes = linkedSetOf() acceptTypes