Skip to content

Commit d098b47

Browse files
committed
Expose wrappers
1 parent 1a01f13 commit d098b47

File tree

6 files changed

+325
-0
lines changed

6 files changed

+325
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.webviewflutter;
6+
7+
import android.webkit.WebSettings;
8+
import androidx.annotation.NonNull;
9+
import androidx.webkit.WebSettingsCompat;
10+
11+
/**
12+
* Host api implementation for {@link WebSettingsCompat}.
13+
*
14+
* <p>Handles static methods for {@link WebSettingsCompat}.
15+
*/
16+
public class WebSettingsCompatProxyApi extends PigeonApiWebSettingsCompat {
17+
public WebSettingsCompatProxyApi(@NonNull ProxyApiRegistrar pigeonRegistrar) {
18+
super(pigeonRegistrar);
19+
}
20+
21+
@Override
22+
public void setPaymentRequestEnabled(@NonNull WebSettings webSettings, boolean enabled) {
23+
WebSettingsCompat.setPaymentRequestEnabled(webSettings, enabled);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package io.flutter.plugins.webviewflutter;
6+
7+
import androidx.annotation.NonNull;
8+
import androidx.webkit.WebViewFeature;
9+
10+
/**
11+
* Host api implementation for {@link WebViewFeature}.
12+
*
13+
* <p>Handles creating {@link WebViewFeature}s that intercommunicate with a paired Dart object.
14+
*/
15+
public class WebViewFeatureProxyApi extends PigeonApiWebViewFeature {
16+
public WebViewFeatureProxyApi(@NonNull ProxyApiRegistrar pigeonRegistrar) {
17+
super(pigeonRegistrar);
18+
}
19+
20+
@Override
21+
public boolean isFeatureSupported(@NonNull String feature) {
22+
return WebViewFeature.isFeatureSupported(feature);
23+
}
24+
}

packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class AndroidWebViewProxy {
2626
this.instanceCookieManager = _instanceCookieManager,
2727
this.instanceFlutterAssetManager = _instanceFlutterAssetManager,
2828
this.instanceWebStorage = _instanceWebStorage,
29+
this.isWebViewFeatureSupported = WebViewFeature.isFeatureSupported,
30+
this.setPaymentRequestEnabled = WebSettingsCompat.setPaymentRequestEnabled,
2931
});
3032

3133
/// Constructs [WebView].
@@ -168,6 +170,12 @@ class AndroidWebViewProxy {
168170
/// Calls to [WebStorage.instance].
169171
final WebStorage Function() instanceWebStorage;
170172

173+
/// Calls to [WebViewFeature.isFeatureSupported].
174+
final Future<bool> Function(String) isWebViewFeatureSupported;
175+
176+
/// Calls to [WebSettingsCompat.setPaymentRequestEnabled].
177+
final Future<void> Function(WebSettings, bool) setPaymentRequestEnabled;
178+
171179
static CookieManager _instanceCookieManager() => CookieManager.instance;
172180

173181
static FlutterAssetManager _instanceFlutterAssetManager() =>

packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ class PigeonInstanceManager {
196196
pigeon_instanceManager: instanceManager);
197197
Certificate.pigeon_setUpMessageHandlers(
198198
pigeon_instanceManager: instanceManager);
199+
WebSettingsCompat.pigeon_setUpMessageHandlers(
200+
pigeon_instanceManager: instanceManager);
201+
WebViewFeature.pigeon_setUpMessageHandlers(
202+
pigeon_instanceManager: instanceManager);
199203
return instanceManager;
200204
}
201205

@@ -8349,3 +8353,222 @@ class Certificate extends PigeonInternalProxyApiBaseClass {
83498353
);
83508354
}
83518355
}
8356+
8357+
class WebSettingsCompat extends PigeonInternalProxyApiBaseClass {
8358+
/// Constructs [WebSettingsCompat] without creating the associated native object.
8359+
///
8360+
/// This should only be used by subclasses created by this library or to
8361+
/// create copies for an [PigeonInstanceManager].
8362+
@protected
8363+
WebSettingsCompat.pigeon_detached({
8364+
super.pigeon_binaryMessenger,
8365+
super.pigeon_instanceManager,
8366+
});
8367+
8368+
late final _PigeonInternalProxyApiBaseCodec
8369+
_pigeonVar_codecWebSettingsCompat =
8370+
_PigeonInternalProxyApiBaseCodec(pigeon_instanceManager);
8371+
8372+
static void pigeon_setUpMessageHandlers({
8373+
bool pigeon_clearHandlers = false,
8374+
BinaryMessenger? pigeon_binaryMessenger,
8375+
PigeonInstanceManager? pigeon_instanceManager,
8376+
WebSettingsCompat Function()? pigeon_newInstance,
8377+
}) {
8378+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
8379+
_PigeonInternalProxyApiBaseCodec(
8380+
pigeon_instanceManager ?? PigeonInstanceManager.instance);
8381+
final BinaryMessenger? binaryMessenger = pigeon_binaryMessenger;
8382+
{
8383+
final BasicMessageChannel<
8384+
Object?> pigeonVar_channel = BasicMessageChannel<
8385+
Object?>(
8386+
'dev.flutter.pigeon.webview_flutter_android.WebSettingsCompat.pigeon_newInstance',
8387+
pigeonChannelCodec,
8388+
binaryMessenger: binaryMessenger);
8389+
if (pigeon_clearHandlers) {
8390+
pigeonVar_channel.setMessageHandler(null);
8391+
} else {
8392+
pigeonVar_channel.setMessageHandler((Object? message) async {
8393+
assert(message != null,
8394+
'Argument for dev.flutter.pigeon.webview_flutter_android.WebSettingsCompat.pigeon_newInstance was null.');
8395+
final List<Object?> args = (message as List<Object?>?)!;
8396+
final int? arg_pigeon_instanceIdentifier = (args[0] as int?);
8397+
assert(arg_pigeon_instanceIdentifier != null,
8398+
'Argument for dev.flutter.pigeon.webview_flutter_android.WebSettingsCompat.pigeon_newInstance was null, expected non-null int.');
8399+
try {
8400+
(pigeon_instanceManager ?? PigeonInstanceManager.instance)
8401+
.addHostCreatedInstance(
8402+
pigeon_newInstance?.call() ??
8403+
WebSettingsCompat.pigeon_detached(
8404+
pigeon_binaryMessenger: pigeon_binaryMessenger,
8405+
pigeon_instanceManager: pigeon_instanceManager,
8406+
),
8407+
arg_pigeon_instanceIdentifier!,
8408+
);
8409+
return wrapResponse(empty: true);
8410+
} on PlatformException catch (e) {
8411+
return wrapResponse(error: e);
8412+
} catch (e) {
8413+
return wrapResponse(
8414+
error: PlatformException(code: 'error', message: e.toString()));
8415+
}
8416+
});
8417+
}
8418+
}
8419+
}
8420+
8421+
static Future<void> setPaymentRequestEnabled(
8422+
WebSettings webSettings,
8423+
bool enabled, {
8424+
BinaryMessenger? pigeon_binaryMessenger,
8425+
PigeonInstanceManager? pigeon_instanceManager,
8426+
}) async {
8427+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
8428+
_PigeonInternalProxyApiBaseCodec(
8429+
pigeon_instanceManager ?? PigeonInstanceManager.instance);
8430+
final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger;
8431+
const String pigeonVar_channelName =
8432+
'dev.flutter.pigeon.webview_flutter_android.WebSettingsCompat.setPaymentRequestEnabled';
8433+
final BasicMessageChannel<Object?> pigeonVar_channel =
8434+
BasicMessageChannel<Object?>(
8435+
pigeonVar_channelName,
8436+
pigeonChannelCodec,
8437+
binaryMessenger: pigeonVar_binaryMessenger,
8438+
);
8439+
final Future<Object?> pigeonVar_sendFuture =
8440+
pigeonVar_channel.send(<Object?>[webSettings, enabled]);
8441+
final List<Object?>? pigeonVar_replyList =
8442+
await pigeonVar_sendFuture as List<Object?>?;
8443+
if (pigeonVar_replyList == null) {
8444+
throw _createConnectionError(pigeonVar_channelName);
8445+
} else if (pigeonVar_replyList.length > 1) {
8446+
throw PlatformException(
8447+
code: pigeonVar_replyList[0]! as String,
8448+
message: pigeonVar_replyList[1] as String?,
8449+
details: pigeonVar_replyList[2],
8450+
);
8451+
} else {
8452+
return;
8453+
}
8454+
}
8455+
8456+
@override
8457+
WebSettingsCompat pigeon_copy() {
8458+
return WebSettingsCompat.pigeon_detached(
8459+
pigeon_binaryMessenger: pigeon_binaryMessenger,
8460+
pigeon_instanceManager: pigeon_instanceManager,
8461+
);
8462+
}
8463+
}
8464+
8465+
class WebViewFeature extends PigeonInternalProxyApiBaseClass {
8466+
/// Constructs [WebViewFeature] without creating the associated native object.
8467+
///
8468+
/// This should only be used by subclasses created by this library or to
8469+
/// create copies for an [PigeonInstanceManager].
8470+
@protected
8471+
WebViewFeature.pigeon_detached({
8472+
super.pigeon_binaryMessenger,
8473+
super.pigeon_instanceManager,
8474+
});
8475+
8476+
late final _PigeonInternalProxyApiBaseCodec _pigeonVar_codecWebViewFeature =
8477+
_PigeonInternalProxyApiBaseCodec(pigeon_instanceManager);
8478+
8479+
static void pigeon_setUpMessageHandlers({
8480+
bool pigeon_clearHandlers = false,
8481+
BinaryMessenger? pigeon_binaryMessenger,
8482+
PigeonInstanceManager? pigeon_instanceManager,
8483+
WebViewFeature Function()? pigeon_newInstance,
8484+
}) {
8485+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
8486+
_PigeonInternalProxyApiBaseCodec(
8487+
pigeon_instanceManager ?? PigeonInstanceManager.instance);
8488+
final BinaryMessenger? binaryMessenger = pigeon_binaryMessenger;
8489+
{
8490+
final BasicMessageChannel<
8491+
Object?> pigeonVar_channel = BasicMessageChannel<
8492+
Object?>(
8493+
'dev.flutter.pigeon.webview_flutter_android.WebViewFeature.pigeon_newInstance',
8494+
pigeonChannelCodec,
8495+
binaryMessenger: binaryMessenger);
8496+
if (pigeon_clearHandlers) {
8497+
pigeonVar_channel.setMessageHandler(null);
8498+
} else {
8499+
pigeonVar_channel.setMessageHandler((Object? message) async {
8500+
assert(message != null,
8501+
'Argument for dev.flutter.pigeon.webview_flutter_android.WebViewFeature.pigeon_newInstance was null.');
8502+
final List<Object?> args = (message as List<Object?>?)!;
8503+
final int? arg_pigeon_instanceIdentifier = (args[0] as int?);
8504+
assert(arg_pigeon_instanceIdentifier != null,
8505+
'Argument for dev.flutter.pigeon.webview_flutter_android.WebViewFeature.pigeon_newInstance was null, expected non-null int.');
8506+
try {
8507+
(pigeon_instanceManager ?? PigeonInstanceManager.instance)
8508+
.addHostCreatedInstance(
8509+
pigeon_newInstance?.call() ??
8510+
WebViewFeature.pigeon_detached(
8511+
pigeon_binaryMessenger: pigeon_binaryMessenger,
8512+
pigeon_instanceManager: pigeon_instanceManager,
8513+
),
8514+
arg_pigeon_instanceIdentifier!,
8515+
);
8516+
return wrapResponse(empty: true);
8517+
} on PlatformException catch (e) {
8518+
return wrapResponse(error: e);
8519+
} catch (e) {
8520+
return wrapResponse(
8521+
error: PlatformException(code: 'error', message: e.toString()));
8522+
}
8523+
});
8524+
}
8525+
}
8526+
}
8527+
8528+
static Future<bool> isFeatureSupported(
8529+
String feature, {
8530+
BinaryMessenger? pigeon_binaryMessenger,
8531+
PigeonInstanceManager? pigeon_instanceManager,
8532+
}) async {
8533+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
8534+
_PigeonInternalProxyApiBaseCodec(
8535+
pigeon_instanceManager ?? PigeonInstanceManager.instance);
8536+
final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger;
8537+
const String pigeonVar_channelName =
8538+
'dev.flutter.pigeon.webview_flutter_android.WebViewFeature.isFeatureSupported';
8539+
final BasicMessageChannel<Object?> pigeonVar_channel =
8540+
BasicMessageChannel<Object?>(
8541+
pigeonVar_channelName,
8542+
pigeonChannelCodec,
8543+
binaryMessenger: pigeonVar_binaryMessenger,
8544+
);
8545+
final Future<Object?> pigeonVar_sendFuture =
8546+
pigeonVar_channel.send(<Object?>[feature]);
8547+
final List<Object?>? pigeonVar_replyList =
8548+
await pigeonVar_sendFuture as List<Object?>?;
8549+
if (pigeonVar_replyList == null) {
8550+
throw _createConnectionError(pigeonVar_channelName);
8551+
} else if (pigeonVar_replyList.length > 1) {
8552+
throw PlatformException(
8553+
code: pigeonVar_replyList[0]! as String,
8554+
message: pigeonVar_replyList[1] as String?,
8555+
details: pigeonVar_replyList[2],
8556+
);
8557+
} else if (pigeonVar_replyList[0] == null) {
8558+
throw PlatformException(
8559+
code: 'null-error',
8560+
message: 'Host platform returned null value for non-null return value.',
8561+
);
8562+
} else {
8563+
return (pigeonVar_replyList[0] as bool?)!;
8564+
}
8565+
}
8566+
8567+
@override
8568+
WebViewFeature pigeon_copy() {
8569+
return WebViewFeature.pigeon_detached(
8570+
pigeon_binaryMessenger: pigeon_binaryMessenger,
8571+
pigeon_instanceManager: pigeon_instanceManager,
8572+
);
8573+
}
8574+
}

packages/webview_flutter/webview_flutter_android/lib/src/android_webkit_constants.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,14 @@ class WebViewClientConstants {
117117
/// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSUPPORTED_SCHEME
118118
static const int errorUnsupportedScheme = -10;
119119
}
120+
121+
/// Class constants for [WebViewFeature].
122+
///
123+
/// Since the Dart [WebViewFeature] is generated, the constants for the class
124+
/// are added here.
125+
class WebViewFeatureConstants {
126+
/// This feature covers [WebSettingsCompat.setPaymentRequestEnabled].
127+
///
128+
/// See https://developer.android.com/reference/androidx/webkit/WebViewFeature#PAYMENT_REQUEST.
129+
static const String paymentRequest = 'PAYMENT_REQUEST';
130+
}

packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,34 @@ class AndroidWebViewController extends PlatformWebViewController {
781781
};
782782
return _webView.settings.setMixedContentMode(androidMode);
783783
}
784+
785+
/// Checks if a WebView feature is supported on the current device.
786+
///
787+
/// This method uses [android_webview.WebViewFeature.isFeatureSupported] to check
788+
/// if the specified WebView feature is available on the current device and WebView version.
789+
///
790+
/// See [WebViewFeatureConstants] for available feature constants.
791+
Future<bool> isWebViewFeatureSupported(WebViewFeatureType featureType) {
792+
final String feature = switch (featureType) {
793+
WebViewFeatureType.paymentRequest =>
794+
WebViewFeatureConstants.paymentRequest,
795+
};
796+
return _androidWebViewParams.androidWebViewProxy.isWebViewFeatureSupported(feature);
797+
}
798+
799+
/// Sets whether the WebView should enable the Payment Request API.
800+
///
801+
/// This method uses [android_webview.WebSettingsCompat.setPaymentRequestEnabled]
802+
/// to enable or disable the Payment Request API for the WebView.
803+
///
804+
/// Before calling this method, you should check if the feature is supported using
805+
/// [isWebViewFeatureSupported] with [WebViewFeatureConstants.paymentRequest].
806+
Future<void> setPaymentRequestEnabled(bool enabled) {
807+
return _androidWebViewParams.androidWebViewProxy.setPaymentRequestEnabled(
808+
_webView.settings,
809+
enabled,
810+
);
811+
}
784812
}
785813

786814
/// Android implementation of [PlatformWebViewPermissionRequest].
@@ -909,6 +937,12 @@ enum MixedContentMode {
909937
neverAllow,
910938
}
911939

940+
/// See https://developer.android.com/reference/androidx/webkit/WebViewFeature#constants_1.
941+
enum WebViewFeatureType {
942+
/// Feature for isFeatureSupported. This feature covers setPaymentRequestEnabled, getPaymentRequestEnabled, setHasEnrolledInstrumentEnabled, and getHasEnrolledInstrumentEnabled,
943+
paymentRequest,
944+
}
945+
912946
/// Parameters received when the `WebView` should show a file selector.
913947
@immutable
914948
class FileSelectorParams {

0 commit comments

Comments
 (0)