Skip to content

Commit 751ea41

Browse files
[webview_flutter_android] Adds a workaround fix for autofill (#3588)
[webview_flutter_android] Adds a workaround fix for autofill
1 parent 866e348 commit 751ea41

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

packages/webview_flutter/webview_flutter_android/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 3.4.4
22

3+
* Fixes a bug where the native `WebView` wouldn't be traversed for autofill automatically.
34
* Updates minimum Flutter version to 3.3.
45

56
## 3.4.3

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
import android.annotation.SuppressLint;
88
import android.content.Context;
99
import android.hardware.display.DisplayManager;
10+
import android.os.Build;
1011
import android.view.View;
12+
import android.view.ViewParent;
1113
import android.webkit.DownloadListener;
1214
import android.webkit.WebChromeClient;
1315
import android.webkit.WebView;
1416
import android.webkit.WebViewClient;
1517
import androidx.annotation.NonNull;
1618
import androidx.annotation.Nullable;
19+
import io.flutter.embedding.android.FlutterView;
1720
import io.flutter.plugin.common.BinaryMessenger;
1821
import io.flutter.plugin.platform.PlatformView;
1922
import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewHostApi;
@@ -104,6 +107,35 @@ public View getView() {
104107
@Override
105108
public void dispose() {}
106109

110+
// TODO(bparrishMines): This should be removed once https://github.com/flutter/engine/pull/40771 makes it to stable.
111+
// Temporary fix for https://github.com/flutter/flutter/issues/92165. The FlutterView is setting
112+
// setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS) which prevents this
113+
// view from automatically being traversed for autofill.
114+
@Override
115+
protected void onAttachedToWindow() {
116+
super.onAttachedToWindow();
117+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
118+
final FlutterView flutterView = tryFindFlutterView();
119+
if (flutterView != null) {
120+
flutterView.setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
121+
}
122+
}
123+
}
124+
125+
// Attempt to traverse the parents of this view until a FlutterView is found.
126+
private FlutterView tryFindFlutterView() {
127+
ViewParent currentView = this;
128+
129+
while (currentView.getParent() != null) {
130+
currentView = currentView.getParent();
131+
if (currentView instanceof FlutterView) {
132+
return (FlutterView) currentView;
133+
}
134+
}
135+
136+
return null;
137+
}
138+
107139
@Override
108140
public void setWebViewClient(WebViewClient webViewClient) {
109141
super.setWebViewClient(webViewClient);

packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,22 @@
1010
import static org.mockito.ArgumentMatchers.any;
1111
import static org.mockito.ArgumentMatchers.eq;
1212
import static org.mockito.Mockito.mock;
13+
import static org.mockito.Mockito.spy;
1314
import static org.mockito.Mockito.verify;
1415
import static org.mockito.Mockito.when;
1516

1617
import android.content.Context;
18+
import android.os.Build;
19+
import android.view.View;
1720
import android.webkit.DownloadListener;
1821
import android.webkit.ValueCallback;
1922
import android.webkit.WebChromeClient;
2023
import android.webkit.WebViewClient;
24+
import io.flutter.embedding.android.FlutterView;
2125
import io.flutter.plugin.common.BinaryMessenger;
2226
import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewFlutterApi;
2327
import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.WebViewPlatformView;
28+
import io.flutter.plugins.webviewflutter.utils.TestUtils;
2429
import java.util.HashMap;
2530
import java.util.Objects;
2631
import org.junit.After;
@@ -335,4 +340,19 @@ public void flutterApiCreate() {
335340

336341
instanceManager.close();
337342
}
343+
344+
@Test
345+
public void setImportantForAutofillForParentFlutterView() {
346+
final WebViewPlatformView webView =
347+
new WebViewPlatformView(mockContext, mockBinaryMessenger, testInstanceManager);
348+
349+
final WebViewPlatformView webViewSpy = spy(webView);
350+
final FlutterView mockFlutterView = mock(FlutterView.class);
351+
when(webViewSpy.getParent()).thenReturn(mockFlutterView);
352+
353+
TestUtils.setFinalStatic(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.O);
354+
webViewSpy.onAttachedToWindow();
355+
356+
verify(mockFlutterView).setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_YES);
357+
}
338358
}

packages/webview_flutter/webview_flutter_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_android
22
description: A Flutter plugin that provides a WebView widget on Android.
33
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 3.4.3
5+
version: 3.4.4
66

77
environment:
88
sdk: ">=2.18.0 <4.0.0"

0 commit comments

Comments
 (0)