Skip to content

Commit 8c73517

Browse files
committed
Fix RequiresFeature lint: setPaymentRequestEnabled should only be called if the feature PAYMENT_REQUEST is present
Ensures the function works correctly even when called without prior WebViewFeature.isFeatureSupported check. ref. https://developers.google.com/pay/api/android/guides/recipes/using-android-webview#enable-payment-request-api
1 parent 103e29f commit 8c73517

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.webkit.WebSettings;
88
import androidx.annotation.NonNull;
99
import androidx.webkit.WebSettingsCompat;
10+
import androidx.webkit.WebViewFeature;
1011

1112
/**
1213
* Host api implementation for {@link WebSettingsCompat}.
@@ -20,6 +21,8 @@ public WebSettingsCompatProxyApi(@NonNull ProxyApiRegistrar pigeonRegistrar) {
2021

2122
@Override
2223
public void setPaymentRequestEnabled(@NonNull WebSettings webSettings, boolean enabled) {
23-
WebSettingsCompat.setPaymentRequestEnabled(webSettings, enabled);
24+
if (WebViewFeature.isFeatureSupported(WebViewFeature.PAYMENT_REQUEST)) {
25+
WebSettingsCompat.setPaymentRequestEnabled(webSettings, enabled);
26+
}
2427
}
2528
}

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,51 @@
77
import static org.junit.Assert.fail;
88
import static org.mockito.Mockito.mock;
99
import static org.mockito.Mockito.mockStatic;
10+
import static org.mockito.Mockito.never;
1011

1112
import android.webkit.WebSettings;
1213
import androidx.webkit.WebSettingsCompat;
14+
import androidx.webkit.WebViewFeature;
15+
1316
import org.junit.Test;
1417
import org.mockito.MockedStatic;
1518

1619
public class WebSettingsCompatTest {
1720
@Test
18-
public void setPaymentRequestEnabled() {
21+
public void setPaymentRequestEnabled_PAYMENT_REQUEST_is_supported() {
1922
final PigeonApiWebSettingsCompat api =
2023
new TestProxyApiRegistrar().getPigeonApiWebSettingsCompat();
2124

2225
final WebSettings webSettings = mock(WebSettings.class);
26+
27+
try (MockedStatic<WebSettingsCompat> mockedStatic = mockStatic(WebSettingsCompat.class)) {
28+
try(MockedStatic<WebViewFeature> mockedWebViewFeature = mockStatic(WebViewFeature.class)) {
29+
mockedWebViewFeature.when(() -> WebViewFeature.isFeatureSupported(WebViewFeature.PAYMENT_REQUEST)).thenReturn(true);
30+
api.setPaymentRequestEnabled(webSettings, true);
31+
mockedStatic.verify(() -> WebSettingsCompat.setPaymentRequestEnabled(webSettings, true));
32+
} catch (Exception e) {
33+
fail(e.toString());
34+
}
35+
} catch (Exception e) {
36+
fail(e.toString());
37+
}
38+
}
39+
40+
@Test
41+
public void setPaymentRequestEnabled_PAYMENT_REQUEST_is_NOT_supported() {
42+
final PigeonApiWebSettingsCompat api =
43+
new TestProxyApiRegistrar().getPigeonApiWebSettingsCompat();
44+
45+
final WebSettings webSettings = mock(WebSettings.class);
46+
2347
try (MockedStatic<WebSettingsCompat> mockedStatic = mockStatic(WebSettingsCompat.class)) {
24-
api.setPaymentRequestEnabled(webSettings, true);
25-
mockedStatic.verify(() -> WebSettingsCompat.setPaymentRequestEnabled(webSettings, true));
48+
try(MockedStatic<WebViewFeature> mockedWebViewFeature = mockStatic(WebViewFeature.class)) {
49+
mockedWebViewFeature.when(() -> WebViewFeature.isFeatureSupported(WebViewFeature.PAYMENT_REQUEST)).thenReturn(false);
50+
api.setPaymentRequestEnabled(webSettings, true);
51+
mockedStatic.verify(() -> WebSettingsCompat.setPaymentRequestEnabled(webSettings, true), never());
52+
} catch (Exception e) {
53+
fail(e.toString());
54+
}
2655
} catch (Exception e) {
2756
fail(e.toString());
2857
}

0 commit comments

Comments
 (0)